7 #include "imstkMouseSceneControl.h" 8 #include "imstkCamera.h" 9 #include "imstkLogger.h" 10 #include "imstkMouseDeviceClient.h" 11 #include "imstkScene.h" 12 #include "imstkSceneManager.h" 19 LOG(INFO) <<
"Mouse Scene Controls: Only usable in debug mode";
20 LOG(INFO) <<
"----------------------------------------------------------------------";
21 LOG(INFO) <<
" | Left click drag - rotate view";
22 LOG(INFO) <<
" | Middle click drag - pan view";
23 LOG(INFO) <<
" | Scroll - zoom in/out";
24 LOG(INFO) <<
"----------------------------------------------------------------------";
30 if (m_mode == Mode::None)
33 if (key == LEFT_BUTTON)
35 m_mode = Mode::Rotate;
37 else if (key == MIDDLE_BUTTON)
45 MouseSceneControl::OnButtonRelease(
const int key)
47 if (key == LEFT_BUTTON && m_mode == Mode::Rotate)
51 else if (key == MIDDLE_BUTTON && m_mode == Mode::Pan)
58 MouseSceneControl::OnScroll(
const double dx)
65 std::shared_ptr<Camera> cam = m_sceneManager->getActiveScene()->getActiveCamera();
66 const Vec3d& focalPt = cam->getFocalPoint();
67 const Vec3d& camPos = cam->getPosition();
68 const Vec3d diff = camPos - focalPt;
74 newDiff = diff * 1.1 * m_zoomSpeed * m_zoomFactor;
78 newDiff = diff * 0.9 * m_zoomSpeed * m_zoomFactor;
80 const Vec3d newPos = focalPt + newDiff;
81 cam->setPosition(newPos);
86 MouseSceneControl::OnMouseMove(
const Vec2d& pos)
93 std::shared_ptr<Camera> cam = m_sceneManager->getActiveScene()->getActiveCamera();
99 if (m_mode == Mode::Rotate)
102 const Vec2d dx = (m_pos - m_prevPos) * (m_rotateSpeed * m_rotateFactor);
103 const double dTheta = dx[1];
104 const double dPhi = -dx[0];
106 const Vec3d& focalPt = cam->getFocalPoint();
107 const Vec3d& camPos = cam->getPosition();
108 Vec3d localCamPos = camPos - focalPt;
111 const Mat4d& view = cam->getView();
112 const Vec3d up = Vec3d(view(1, 0), view(1, 1), view(1, 2));
113 const Vec3d right = Vec3d(view(0, 0), view(0, 1), view(0, 2));
115 localCamPos = Rotd(dPhi, up).toRotationMatrix() * localCamPos;
116 localCamPos = Rotd(dTheta, right).toRotationMatrix() * localCamPos;
119 const Vec3d newPos = localCamPos + focalPt;
120 cam->setPosition(newPos);
121 cam->setViewUp(Vec3d(view(1, 0), view(1, 1), view(1, 2)));
124 else if (m_mode == Mode::Pan)
127 const Vec2d dx = m_pos - m_prevPos;
129 const Vec3d& focalPt = cam->getFocalPoint();
130 const Vec3d& camPos = cam->getPosition();
132 Mat4d& view = cam->getView();
133 const Vec3d up = Vec3d(view(1, 0), view(1, 1), view(1, 2));
134 const Vec3d right = Vec3d(view(0, 0), view(0, 1), view(0, 2));
137 const double dist = (focalPt - camPos).norm();
138 const Vec3d dPos = (up * dx[1] + right * dx[0]) * -(m_panSpeed * m_panFactor * dist);
139 cam->setFocalPoint(focalPt + dPos);
140 cam->setPosition(camPos + dPos);
154 return (m_sceneManager->getMode() == SceneManager::Mode::Debug) || m_enabled;
void OnButtonPress(const int key) override
On the mouse scene control button press.
void setEnabled(bool enable)
Enable the mouse control, independent of the debug mode.
void printControls() override
Prints the controls.