iMSTK
Interactive Medical Simulation Toolkit
imstkAbstractVTKViewer.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 "imstkAbstractVTKViewer.h"
8 #include "imstkLogger.h"
9 #include "imstkScene.h"
10 #include "imstkVTKInteractorStyle.h"
11 #include "imstkVTKRenderer.h"
12 
13 #include <vtkCallbackCommand.h>
14 #include <vtkFileOutputWindow.h>
15 #include <vtkOpenGLRenderWindow.h>
16 #include <vtkRenderer.h>
17 #include <vtkRenderWindow.h>
18 #include <vtkRenderWindowInteractor.h>
19 
20 namespace imstk
21 {
22 static void
23 exitCallbackFunc(
24  vtkObject* vtkNotUsed(sender), unsigned long eventId,
25  void* clientData, void* vtkNotUsed(callData))
26 {
27  AbstractVTKViewer* viewer = static_cast<AbstractVTKViewer*>(clientData);
28  if (viewer != nullptr
29  && eventId == vtkCommand::ExitEvent)
30  {
31  viewer->pause(); // Immediately prevent any updates from running
32  viewer->postEvent(Event(Module::end()));
33  }
34 }
35 
36 AbstractVTKViewer::AbstractVTKViewer(std::string name) : Viewer(name)
37 {
38 }
39 
42 {
43  return this->getActiveRenderer()->getMode();
44 }
45 
46 void
47 AbstractVTKViewer::setSize(const int width, const int height)
48 {
49  if (m_vtkRenderWindow != NULL)
50  {
51  m_vtkRenderWindow->SetSize(width, height);
52  }
53 }
54 
55 void
56 AbstractVTKViewer::setUseVsync(const bool useVsync)
57 {
58  m_useVsync = useVsync;
59  if (auto glRenWin = vtkOpenGLRenderWindow::SafeDownCast(m_vtkRenderWindow))
60  {
61  glRenWin->SetSwapControl(static_cast<int>(useVsync));
62  }
63 }
64 
65 void
66 AbstractVTKViewer::setWindowTitle(const std::string& title)
67 {
68  m_config->m_windowName = title;
69  if (m_vtkRenderWindow)
70  {
71  m_vtkRenderWindow->SetWindowName(title.c_str());
72  }
73 }
74 
75 void
76 AbstractVTKViewer::setBackgroundColors(const Color color1, const Color color2, const bool gradientBackground)
77 {
78  if (getActiveScene() == nullptr)
79  {
80  LOG(WARNING) << "Must set active scene before setting background color";
81  return;
82  }
83  this->getActiveRenderer()->updateBackground(Vec3d(color1.r, color1.g, color1.b), Vec3d(color2.r, color2.g, color2.b), gradientBackground);
84 }
85 
86 void
88 {
89  m_vtkRenderWindow->GetInteractor()->ProcessEvents();
90 }
91 
92 void
93 AbstractVTKViewer::setVtkLoggerMode(VTKLoggerMode loggerMode)
94 {
95  if (loggerMode == VTKLoggerMode::SHOW)
96  {
97  vtkObject::GlobalWarningDisplayOn();
98  }
99  else if (loggerMode == VTKLoggerMode::MUTE)
100  {
101  vtkObject::GlobalWarningDisplayOff();
102  }
103  else if (loggerMode == VTKLoggerMode::WRITE)
104  {
105  vtkObject::GlobalWarningDisplayOn();
106 
107  // Set the VTK output window to log
108  vtkNew<vtkFileOutputWindow> fileOutputWindow;
109  fileOutputWindow->SetFileName("vtkOutput.log");
110  vtkOutputWindow::SetInstance(fileOutputWindow);
111  }
112 }
113 
114 bool
115 AbstractVTKViewer::initModule()
116 {
117  exitCallback = vtkSmartPointer<vtkCallbackCommand>::New();
118  exitCallback->SetCallback(exitCallbackFunc);
119  exitCallback->SetClientData(this);
120  m_vtkRenderWindow->GetInteractor()->AddObserver(vtkCommand::ExitEvent, exitCallback);
121  return true;
122 }
123 
124 void
125 AbstractVTKViewer::uninitModule()
126 {
127  auto iren = m_vtkRenderWindow->GetInteractor();
128  iren->SetDone(true);
129 
130  iren->TerminateApp();
131  iren->ProcessEvents();
132  m_vtkRenderWindow->Finalize();
133 }
134 
135 std::shared_ptr<VTKRenderer>
137 {
138  return std::dynamic_pointer_cast<VTKRenderer>(getActiveRenderer());
139 }
140 } // namespace imstk
Compound Geometry.
void processEvents() override
Processes VTK events, includes OS events.
virtual void setBackgroundColors(const Color color1, const Color color2=Color(0.0, 0.0, 0.0), const bool gradientBackground=false) override
Set the coloring of the screen background If &#39;gradientBackground&#39; is false or not supplied color1 wil...
void setUseVsync(const bool useVsync) override
Set whether to vertical sync. Sync framerate to the refresh of the monitor.
std::shared_ptr< Scene > getActiveScene() const
Get scene currently being rendered.
Definition: imstkViewer.h:53
Renderer::Mode getRenderingMode() const override
Get the current renderer mode.
std::shared_ptr< Renderer > getActiveRenderer() const
Retrieve the renderer associated with the current scene.
Definition: imstkViewer.cpp:38
Base class for viewer that manages render window and the renderers /// Creates backend-specific rende...
Color in RGB space.
Definition: imstkColor.h:24
Mode
Enumerations for the render mode.
Definition: imstkRenderer.h:47
void setVtkLoggerMode(VTKLoggerMode loggerMode)
Set the logger mode.
void setSize(const int width, const int height) override
Set the render window size.
Wraps a vtkRenderer.
std::shared_ptr< VTKRenderer > getActiveVtkRenderer() const
Retrieve the renderer associated with the current scene.
void setWindowTitle(const std::string &title) override
Set the render window title.