diff --git a/Source/Geometry/imstkGeometry.cpp b/Source/Geometry/imstkGeometry.cpp index 0f08f9950cbb33f3b18ce846575b3b100334f8ce..1e70f992e902dd1a7768dd9bb7610036ee5da687 100644 --- a/Source/Geometry/imstkGeometry.cpp +++ b/Source/Geometry/imstkGeometry.cpp @@ -270,5 +270,4 @@ Geometry::isVisible() const { return m_isVisible; } - } // imstk diff --git a/Source/Materials/imstkTexture.cpp b/Source/Materials/imstkTexture.cpp index bf7490991c9333b9c3c86d8a627c45799f48cd4e..5be1e4b0e11040a5c6d47537b8b2ac7e4fe061ea 100644 --- a/Source/Materials/imstkTexture.cpp +++ b/Source/Materials/imstkTexture.cpp @@ -58,5 +58,4 @@ Texture::getAnisotropyFactor() { return m_anisotropyFactor; } - } \ No newline at end of file diff --git a/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp b/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp index 9e0464dda281bb73caddfd3dfecfe200b684cdff..706fd2e4146d6225172843f5ed7045e5163e6b0b 100644 --- a/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp +++ b/Source/Rendering/VulkanRenderer/imstkVulkanRenderer.cpp @@ -734,7 +734,7 @@ VulkanRenderer::renderFrame() if (m_renderDelegates[renderDelegateIndex]->getGeometry()->getType() == Geometry::Type::DecalPool || !m_renderDelegates[renderDelegateIndex]->getGeometry()->getRenderMaterial()->getCastsShadows() - || !m_renderDelegates[renderDelegateIndex]->getGeometry()->isVisible()) + || !m_renderDelegates[renderDelegateIndex]->getGeometry()->isVisible()) { continue; } diff --git a/Source/SceneElements/Objects/imstkSceneObject.cpp b/Source/SceneElements/Objects/imstkSceneObject.cpp index 7c9764f39da9e228797e2082f0cc2be76c6a21e8..25d935a22c7a75ab7123d133add398162ed60d5f 100644 --- a/Source/SceneElements/Objects/imstkSceneObject.cpp +++ b/Source/SceneElements/Objects/imstkSceneObject.cpp @@ -67,5 +67,4 @@ SceneObject::setName(const std::string& name) { m_name = name; } - } // imstk diff --git a/Source/SimulationManager/CMakeLists.txt b/Source/SimulationManager/CMakeLists.txt index 038d56e49da3284dd6d2bb2c20ed79d5063cc9bc..c3e89331ee2e82e80b0c1052b7dc5590d124f0d6 100644 --- a/Source/SimulationManager/CMakeLists.txt +++ b/Source/SimulationManager/CMakeLists.txt @@ -14,13 +14,13 @@ set(VTK_CPP_FILES set(VULKAN_H_FILES VulkanRenderer/imstkVulkanInteractorStyle.h - VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h + VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h VulkanRenderer/imstkVulkanScreenCaptureUtility.h VulkanRenderer/imstkVulkanViewer.h) set(VULKAN_CPP_FILES VulkanRenderer/imstkVulkanInteractorStyle.cpp - VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp + VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp VulkanRenderer/imstkVulkanScreenCaptureUtility.cpp VulkanRenderer/imstkVulkanViewer.cpp) diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp index 3be52b8a6ddfac2ed0a58f5fe150b5626144efb3..385d53f99ae4ea4ab530753bc3c335264eb91f00 100644 --- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp +++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.cpp @@ -40,6 +40,8 @@ VulkanInteractorStyle::OnTimer() { return; } + + VulkanBaseInteractorStyle::OnTimer(); } void @@ -82,11 +84,11 @@ VulkanInteractorStyle::OnChar(int keyID, int type) } } else if (status != SimulationStatus::INACTIVE && - (key == 'q' || key == 'Q' || key == 'e' || key == 'E')) // end Simulation + (key == 'q' || key == 'Q'))// || key == 'e' || key == 'E')) // end Simulation { m_simManager->endSimulation(); } - else if (key == 'd' || key == 'D') // switch rendering mode + else if (key == 'f' || key == 'F')//(key == 'd' || key == 'D') // switch rendering mode { if (m_simManager->getViewer()->getRenderingMode() != Renderer::Mode::SIMULATION) { diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h index d479ee80a28b70054890c79033ace450f90a07f0..b0889052a086cac192f9c2f572683c610ca97854 100644 --- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h +++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyle.h @@ -24,7 +24,7 @@ #include "GLFW/glfw3.h" -#include "imstkVulkanInteractorStyleTrackballCamera.h" +#include "imstkVulkanInteractorStyleFreeCamera.h" #include "imstkInteractorStyle.h" #include <iostream> @@ -37,7 +37,7 @@ namespace imstk class VulkanInteractorStyle; class VulkanViewer; -using VulkanBaseInteractorStyle = VulkanInteractorStyleTrackballCamera; +using VulkanBaseInteractorStyle = VulkanInteractorStyleFreeCamera; class VulkanInteractorStyle : public VulkanBaseInteractorStyle, public InteractorStyle { diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7e999cd6d1a93c77cc211a71c1694e2b566de67e --- /dev/null +++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.cpp @@ -0,0 +1,320 @@ +/*========================================================================= + + Library: iMSTK + + Copyright (c) Kitware, Inc. & Center for Modeling, Simulation, + & Imaging in Medicine, Rensselaer Polytechnic Institute. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0.txt + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +=========================================================================*/ + +#include "imstkVulkanInteractorStyleFreeCamera.h" + +#include "imstkVulkanViewer.h" +#include "imstkSimulationManager.h" + +namespace imstk +{ +VulkanInteractorStyleFreeCamera::VulkanInteractorStyleFreeCamera() +{ +} + +void +VulkanInteractorStyleFreeCamera::setWindow(GLFWwindow * window, VulkanViewer * viewer) +{ + m_window = window; + m_viewer = viewer; + + m_stopWatch.start(); + glfwSetWindowUserPointer(window, (void *)this); + + glfwSetKeyCallback(m_window, VulkanInteractorStyleFreeCamera::OnCharInterface); + glfwSetMouseButtonCallback(m_window, VulkanInteractorStyleFreeCamera::OnMouseButtonInterface); + glfwSetCursorPosCallback(m_window, VulkanInteractorStyleFreeCamera::OnMouseMoveInterface); + glfwSetScrollCallback(m_window, VulkanInteractorStyleFreeCamera::OnMouseWheelInterface); + glfwSetWindowSizeCallback(m_window, VulkanInteractorStyleFreeCamera::OnWindowResizeInterface); + glfwSetFramebufferSizeCallback(m_window, VulkanInteractorStyleFreeCamera::OnFramebuffersResizeInterface); +} + +void +VulkanInteractorStyleFreeCamera::OnTimer() +{ + float speed = 0.0005f; + + auto camera = m_simManager->getActiveScene()->getCamera(); + + // Initialize certain variables + if (!m_started) + { + m_lastFrameMode = m_viewer->getRenderingMode(); + m_lastTime = m_stopWatch.getTimeElapsed(); + m_mousePosLastNormalized[0] = m_mousePosNormalized[0]; + m_mousePosLastNormalized[1] = m_mousePosNormalized[1]; + m_started = true; + } + + auto currentMode = m_viewer->getRenderingMode(); + + // Detect change to/from simulation and debug mode + if (m_lastFrameMode == Renderer::Mode::SIMULATION) + { + if (currentMode == Renderer::Mode::DEBUG) + { + m_simCameraPosition = camera->getPosition(); + m_simCameraFocalPoint = camera->getFocalPoint(); + camera->setPosition(m_simCameraPosition[0], m_simCameraFocalPoint[1], m_simCameraPosition[2]); + m_cameraAngle = 0; + } + } + else if (m_lastFrameMode = Renderer::Mode::DEBUG) + { + if (currentMode == Renderer::Mode::SIMULATION) + { + camera->setPosition(m_simCameraPosition); + camera->setFocalPoint(m_simCameraFocalPoint); + } + } + + m_lastFrameMode = m_viewer->getRenderingMode(); + + // Extract variables/calculate derivatives + auto pos = camera->getPosition(); + auto fp = camera->getFocalPoint(); + auto dx = m_mousePosNormalized[0] - m_mousePosLastNormalized[0]; + auto dy = m_mousePosNormalized[1] - m_mousePosLastNormalized[1]; + auto direction = Vec3d(pos - fp); + direction.normalize(); + auto yaw = atan2(pos[0] - fp[0], pos[2] - fp[2]); + auto xDirection = Vec3d(cos(yaw), 0, -sin(yaw)); + + auto currentTime = m_stopWatch.getTimeElapsed(); + float dt = currentTime - m_lastTime; // For variable time-step + + // Update for next frame + m_lastTime = currentTime; + m_mousePosLastNormalized[0] = m_mousePosNormalized[0]; + m_mousePosLastNormalized[1] = m_mousePosNormalized[1]; + + // The following is only for movement mode + if (!(m_state & VulkanInteractorStyleFreeCamera::RIGHT_MOUSE_DOWN)) + { + return; + } + + auto angleTempOffset = Vec3d(fp - pos); + auto angleOffset = glm::vec4(angleTempOffset[0], angleTempOffset[1], angleTempOffset[2], 1); + + // Prevents flipping camera at up and down view + float dCameraAngle = -4 * dy; + if (m_cameraAngle + dCameraAngle <= -PI_2 + 0.01) + { + dCameraAngle = -PI_2 - m_cameraAngle + 0.01; + } + else if (m_cameraAngle + dCameraAngle >= PI_2 - 0.01) + { + dCameraAngle = PI_2 - m_cameraAngle - 0.01; + } + m_cameraAngle += dCameraAngle; + + // Rotational offset + auto xRotation = glm::rotate<float>(-4 * dx, glm::tvec3<float>(0.0f, 1.0f, 0.0f)); + auto yRotation = glm::rotate<float>(dCameraAngle, glm::tvec3<float>(xDirection[0], 0, xDirection[2])); + angleOffset = xRotation * yRotation * angleOffset; + angleTempOffset[0] = angleOffset.x; + angleTempOffset[1] = angleOffset.y; + angleTempOffset[2] = angleOffset.z; + + auto offset = Vec3d(0, 0, 0); // Position offset + + // Controls + if (glfwGetKey(m_viewer->m_window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) + { + speed *= 5; + } + if (glfwGetKey(m_viewer->m_window, GLFW_KEY_A) == GLFW_PRESS) + { + offset += xDirection * -speed * dt; + } + if (glfwGetKey(m_viewer->m_window, GLFW_KEY_D) == GLFW_PRESS) + { + offset += xDirection * speed * dt; + } + if (glfwGetKey(m_viewer->m_window, GLFW_KEY_W) == GLFW_PRESS) + { + offset += direction * -speed * dt; + } + if (glfwGetKey(m_viewer->m_window, GLFW_KEY_S) == GLFW_PRESS) + { + offset += direction * speed * dt; + } + + camera->setPosition(pos + offset); + fp = angleTempOffset + camera->getPosition(); + camera->setFocalPoint(fp); +} + +void +VulkanInteractorStyleFreeCamera::OnCharInterface(GLFWwindow * window, int keyID, int code, int type, int extra) +{ + VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window); + style->OnChar(keyID, type); +} + +void +VulkanInteractorStyleFreeCamera::OnMouseButtonInterface(GLFWwindow * window, int buttonID, int type, int extra) +{ + VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window); + + switch (buttonID) + { + case GLFW_MOUSE_BUTTON_LEFT: + if (type == GLFW_PRESS) + { + style->OnLeftButtonDown(); + } + else if (type == GLFW_RELEASE) + { + style->OnLeftButtonUp(); + } + break; + case GLFW_MOUSE_BUTTON_RIGHT: + if (type == GLFW_PRESS) + { + style->OnRightButtonDown(); + } + else if (type == GLFW_RELEASE) + { + style->OnRightButtonUp(); + } + break; + case GLFW_MOUSE_BUTTON_MIDDLE: + if (type == GLFW_PRESS) + { + style->OnMiddleButtonDown(); + } + else if (type == GLFW_RELEASE) + { + style->OnMiddleButtonUp(); + } + break; + } +} + +void +VulkanInteractorStyleFreeCamera::OnMouseMoveInterface(GLFWwindow * window, double x, double y) +{ + VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window); + style->OnMouseMove(x, y); +} + +void +VulkanInteractorStyleFreeCamera::OnMouseWheelInterface(GLFWwindow * window, double x, double y) +{ + VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window); + if (y < 0) + { + style->OnMouseWheelBackward(y); + } + else + { + style->OnMouseWheelForward(y); + } +} + +void +VulkanInteractorStyleFreeCamera::OnChar(int keyID, int type) +{ +} + +void +VulkanInteractorStyleFreeCamera::OnMouseMove(double x, double y) +{ + m_mousePos[0] = x; + m_mousePos[1] = y; + m_mousePosNormalized[0] = x; + m_mousePosNormalized[1] = y; + this->normalizeCoordinate(m_mousePosNormalized[0], m_mousePosNormalized[1]); +} + +void +VulkanInteractorStyleFreeCamera::OnLeftButtonDown() +{ + m_state |= VulkanInteractorStyleFreeCamera::LEFT_MOUSE_DOWN; +} + +void +VulkanInteractorStyleFreeCamera::OnLeftButtonUp() +{ + m_state &= ~VulkanInteractorStyleFreeCamera::LEFT_MOUSE_DOWN; +} + +void +VulkanInteractorStyleFreeCamera::OnMiddleButtonDown() +{ + m_state |= VulkanInteractorStyleFreeCamera::MIDDLE_MOUSE_DOWN; +} + +void VulkanInteractorStyleFreeCamera::OnMiddleButtonUp() +{ + m_state &= ~VulkanInteractorStyleFreeCamera::MIDDLE_MOUSE_DOWN; +} + +void +VulkanInteractorStyleFreeCamera::OnRightButtonDown() +{ + m_state |= VulkanInteractorStyleFreeCamera::RIGHT_MOUSE_DOWN; +} + +void +VulkanInteractorStyleFreeCamera::OnRightButtonUp() +{ + m_state &= ~VulkanInteractorStyleFreeCamera::RIGHT_MOUSE_DOWN; +} + +void +VulkanInteractorStyleFreeCamera::OnMouseWheelForward(double y) +{ +} + +void +VulkanInteractorStyleFreeCamera::OnMouseWheelBackward(double y) +{ +} + +void +VulkanInteractorStyleFreeCamera::OnWindowResizeInterface(GLFWwindow * window, int width, int height) +{ + VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window); +} + +void +VulkanInteractorStyleFreeCamera::OnFramebuffersResizeInterface(GLFWwindow * window, int width, int height) +{ + VulkanInteractorStyleFreeCamera * style = (VulkanInteractorStyleFreeCamera *)glfwGetWindowUserPointer(window); + style->OnWindowResize(width, height); +} + +void +VulkanInteractorStyleFreeCamera::OnWindowResize(int width, int height) +{ + m_viewer->resizeWindow(width, height); +} + +void +VulkanInteractorStyleFreeCamera::normalizeCoordinate(double &x, double &y) +{ + x = (x - m_viewer->m_width / 2) / m_viewer->m_width; + y = (y - m_viewer->m_height / 2) / m_viewer->m_height; +} +} \ No newline at end of file diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h similarity index 66% rename from Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h rename to Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h index 3171fb7a1f9d6163daa701735a06b8f63fe68060..a1b49e046741c71f534f75993d79236ef1334023 100644 --- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.h +++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleFreeCamera.h @@ -19,8 +19,8 @@ =========================================================================*/ -#ifndef imstkVulkanInteractorStyleTrackballCamera_h -#define imstkVulkanInteractorStyleTrackballCamera_h +#ifndef imstkVulkanInteractorStyleFreeCamera_h +#define imstkVulkanInteractorStyleFreeCamera_h #include "GLFW/glfw3.h" @@ -28,16 +28,28 @@ #include <unordered_map> #include <functional> +#include "glm/glm.hpp" +#include "glm/gtx/transform.hpp" + +#include "imstkMath.h" +#include "imstkTimer.h" +#include "imstkRenderer.h" + namespace imstk { class VulkanViewer; class SimulationManager; -class VulkanInteractorStyleTrackballCamera +/// +/// \class VulkanInteractorStyleFreeCamera +/// +/// \brief Default camera movement class +/// +class VulkanInteractorStyleFreeCamera { public: - VulkanInteractorStyleTrackballCamera(); - ~VulkanInteractorStyleTrackballCamera(){}; + VulkanInteractorStyleFreeCamera(); + ~VulkanInteractorStyleFreeCamera(){}; void setWindow(GLFWwindow * window, VulkanViewer * viewer); @@ -67,12 +79,15 @@ public: protected: friend class VulkanViewer; + /// + /// \brief Normalized coordinates in the context of the screen + /// + void normalizeCoordinate(double &x, double &y); + GLFWwindow * m_window; SimulationManager * m_simManager; VulkanViewer * m_viewer; - double distance(double x, double y); - // States enum { @@ -81,11 +96,18 @@ protected: RIGHT_MOUSE_DOWN = 0x4 }; - double m_lastMouseX = 0; - double m_lastMouseY = 0; + double m_mousePos[2]; ///< Mouse position + double m_mousePosNormalized[2]; ///< Mouse position normalized + double m_mousePosLastNormalized[2]; ///< Last frame mouse position normalized + + StopWatch m_stopWatch; + double m_lastTime = 0; ///< Last frame time + Vec3d m_simCameraPosition; ///< Saved simulation mode camera position + Vec3d m_simCameraFocalPoint; ///< Saved simulation mode camera focal point + float m_cameraAngle = 0; ///< Angle created by changes in vertical cursor position + Renderer::Mode m_lastFrameMode = Renderer::Mode::EMPTY; ///< Last frame mode - double m_mouseX = 0; - double m_mouseY = 0; + bool m_started = false; ///< Used to initialized variables unsigned int m_state = 0; }; diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp b/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp deleted file mode 100644 index 62e3988ea8d08d56ccf759ae295a5012c9e5254e..0000000000000000000000000000000000000000 --- a/Source/SimulationManager/VulkanRenderer/imstkVulkanInteractorStyleTrackballCamera.cpp +++ /dev/null @@ -1,259 +0,0 @@ -/*========================================================================= - - Library: iMSTK - - Copyright (c) Kitware, Inc. & Center for Modeling, Simulation, - & Imaging in Medicine, Rensselaer Polytechnic Institute. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0.txt - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -=========================================================================*/ - -#include "imstkVulkanInteractorStyleTrackballCamera.h" - -#include "imstkVulkanViewer.h" -#include "imstkSimulationManager.h" - -namespace imstk -{ -VulkanInteractorStyleTrackballCamera::VulkanInteractorStyleTrackballCamera() -{ -} - -void -VulkanInteractorStyleTrackballCamera::setWindow(GLFWwindow * window, VulkanViewer * viewer) -{ - m_window = window; - m_viewer = viewer; - - glfwSetWindowUserPointer(window, (void *)this); - - glfwSetKeyCallback(m_window, VulkanInteractorStyleTrackballCamera::OnCharInterface); - glfwSetMouseButtonCallback(m_window, VulkanInteractorStyleTrackballCamera::OnMouseButtonInterface); - glfwSetCursorPosCallback(m_window, VulkanInteractorStyleTrackballCamera::OnMouseMoveInterface); - glfwSetScrollCallback(m_window, VulkanInteractorStyleTrackballCamera::OnMouseWheelInterface); - glfwSetWindowSizeCallback(m_window, VulkanInteractorStyleTrackballCamera::OnWindowResizeInterface); - glfwSetFramebufferSizeCallback(m_window, VulkanInteractorStyleTrackballCamera::OnFramebuffersResizeInterface); -} - -void -VulkanInteractorStyleTrackballCamera::OnTimer() -{ -} - -void -VulkanInteractorStyleTrackballCamera::OnCharInterface(GLFWwindow * window, int keyID, int code, int type, int extra) -{ - VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window); - style->OnChar(keyID, type); -} - -void -VulkanInteractorStyleTrackballCamera::OnMouseButtonInterface(GLFWwindow * window, int buttonID, int type, int extra) -{ - VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window); - - switch (buttonID) - { - case GLFW_MOUSE_BUTTON_LEFT: - if (type == GLFW_PRESS) - { - style->OnLeftButtonDown(); - } - else if (type == GLFW_RELEASE) - { - style->OnLeftButtonUp(); - } - break; - case GLFW_MOUSE_BUTTON_RIGHT: - if (type == GLFW_PRESS) - { - style->OnRightButtonDown(); - } - else if (type == GLFW_RELEASE) - { - style->OnRightButtonUp(); - } - break; - case GLFW_MOUSE_BUTTON_MIDDLE: - if (type == GLFW_PRESS) - { - style->OnMiddleButtonDown(); - } - else if (type == GLFW_RELEASE) - { - style->OnMiddleButtonUp(); - } - break; - } -} - -void -VulkanInteractorStyleTrackballCamera::OnMouseMoveInterface(GLFWwindow * window, double x, double y) -{ - VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window); - style->OnMouseMove(x, y); -} - -void -VulkanInteractorStyleTrackballCamera::OnMouseWheelInterface(GLFWwindow * window, double x, double y) -{ - VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window); - if (y < 0) - { - style->OnMouseWheelBackward(y); - } - else - { - style->OnMouseWheelForward(y); - } -} - -void -VulkanInteractorStyleTrackballCamera::OnChar(int keyID, int type) -{ -} - -void -VulkanInteractorStyleTrackballCamera::OnMouseMove(double x, double y) -{ - m_mouseX = (x - m_viewer->m_width / 2) / m_viewer->m_width; - m_mouseY = (y - m_viewer->m_height / 2) / m_viewer->m_height; - auto camera = m_simManager->getActiveScene()->getCamera(); - auto offset = camera->getPosition() - camera->getFocalPoint(); - auto dx = m_mouseX - m_lastMouseX; - auto dy = m_mouseY - m_lastMouseY; - - if (m_state & VulkanInteractorStyleTrackballCamera::LEFT_MOUSE_DOWN) - { - double strength = distance(m_mouseX, m_mouseY); - - auto convertedOffset = glm::vec3(offset.x(), offset.y(), offset.z()); - glm::vec3 rotationAxis(0,1,0); - glm::mat4 rotation; - rotation = glm::rotate(rotation, -(float)dx, rotationAxis); - auto new_position = rotation * glm::vec4(offset.x(), offset.y(), offset.z(), 1); - imstk::Vec3d position(new_position[0], new_position[1], new_position[2]); - camera->setPosition(camera->getFocalPoint() + position); - } - else if (m_state & VulkanInteractorStyleTrackballCamera::MIDDLE_MOUSE_DOWN) - { - auto camera = m_simManager->getActiveScene()->getCamera(); - auto eye = glm::tvec3<float>(camera->getPosition().x(), camera->getPosition().y(), camera->getPosition().z()); - auto center = glm::tvec3<float>(camera->getFocalPoint().x(), camera->getFocalPoint().y(), camera->getFocalPoint().z()); - auto up = glm::tvec3<float>(camera->getViewUp().x(), camera->getViewUp().y(), camera->getViewUp().z()); - - glm::mat4 cameraTranslationMatrix(1); - cameraTranslationMatrix = glm::translate(cameraTranslationMatrix, glm::tvec3<float>(-dx * 10, dy * 10, 0)); - auto cameraMatrix = glm::inverse(glm::lookAt(eye, center, up)); - - auto new_position = cameraMatrix * cameraTranslationMatrix; - auto new_focal_point_offset = glm::mat3(cameraMatrix) * glm::vec3(cameraTranslationMatrix[3]); - imstk::Vec3d position(new_position[3][0], new_position[3][1], new_position[3][2]); - camera->setPosition(position); - auto new_focal_point = center + new_focal_point_offset; - camera->setFocalPoint(Vec3d(new_focal_point[0], new_focal_point[1], new_focal_point[2])); - } - - m_lastMouseX = m_mouseX; - m_lastMouseY = m_mouseY; -} - -void -VulkanInteractorStyleTrackballCamera::OnLeftButtonDown() -{ - m_state |= VulkanInteractorStyleTrackballCamera::LEFT_MOUSE_DOWN; -} - -void -VulkanInteractorStyleTrackballCamera::OnLeftButtonUp() -{ - m_state &= ~VulkanInteractorStyleTrackballCamera::LEFT_MOUSE_DOWN; -} - -void -VulkanInteractorStyleTrackballCamera::OnMiddleButtonDown() -{ - m_state |= VulkanInteractorStyleTrackballCamera::MIDDLE_MOUSE_DOWN; -} - -void VulkanInteractorStyleTrackballCamera::OnMiddleButtonUp() -{ - m_state &= ~VulkanInteractorStyleTrackballCamera::MIDDLE_MOUSE_DOWN; -} - -void -VulkanInteractorStyleTrackballCamera::OnRightButtonDown() -{ - m_state |= VulkanInteractorStyleTrackballCamera::RIGHT_MOUSE_DOWN; -} - -void -VulkanInteractorStyleTrackballCamera::OnRightButtonUp() -{ - m_state &= ~VulkanInteractorStyleTrackballCamera::RIGHT_MOUSE_DOWN; -} - -void -VulkanInteractorStyleTrackballCamera::OnMouseWheelForward(double y) -{ - auto camera = m_simManager->getActiveScene()->getCamera(); - - auto offset = camera->getPosition() - camera->getFocalPoint(); - - auto offsetx = -0.01 * offset.x() * y + camera->getPosition().x(); - auto offsety = -0.01 * offset.y() * y + camera->getPosition().y(); - auto offsetz = -0.01 * offset.z() * y + camera->getPosition().z(); - - camera->setPosition(Vec3d(offsetx, offsety, offsetz)); -} - -void -VulkanInteractorStyleTrackballCamera::OnMouseWheelBackward(double y) -{ - auto camera = m_simManager->getActiveScene()->getCamera(); - - auto offset = camera->getPosition() - camera->getFocalPoint(); - - auto offsetx = -0.01 * offset.x() * y + camera->getPosition().x(); - auto offsety = -0.01 * offset.y() * y + camera->getPosition().y(); - auto offsetz = -0.01 * offset.z() * y + camera->getPosition().z(); - - camera->setPosition(Vec3d(offsetx, offsety, offsetz)); -} - -inline double -VulkanInteractorStyleTrackballCamera::distance(double x, double y) -{ - return sqrt(x * x + y * y); -} - -void -VulkanInteractorStyleTrackballCamera::OnWindowResizeInterface(GLFWwindow * window, int width, int height) -{ - VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window); -} - -void -VulkanInteractorStyleTrackballCamera::OnFramebuffersResizeInterface(GLFWwindow * window, int width, int height) -{ - VulkanInteractorStyleTrackballCamera * style = (VulkanInteractorStyleTrackballCamera *)glfwGetWindowUserPointer(window); - style->OnWindowResize(width, height); -} - -void -VulkanInteractorStyleTrackballCamera::OnWindowResize(int width, int height) -{ - m_viewer->resizeWindow(width, height); -} -} \ No newline at end of file diff --git a/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h b/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h index 707af513b5f04f6f00a3dda22e56c91e739ff22d..eb1948a9df488b66d4a70146c1c7154a5348aa95 100644 --- a/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h +++ b/Source/SimulationManager/VulkanRenderer/imstkVulkanViewer.h @@ -90,7 +90,7 @@ public: protected: friend class VulkanInteractorStyle; - friend class VulkanInteractorStyleTrackballCamera; + friend class VulkanInteractorStyleFreeCamera; void setupWindow(); void createWindow();