Slicer 5.13
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkMRMLLayerDMLayerManager.h
Go to the documentation of this file.
1/*==============================================================================
2
3 Program: 3D Slicer
4
5 Copyright (c) Kitware SAS
6
7 See COPYRIGHT.txt
8 or http://www.slicer.org/copyright/copyright.txt for details.
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15
16 This file was originally developed by Thibault Pelletier, Kitware SAS,
17 and was partially funded by ANR grants ANR-22-CE45-0034 and ANR-18-RHUS-005.
18
19==============================================================================*/
20
21#ifndef __vtkMRMLLayerDMLayerManager_h
22#define __vtkMRMLLayerDMLayerManager_h
23
24#include "vtkSlicerLayerDMModuleMRMLDisplayableManagerExport.h"
25
27
28// VTK includes
29#include <vtkObject.h>
30#include <vtkSmartPointer.h>
31#include <vtkWeakPointer.h>
32
33// STL includes
34#include <array>
35#include <cstdint>
36#include <map>
37#include <set>
38#include <vector>
39
41class vtkRenderWindow;
42class vtkRenderer;
43class vtkCamera;
45
57class VTK_SLICER_LAYERDM_MODULE_MRMLDISPLAYABLEMANAGER_EXPORT vtkMRMLLayerDMLayerManager : public vtkObject
58{
59public:
60 using LayerKey = std::tuple<unsigned int, std::uintptr_t>;
61
63 vtkTypeMacro(vtkMRMLLayerDMLayerManager, vtkObject);
64 void PrintSelf(ostream& os, vtkIndent indent) override;
65
70
73
76
80
83
86 void SetRenderWindow(vtkRenderWindow* renderWindow);
87
89 void SetDefaultCamera(const vtkSmartPointer<vtkCamera>& camera);
90
91protected:
94
95private:
96 vtkRenderer* GetRendererMatchingKey(const LayerKey& key);
97 vtkRenderer* GetDefaultRenderer() const;
98
99 void AddMissingLayers();
100 static std::array<double, 6> ComputeRenderersVisibleBounds(const std::vector<vtkWeakPointer<vtkRenderer>>& renderers);
101 bool ContainsLayerKey(const LayerKey& key);
102 static std::uintptr_t GetCameraId(vtkCamera* camera);
103 vtkCamera* GetCameraForLayer(const LayerKey& key, const std::set<vtkMRMLLayerDMPipeline*>& pipelines) const;
104 int GetKeyIndex(const LayerKey& key) const;
105 void RemoveAllLayers();
106 void RemoveAllPipelineRenderers();
107 static void RemovePipelineRenderer(vtkMRMLLayerDMPipeline* pipeline);
108 void RemoveOutdatedLayers();
109 void RemoveOutdatedPipelines();
110 void RemoveRenderer(const vtkSmartPointer<vtkRenderer>& renderer);
111 static void ResetRenderersCameraClippingRange(const std::vector<vtkWeakPointer<vtkRenderer>>& renderers, const std::array<double, 6>& bounds);
112 void SynchronizePipelineRenderers();
113 void UpdateRenderWindowNumberOfLayers() const;
114 void UpdateLayers();
115 void UpdateRendererLayerOrdering() const;
116 void UpdateRendererCamera();
117
118 bool AddPipelineLayers(vtkMRMLLayerDMPipeline* pipeline);
119 void RemovePipelineLayers(vtkMRMLLayerDMPipeline* pipeline);
120
121 // Map of pipeline layers ordered by ascending <layer value, camera synchronization mode>
122 std::map<LayerKey, std::set<vtkMRMLLayerDMPipeline*>> PipelineLayers;
123
124 // Pipeline observer listening for \sa vtkMRMLLayerDMPipeline::RenderGroupingModified events and pipeline
125 // destruction.
126 vtkSmartPointer<vtkMRMLLayerDMObjectEventObserver> Observer;
127
128 // Placeholder empty pipeline with target layer = 0 and camera sync to layer 0 for default renderer
129 vtkSmartPointer<vtkMRMLLayerDMPipeline> EmptyPipeline;
130
131 // Pointer to the current render window
132 vtkWeakPointer<vtkRenderWindow> RenderWindow;
133
134 // Pointer to the default camera
135 vtkSmartPointer<vtkCamera> DefaultCamera;
136
137 // Renderers managed by the layer manager
138 std::vector<vtkSmartPointer<vtkRenderer>> Renderers;
139
140 // Camera to renderer map grouped by the camera they are synchronized on.
141 std::map<std::uintptr_t, std::vector<vtkWeakPointer<vtkRenderer>>> CameraRendererMap;
142};
143
144#endif
int GetNumberOfRenderers() const
Returns the current number of managed renderers in the render window.
void PrintSelf(ostream &os, vtkIndent indent) override
static vtkMRMLLayerDMLayerManager * New()
int GetNumberOfManagedLayers() const
void RemovePipeline(vtkMRMLLayerDMPipeline *pipeline)
void AddPipeline(vtkMRMLLayerDMPipeline *pipeline)
int GetNumberOfDistinctLayers() const
~vtkMRMLLayerDMLayerManager() override
void SetDefaultCamera(const vtkSmartPointer< vtkCamera > &camera)
If the default camera has changed, update the layers with ne new camera.
std::tuple< unsigned int, std::uintptr_t > LayerKey
void ResetCameraClippingRange() const
Iterates over the renderers and resets their clipping range to visible bounds.
void SetRenderWindow(vtkRenderWindow *renderWindow)
VTK object observer with one callback endpoint when an event is triggered. Can observe multiple objec...
Interface for the layered displayable manager pipelines.