diff --git a/Source/SimulationManager/imstkMouseSceneControl.cpp b/Source/SimulationManager/imstkMouseSceneControl.cpp index e7c7ca19a60dfad705a1ef4032a231bbc962e9e6..aaf92da78ca55cf403899f956e6155be60d3aac1 100644 --- a/Source/SimulationManager/imstkMouseSceneControl.cpp +++ b/Source/SimulationManager/imstkMouseSceneControl.cpp @@ -35,145 +35,140 @@ MouseSceneControl::MouseSceneControl(std::shared_ptr<MouseDeviceClient> device) void MouseSceneControl::printControls() { - LOG(INFO) << "Mouse Scene Controls: Only usable in debug mode"; - LOG(INFO) << "----------------------------------------------------------------------"; - LOG(INFO) << " | Left click drag - rotate view"; - LOG(INFO) << " | Middle click drag - pan view"; - LOG(INFO) << " | Scroll - zoom in/out"; - LOG(INFO) << "----------------------------------------------------------------------"; + LOG(INFO) << "Mouse Scene Controls: Only usable in debug mode"; + LOG(INFO) << "----------------------------------------------------------------------"; + LOG(INFO) << " | Left click drag - rotate view"; + LOG(INFO) << " | Middle click drag - pan view"; + LOG(INFO) << " | Scroll - zoom in/out"; + LOG(INFO) << "----------------------------------------------------------------------"; } void MouseSceneControl::OnButtonPress(const int key) { - // If no mode currently selected - if (m_mode == Mode::None) + if (m_mode == Mode::None) + { + // Set the mode + if (key == LEFT_BUTTON) { - // Set the mode - if (key == LEFT_BUTTON) - { - m_mode = Mode::Rotate; - } - else if (key == MIDDLE_BUTTON) - { - m_mode = Mode::Pan; - } + m_mode = Mode::Rotate; } + else if (key == MIDDLE_BUTTON) + { + m_mode = Mode::Pan; + } + } } void MouseSceneControl::OnButtonRelease(const int key) { - if (key == LEFT_BUTTON && m_mode == Mode::Rotate) - { - m_mode = Mode::None; - } - else if (key == MIDDLE_BUTTON && m_mode == Mode::Pan) - { - m_mode = Mode::None; - } + if (key == LEFT_BUTTON && m_mode == Mode::Rotate) + { + m_mode = Mode::None; + } + else if (key == MIDDLE_BUTTON && m_mode == Mode::Pan) + { + m_mode = Mode::None; + } } void MouseSceneControl::OnScroll(const double dx) { - // This control is disabled in simulation mode - if (m_sceneManager->getMode() == SceneManager::Mode::Simulation) - { - return; - } - - std::shared_ptr<Camera> cam = m_sceneManager->getActiveScene()->getActiveCamera(); - const Vec3d& focalPt = cam->getFocalPoint(); - const Vec3d& camPos = cam->getPosition(); - const Vec3d diff = camPos - focalPt; - - // Linear zoom function - Vec3d newDiff; - if (dx > 0.0) - { - newDiff = diff * 1.1 * m_zoomSpeed * m_zoomFactor; - } - else - { - newDiff = diff * 0.9 * m_zoomSpeed * m_zoomFactor; - } - const Vec3d newPos = focalPt + newDiff; - cam->setPosition(newPos); - cam->update(); + if (!getEnabled()) + { + return; + } + + std::shared_ptr<Camera> cam = m_sceneManager->getActiveScene()->getActiveCamera(); + const Vec3d& focalPt = cam->getFocalPoint(); + const Vec3d& camPos = cam->getPosition(); + const Vec3d diff = camPos - focalPt; + + // Linear zoom function + Vec3d newDiff; + if (dx > 0.0) + { + newDiff = diff * 1.1 * m_zoomSpeed * m_zoomFactor; + } + else + { + newDiff = diff * 0.9 * m_zoomSpeed * m_zoomFactor; + } + const Vec3d newPos = focalPt + newDiff; + cam->setPosition(newPos); + cam->update(); } void MouseSceneControl::OnMouseMove(const Vec2d& pos) { - // Controls disabled in simulation mode - if (m_sceneManager->getMode() == SceneManager::Mode::Simulation) - { - return; - } - - std::shared_ptr<Camera> cam = m_sceneManager->getActiveScene()->getActiveCamera(); - - // Push back the position - m_prevPos = m_pos; - m_pos = pos; + if (!getEnabled()) + { + return; + } + + std::shared_ptr<Camera> cam = m_sceneManager->getActiveScene()->getActiveCamera(); + + // Push back the position + m_prevPos = m_pos; + m_pos = pos; + + if (m_mode == Mode::Rotate) + { + // Map mouse deltas to theta, phi rotations on a sphere + const Vec2d dx = (m_pos - m_prevPos) * (m_rotateSpeed * m_rotateFactor); + const double dTheta = dx[1]; // Elevation + const double dPhi = -dx[0]; // Azimuth + + const Vec3d& focalPt = cam->getFocalPoint(); + const Vec3d& camPos = cam->getPosition(); + Vec3d localCamPos = camPos - focalPt; + + // Get the rotation axes + const Mat4d& view = cam->getView(); + const Vec3d up = Vec3d(view(1, 0), view(1, 1), view(1, 2)); + const Vec3d right = Vec3d(view(0, 0), view(0, 1), view(0, 2)); + // Rotate around each + localCamPos = Rotd(dPhi, up).toRotationMatrix() * localCamPos; + localCamPos = Rotd(dTheta, right).toRotationMatrix() * localCamPos; + + // Set the new cam pos and up, then compute lookat + const Vec3d newPos = localCamPos + focalPt; + cam->setPosition(newPos); + cam->setViewUp(Vec3d(view(1, 0), view(1, 1), view(1, 2))); + cam->update(); + } + else if (m_mode == Mode::Pan) + { + // Move camera along up and right + const Vec2d dx = m_pos - m_prevPos; + + const Vec3d& focalPt = cam->getFocalPoint(); + const Vec3d& camPos = cam->getPosition(); + + Mat4d& view = cam->getView(); + const Vec3d up = Vec3d(view(1, 0), view(1, 1), view(1, 2)); + const Vec3d right = Vec3d(view(0, 0), view(0, 1), view(0, 2)); + + // scale pan by zoom as well + const double dist = (focalPt - camPos).norm(); + const Vec3d dPos = (up * dx[1] + right * dx[0]) * -(m_panSpeed * m_panFactor * dist); + cam->setFocalPoint(focalPt + dPos); + cam->setPosition(camPos + dPos); + cam->update(); + } +} - if (m_mode == Mode::Rotate) - { - // Map mouse deltas to theta, phi rotations on a sphere - const Vec2d dx = (m_pos - m_prevPos) * (m_rotateSpeed * m_rotateFactor); - const double dTheta = dx[1]; // Elevation - const double dPhi = -dx[0]; // Azimuth - - const Vec3d& focalPt = cam->getFocalPoint(); - const Vec3d& camPos = cam->getPosition(); - Vec3d localCamPos = camPos - focalPt; - - // Get the rotation axes - const Mat4d& view = cam->getView(); - const Vec3d up = Vec3d(view(1, 0), view(1, 1), view(1, 2)); - const Vec3d right = Vec3d(view(0, 0), view(0, 1), view(0, 2)); - // Rotate around each - localCamPos = Rotd(dPhi, up).toRotationMatrix() * localCamPos; - localCamPos = Rotd(dTheta, right).toRotationMatrix() * localCamPos; - - // Set the new cam pos and up, then compute lookat - const Vec3d newPos = localCamPos + focalPt; - cam->setPosition(newPos); - cam->setViewUp(Vec3d(view(1, 0), view(1, 1), view(1, 2))); - cam->update(); - } - else if (m_mode == Mode::Pan) - { - // Move camera along up and right - const Vec2d dx = m_pos - m_prevPos; - - const Vec3d& focalPt = cam->getFocalPoint(); - const Vec3d& camPos = cam->getPosition(); - - Mat4d& view = cam->getView(); - const Vec3d up = Vec3d(view(1, 0), view(1, 1), view(1, 2)); - const Vec3d right = Vec3d(view(0, 0), view(0, 1), view(0, 2)); - - // scale pan by zoom as well - const double dist = (focalPt - camPos).norm(); - const Vec3d dPos = (up * dx[1] + right * dx[0]) * -(m_panSpeed * m_panFactor * dist); - cam->setFocalPoint(focalPt + dPos); - cam->setPosition(camPos + dPos); - cam->update(); - } +void MouseSceneControl::setEnabled(bool enable) +{ + m_enabled = enable; } -void -MouseSceneControl::update(const double imstkNotUsed(dt)) +bool MouseSceneControl::getEnabled() const { - // Directly set it - //m_camera->getView() = m_targetViewTransform; - - // Slerp the camera rotation - /*const Quatd currOrientation = Quatd(m_camera->getView().block<3, 3>(0, 0)).normalized(); - const Quatd targetOrientation = Quatd(m_targetViewTransform.block<3, 3>(0, 0)).normalized(); - const Quatd newOrientation = currOrientation.slerp(0.1, targetOrientation).normalized(); - m_camera->getView().block<3, 3>(0, 0) = newOrientation.toRotationMatrix();*/ + return (m_sceneManager->getMode() == SceneManager::Mode::Debug) || m_enabled; } + } \ No newline at end of file diff --git a/Source/SimulationManager/imstkMouseSceneControl.h b/Source/SimulationManager/imstkMouseSceneControl.h index af21faf3825f2b6acacbd35d190c408fb2aa6a4d..9e7f88d02d0d3db34e8e2d8e2e4f4d6b83b3f183 100644 --- a/Source/SimulationManager/imstkMouseSceneControl.h +++ b/Source/SimulationManager/imstkMouseSceneControl.h @@ -39,69 +39,77 @@ class SceneManager; class MouseSceneControl : public MouseControl { public: - enum class Mode - { - None, - Pan, - Rotate - }; + enum class Mode + { + None, + Pan, + Rotate + }; public: - MouseSceneControl() = default; - MouseSceneControl(std::shared_ptr<MouseDeviceClient> device); - ~MouseSceneControl() override = default; + MouseSceneControl() = default; + MouseSceneControl(std::shared_ptr<MouseDeviceClient> device); + ~MouseSceneControl() override = default; public: - /// - /// \brief Set the scroll controlled zoom speed - /// - void setZoomSpeed(const double zoomSpeed) { m_zoomSpeed = zoomSpeed; } - - /// - /// \brief Set the mouse controlled rotate speed - /// - void setRotateSpeed(const double rotateSpeed) { m_rotateSpeed = rotateSpeed; } - - /// - /// \brief Set the pan speed - /// - void setPanSpeed(const double panSpeed) { m_panSpeed = panSpeed; } - - /// - /// \brief Set the scene manager to be controlled - /// The active scene's camera will be controllable depending on SceneManager's mode - /// - void setSceneManager(std::shared_ptr<SceneManager> manager) { m_sceneManager = manager; } + /// + /// \brief Set the scroll controlled zoom speed + /// + void setZoomSpeed(const double zoomSpeed) { m_zoomSpeed = zoomSpeed; } + + /// + /// \brief Set the mouse controlled rotate speed + /// + void setRotateSpeed(const double rotateSpeed) { m_rotateSpeed = rotateSpeed; } + + /// + /// \brief Set the pan speed + /// + void setPanSpeed(const double panSpeed) { m_panSpeed = panSpeed; } + + /// + /// \brief Set the scene manager to be controlled + /// The active scene's camera will be controllable depending on SceneManager's mode, or the + /// + void setSceneManager(std::shared_ptr<SceneManager> manager) { m_sceneManager = manager; } + + /// + /// \brief Enable the mouse control, independent of the debug mode + /// + void setEnabled(bool enable); + + /// + /// \return true if the controls are enabled, either explicitly or debug is on in the scenecontrol + /// + bool getEnabled() const; public: - void printControls() override; + void printControls() override; - /// - /// \brief On the mouse scene control button press - /// - void OnButtonPress(const int key) override; - void OnButtonRelease(const int key) override; - void OnScroll(const double dx) override; - void OnMouseMove(const Vec2d& pos) override; - - // How to handle mouse movements? - // Mouse movements best done in update func or event? event would still require update for interpolation - void update(const double dt) override; + /// + /// \brief On the mouse scene control button press + /// + void OnButtonPress(const int key) override; + void OnButtonRelease(const int key) override; + void OnScroll(const double dx) override; + void OnMouseMove(const Vec2d& pos) override; protected: - std::shared_ptr<SceneManager> m_sceneManager; - Mode m_mode = Mode::None; - Vec2d m_prevPos; - Vec2d m_pos; - - // User changeable values - double m_zoomSpeed = 1.0; - double m_rotateSpeed = 1.0; - double m_panSpeed = 1.0; - - // Hardcoded values - double m_zoomFactor = 1.0; - double m_rotateFactor = 5.0; - double m_panFactor = 1.0; + std::shared_ptr<SceneManager> m_sceneManager; + Mode m_mode = Mode::None; + Vec2d m_prevPos; + Vec2d m_pos; + + // User changeable values + double m_zoomSpeed = 1.0; + double m_rotateSpeed = 1.0; + double m_panSpeed = 1.0; + + // Hardcoded values + double m_zoomFactor = 1.0; + double m_rotateFactor = 5.0; + double m_panFactor = 1.0; + + bool m_enabled = false; }; } \ No newline at end of file