iMSTK
Interactive Medical Simulation Toolkit
imstkVTKViewer.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 "imstkVTKViewer.h"
8 #include "imstkLogger.h"
9 #include "imstkScene.h"
10 #include "imstkVTKInteractorStyle.h"
11 #include "imstkVTKRenderer.h"
12 #include "imstkVTKScreenCaptureUtility.h"
13 
14 #include <vtkRenderer.h>
15 #include <vtkRenderWindow.h>
16 #include <vtkTextActor.h>
17 #include <vtkOpenGLRenderWindow.h>
18 
19 #include <vtkCamera.h>
20 
21 #ifdef WIN32
22 #include <vtkWin32HardwareWindow.h>
23 #include <vtkWin32RenderWindowInteractor.h>
24 #else
25 #ifdef iMSTK_USE_VTK_OSMESA
26 #include <vtkGenericRenderWindowInteractor.h>
27 #else
28 #include <vtkXRenderWindowInteractor.h>
29 #endif
30 #endif
31 
32 namespace imstk
33 {
34 VTKViewer::VTKViewer(std::string name) : AbstractVTKViewer(name)
35 {
36  // Create the interactor style
37  m_vtkInteractorStyle = vtkSmartPointer<VTKInteractorStyle>::New();
38 
39  // Create the interactor
40 #ifdef WIN32
41  auto iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
42 #else
43 #ifdef iMSTK_USE_VTK_OSMESA
44  auto iren = vtkSmartPointer<vtkGenericRenderWindowInteractor>::New();
45 #else
46  vtkSmartPointer<vtkXRenderWindowInteractor> iren = vtkSmartPointer<vtkXRenderWindowInteractor>::New();
47  iren->SetInteractorStyle(m_vtkInteractorStyle.Get());
48 #endif
49 #endif
50  iren->SetInteractorStyle(m_vtkInteractorStyle);
51 
52  // Create the RenderWindow
53  m_vtkRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();
54  m_vtkRenderWindow->SetInteractor(iren);
55  m_vtkRenderWindow->SetSize(m_config->m_renderWinWidth, m_config->m_renderWinHeight);
56 
57  // Screen capture
58  m_screenCapturer = std::make_shared<VTKScreenCaptureUtility>(m_vtkRenderWindow);
59 }
60 
61 void
62 VTKViewer::setActiveScene(std::shared_ptr<Scene> scene)
63 {
64  // This function could be called before or after the viewer & renderer
65  // has even started.
66 
67  // If already current scene
68  if (scene == m_activeScene)
69  {
70  LOG(WARNING) << scene->getName() << " already is the viewer current scene.";
71  return;
72  }
73 
74  // If the current scene has a renderer, remove it
75  if (m_activeScene != nullptr)
76  {
77  auto vtkRenderer = getActiveVtkRenderer()->getVtkRenderer();
78  if (m_vtkRenderWindow->HasRenderer(vtkRenderer))
79  {
80  m_vtkRenderWindow->RemoveRenderer(vtkRenderer);
81  }
82  }
83 
84  // Update current scene
85  m_activeScene = scene;
86 
87  // Create renderer if it doesn't exist
88  if (!m_rendererMap.count(m_activeScene))
89  {
90  m_rendererMap[m_activeScene] = std::make_shared<VTKRenderer>(m_activeScene, false);
91  // If we already ran past init, then init it here
92  if (m_init)
93  {
94  m_rendererMap[m_activeScene]->initialize();
95  }
96  }
97 
98  // Cast to VTK renderer
99  auto vtkRenderer = getActiveVtkRenderer()->getVtkRenderer();
100 
101  // Set renderer to renderWindow
102  m_vtkRenderWindow->AddRenderer(vtkRenderer);
103  m_vtkInteractorStyle->SetCurrentRenderer(vtkRenderer);
104 
105  // Set name to renderWindow
106  m_vtkRenderWindow->SetWindowName(m_activeScene->getName().data());
107 }
108 
109 void
111 {
112  if (!m_activeScene)
113  {
114  LOG(WARNING) << "Missing scene, can not set rendering mode.\n"
115  << "Use Viewer::setActiveScene to set the scene.";
116  return;
117  }
118 
119  // Switch the renderer to the mode
120  getActiveRenderer()->setMode(mode, false);
121 
122  if (mode == Renderer::Mode::Debug)
123  {
124  if (!m_activeScene->hasEntity(m_debugEntity))
125  {
126  m_activeScene->addSceneObject(m_debugEntity);
127  }
128  }
129  else if (mode == Renderer::Mode::Simulation)
130  {
131  if (m_activeScene->hasEntity(m_debugEntity))
132  {
133  m_activeScene->removeSceneObject(m_debugEntity);
134  }
135  }
136 
137  updateModule();
138 
139  if (m_config->m_hideCurzor)
140  {
141  m_vtkRenderWindow->HideCursor();
142  }
143 
144  if (m_config->m_hideBorder)
145  {
146  m_vtkRenderWindow->BordersOff();
147  }
148 
149  if (m_config->m_fullScreen)
150  {
151  m_vtkRenderWindow->FullScreenOn();
152  }
153 }
154 
155 bool
156 VTKViewer::initModule()
157 {
158  if (!AbstractVTKViewer::initModule())
159  {
160  return false;
161  }
162 
163  std::shared_ptr<VTKRenderer> ren = getActiveVtkRenderer();
164  ren->initialize();
165 
166  // Update the camera
167  if (ren != nullptr)
168  {
169  ren->updateCamera();
170  }
171 
172  m_vtkRenderWindow->SetWindowName(m_config->m_windowName.c_str());
173  if (m_vtkRenderWindow->GetInteractor()->HasObserver(vtkCommand::StartEvent))
174  {
175  m_vtkRenderWindow->GetInteractor()->InvokeEvent(vtkCommand::StartEvent, nullptr);
176  }
177 
178  m_vtkRenderWindow->GetInteractor()->Initialize();
179  setUseVsync(m_useVsync);
180  m_vtkRenderWindow->Render();
181 
182  return true;
183 }
184 
185 std::shared_ptr<VTKScreenCaptureUtility>
187 {
188  return std::static_pointer_cast<VTKScreenCaptureUtility>(m_screenCapturer);
189 }
190 
191 std::shared_ptr<KeyboardDeviceClient>
193 {
194  return VTKInteractorStyle::SafeDownCast(m_vtkInteractorStyle)->getKeyboardDeviceClient();
195 }
196 
197 std::shared_ptr<MouseDeviceClient>
199 {
200  return VTKInteractorStyle::SafeDownCast(m_vtkInteractorStyle)->getMouseDeviceClient();
201 }
202 
203 void
205 {
206  std::shared_ptr<VTKRenderer> ren = std::dynamic_pointer_cast<VTKRenderer>(getActiveRenderer());
207  if (ren == nullptr)
208  {
209  return;
210  }
211 
212  // Update Camera
213  ren->updateCamera();
214 
215  // Call visual update on every scene object
216  getActiveScene()->updateVisuals(getDt());
217  // Update all the rendering delegates
218  ren->updateRenderDelegates();
219 
220  // Automatically determine near and far planes (not used atm)
221  //ren->getVtkRenderer()->ResetCameraClippingRange();
222 
223  updateFps();
224 
225  // Render
226  m_vtkRenderWindow->Render();
227 }
228 } // namespace imstk
void setActiveScene(std::shared_ptr< Scene > scene) override
Set scene to be rendered.
void updateCamera()
Updates the camera.
std::shared_ptr< KeyboardDeviceClient > getKeyboardDevice() const override
Returns the device that emits key events.
Compound Geometry.
std::shared_ptr< VTKScreenCaptureUtility > getScreenCaptureUtility() const
Access screen shot utility.
Mode
Enumerations for the render mode.
Definition: imstkRenderer.h:47
void setRenderingMode(const Renderer::Mode mode) override
Set the rendering mode. In debug, debug actors will be shown.
void updateModule() override
last framerate value used for moving average estimate
Wraps a vtkRenderer.
Utility class to manage screen capture through VTK.
std::shared_ptr< MouseDeviceClient > getMouseDevice() const override
Returns the device that emits mouse events.