iMSTK
Interactive Medical Simulation Toolkit
imstkKeyboardSceneControl.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkKeyboardSceneControl.h"
8 #include "imstkCamera.h"
9 #include "imstkLogger.h"
10 #include "imstkModuleDriver.h"
11 #include "imstkRenderer.h"
12 #include "imstkScene.h"
13 #include "imstkSceneControlText.h"
14 #include "imstkSceneManager.h"
15 #include "imstkViewer.h"
16 
17 namespace imstk
18 {
19 void
21 {
22  LOG(INFO) << "Keyboard Scene Controls:";
23  LOG(INFO) << "----------------------------------------------------------------------";
24  LOG(INFO) << " | Space - pause/resume the scene";
25  LOG(INFO) << " | q/Q - stop both the scene and viewer";
26  LOG(INFO) << " | d/D - toggle debug/simulation mode";
27  LOG(INFO) << " | p/P - toggle visual/physics updates/second and task times display";
28  LOG(INFO) << " | r/R - reset the simulation";
29  LOG(INFO) << " | n/N - print camera pose of the active scene's camera";
30  LOG(INFO) << "----------------------------------------------------------------------";
31 }
32 
33 void
34 KeyboardSceneControl::OnKeyPress(const char key)
35 {
36  auto sceneManager = m_sceneManager.lock();
37 
38  if (sceneManager == nullptr)
39  {
40  LOG(WARNING) << "Keyboard control disabled: No scene manager provided";
41  return;
42  }
43  auto driver = m_driver.lock();
44  if (driver == nullptr)
45  {
46  LOG(WARNING) << "Keyboard control disabled: No driver provided";
47  return;
48  }
49 
50  // Pause/Resume the simulation
51  if (key == ' ')
52  {
53  // To ensure consistency toggle/invert based of m_sceneManager
54  const bool paused = sceneManager->getPaused();
55 
56  // Switch pause screen visibility
57  if (m_sceneControlText != nullptr)
58  {
59  m_sceneControlText->setVisibility(m_sceneControlText->getUseTextStatus() ? !paused : false);
60  }
61 
62  // Resume or pause all modules, expect viewers
63  for (auto module : driver->getModules())
64  {
65  if (std::dynamic_pointer_cast<Viewer>(module) == nullptr)
66  {
67  module->setPaused(!paused);
68  }
69  }
70  // In case the SceneManager is not apart of the driver
71  paused ? sceneManager->resume() : sceneManager->pause();
72  }
73  // Stop the program
74  else if (key == 'q' || key == 'Q' || key == 'e' || key == 'E') // end Simulation
75  {
76  driver->requestStatus(ModuleDriverStopped);
77  }
78  // Switch to debug mode
79  else if (key == 'd' || key == 'D') // switch rendering mode of the modules
80  {
81  // To ensure consistency toggle/invert based of m_sceneManager
82  const bool simModeOn = sceneManager->getMode() == SceneManager::Mode::Simulation ? true : false;
83 
84  for (auto module : driver->getModules())
85  {
86  if (auto subManager = std::dynamic_pointer_cast<SceneManager>(module))
87  {
88  if (simModeOn)
89  {
90  subManager->setMode(SceneManager::Mode::Debug);
91  }
92  else
93  {
94  subManager->setMode(SceneManager::Mode::Simulation);
95  }
96  }
97  if (auto viewer = std::dynamic_pointer_cast<Viewer>(module))
98  {
99  if (simModeOn)
100  {
101  viewer->setRenderingMode(Renderer::Mode::Debug);
102  }
103  else
104  {
105  viewer->setRenderingMode(Renderer::Mode::Simulation);
106  }
107  }
108  }
109 
110  simModeOn ? sceneManager->setMode(SceneManager::Mode::Debug) : sceneManager->setMode(SceneManager::Mode::Simulation);
111  }
112  // Toggle through info levels
113  else if (key == 'p' || key == 'P')
114  {
115  for (auto module : driver->getModules())
116  {
117  std::shared_ptr<Viewer> viewer = std::dynamic_pointer_cast<Viewer>(module);
118  if (viewer != nullptr)
119  {
120  viewer->setInfoLevel((viewer->getInfoLevel() + 1) % viewer->getInfoLevelCount());
121  }
122  }
123  }
124  // Reset simulation
125  else if (key == 'r' || key == 'R')
126  {
127  sceneManager->getActiveScene()->reset();
128  }
129  else if (key == 'n' || key == 'N')
130  {
131  sceneManager->getActiveScene()->getActiveCamera()->print();
132  }
133  // Toggle text on pause screen (if used)
134  else if (key == 'c' || key == 'C')
135  {
136  if (m_sceneControlText != nullptr)
137  {
138  m_sceneControlText->setUseTextStatus(!m_sceneControlText->getUseTextStatus());
139  const bool paused = sceneManager->getPaused();
140  m_sceneControlText->setVisibility(m_sceneControlText->getUseTextStatus() ? !paused : false);
141  }
142  }
143 }
144 } // namespace imstk
virtual void setInfoLevel(const int level)
Set the info level, usually means display framerates and other viewer related information.
Definition: imstkViewer.cpp:46
void printControls() override
Prints the controls.
Compound Geometry.
Base class for viewer that manages render window and the renderers Creates backend-specific renderers...
Definition: imstkViewer.h:43