iMSTK
Interactive Medical Simulation Toolkit
imstkVTKRenderer.h
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 #pragma once
8 
9 #include "imstkRenderer.h"
10 #include "imstkTextureManager.h"
11 #include "imstkVTKTextureDelegate.h"
12 #include "imstkEventObject.h"
13 
14 #include <vtkSmartPointer.h>
15 #include <unordered_set>
16 
17 class vtkCamera;
18 class vtkCameraPass;
19 class vtkChartXY;
20 class vtkContextActor;
21 class vtkLight;
22 class vtkOpenVRCamera;
23 class vtkPlotBar;
24 class vtkProp;
25 class vtkRenderer;
26 class vtkRenderStepsPass;
27 class vtkSSAOPass;
28 class vtkTable;
29 
30 namespace imstk
31 {
32 class Camera;
33 class Entity;
34 class Light;
35 class Scene;
36 class VisualModel;
37 class VTKRenderDelegate;
38 
44 class VTKRenderer : public Renderer
45 {
46 public:
50  VTKRenderer(std::shared_ptr<Scene> scene, const bool enableVR);
51  ~VTKRenderer() override = default;
52 
57  void initialize() override;
58 
62  void setMode(const Mode mode, const bool enableVR) override;
63 
67  void setTimeTable(const std::unordered_map<std::string, double>& timeTable) override;
68 
72  void setTimeTableVisibility(const bool visible) override;
73  bool getTimeTableVisibility() const override;
75 
79  void updateCamera();
80 
84  void updateRenderDelegates();
85 
89  vtkSmartPointer<vtkRenderer> getVtkRenderer() const { return m_vtkRenderer; }
90 
94  void updateBackground(const Vec3d color1, const Vec3d color2 = Vec3d::Zero(), const bool gradientBackground = false);
95 
96  void setDebugActorsVisible(const bool debugActorsVisible);
97  bool getDebugActorsVisible() const { return m_debugActorsVisible; }
98 
99 protected:
103  void removeActors(const std::vector<vtkSmartPointer<vtkProp>>& actorList);
104 
108  void addActors(const std::vector<vtkSmartPointer<vtkProp>>& actorList);
109 
113  void setConfig(std::shared_ptr<RendererConfig> config) override;
114 
118  void addEntity(std::shared_ptr<Entity> sceneObject);
119 
123  std::unordered_set<std::shared_ptr<Entity>>::iterator removeEntity(std::shared_ptr<Entity> sceneObject);
124 
129  void sceneModifed(Event* e);
130 
134  void addVisualModel(std::shared_ptr<Entity> sceneObject, std::shared_ptr<VisualModel> visualModel);
135 
139  std::unordered_set<std::shared_ptr<VisualModel>>::iterator removeVisualModel(std::shared_ptr<Entity> sceneObject, std::shared_ptr<VisualModel> visualModel);
140 
145  void entityModified(Event* e);
146 
150  void entityModified(std::shared_ptr<Entity> sceneObject);
151 
152  vtkSmartPointer<vtkRenderer> m_vtkRenderer;
153 
154  // Camera
155  vtkSmartPointer<vtkCamera> m_camera;
156 
157  // lights
158  using VtkLightPair = std::pair<std::shared_ptr<Light>, vtkSmartPointer<vtkLight>>;
159  std::vector<VtkLightPair> m_vtkLights;
160 
161  // Props to be rendered
162  std::vector<vtkSmartPointer<vtkProp>> m_objectVtkActors;
163  std::vector<vtkSmartPointer<vtkProp>> m_debugVtkActors;
164 
165  // imstk scene
166  std::shared_ptr<Scene> m_scene;
167 
168  // Rendered Objects, this gives whats currently being rendered
169  std::unordered_set<std::shared_ptr<Entity>> m_renderedObjects;
170  std::unordered_map<std::shared_ptr<Entity>, std::unordered_set<std::shared_ptr<VisualModel>>> m_renderedVisualModels;
171 
172  // Render Delegates
173  std::unordered_map<std::shared_ptr<VisualModel>, std::shared_ptr<VTKRenderDelegate>> m_renderDelegates;
174 
175  // TextureManager is used to share textures among differing delegates
176  std::shared_ptr<TextureManager<VTKTextureDelegate>> m_textureManager;
177 
178  // Performance chart overlay
179  vtkSmartPointer<vtkChartXY> m_timeTableChart;
180  vtkSmartPointer<vtkContextActor> m_timeTableChartActor;
181  vtkSmartPointer<vtkTable> m_timeTable;
182  vtkPlotBar* m_timeTablePlot;
183  int m_timeTableIter = 0;
184 
185  // SSAO Effect
186  vtkSmartPointer<vtkSSAOPass> m_ssaoPass;
187  vtkSmartPointer<vtkRenderStepsPass> m_renderStepsPass;
188 
189  bool m_debugActorsVisible;
190 };
191 } // namespace imstk
void updateBackground(const Vec3d color1, const Vec3d color2=Vec3d::Zero(), const bool gradientBackground=false)
Update background colors.
void sceneModifed(Event *e)
Callback for when the scene this renderer renders is modified This involves adding/removing scene obj...
void setTimeTableVisibility(const bool visible) override
Get/Set the visibility of the benchmark graph.
void addVisualModel(std::shared_ptr< Entity > sceneObject, std::shared_ptr< VisualModel > visualModel)
Add a VisualModel to be rendered, creates a delegate for it.
Base class for events which contain a type, priority, and data priority defaults to 0 and uses a grea...
void updateCamera()
Updates the camera.
void addEntity(std::shared_ptr< Entity > sceneObject)
Adds an entity to be rendered.
void setTimeTable(const std::unordered_map< std::string, double > &timeTable) override
Sets the benchmarking table using unordered_map.
void addActors(const std::vector< vtkSmartPointer< vtkProp >> &actorList)
Add actors (also called props) from the scene.
Compound Geometry.
std::unordered_set< std::shared_ptr< Entity > >::iterator removeEntity(std::shared_ptr< Entity > sceneObject)
Removes a SceneObject to be rendered.
void setConfig(std::shared_ptr< RendererConfig > config) override
Apply configuration changes.
Rendering window manager and contains user API to configure the rendering with various backends...
Definition: imstkRenderer.h:41
void setMode(const Mode mode, const bool enableVR) override
Set the rendering mode to display debug actors or not.
void entityModified(Event *e)
Callback for when a SceneObject is modified This involves adding/removing visual models to render lis...
vtkSmartPointer< vtkRenderer > getVtkRenderer() const
Returns VTK renderer.
std::unordered_set< std::shared_ptr< VisualModel > >::iterator removeVisualModel(std::shared_ptr< Entity > sceneObject, std::shared_ptr< VisualModel > visualModel)
Remove a VisualModel from rendering.
Mode
Enumerations for the render mode.
Definition: imstkRenderer.h:47
VTKRenderer(std::shared_ptr< Scene > scene, const bool enableVR)
Scene is tied to this renderer.
void removeActors(const std::vector< vtkSmartPointer< vtkProp >> &actorList)
Remove actors (also called props) from the scene.
Wraps a vtkRenderer.
void initialize() override
Create the rendering delegates and related VTK objects according to the scene.
void updateRenderDelegates()
Updates the render delegates.