11#include " vtkMRMLLayerDMLayerManager.h"
22
33// Layer DM includes
4+ #include " vtkMRMLLayerDMObjectEventObserver.h"
45#include " vtkMRMLLayerDMPipelineI.h"
56
67// VTK includes
1314
1415vtkStandardNewMacro (vtkMRMLLayerDMLayerManager);
1516
16- void vtkMRMLLayerDMLayerManager::AddPipeline (vtkMRMLLayerDMPipelineI* pipeline)
17+ bool vtkMRMLLayerDMLayerManager::AddPipelineLayers (vtkMRMLLayerDMPipelineI* pipeline)
1718{
1819 if (!pipeline)
1920 {
20- return ;
21+ return false ;
2122 }
2223
23- auto key = this ->GetPipelineLayerKey (pipeline);
24- if (!this ->ContainsLayerKey (key))
24+ for (const auto order : pipeline->GetRenderOrders ())
2525 {
26- this ->m_pipelineLayers [key] = {};
26+ auto key = std::make_tuple (order, GetCameraId (pipeline->GetCustomCamera (order)));
27+ if (!this ->ContainsLayerKey (key))
28+ {
29+ this ->m_pipelineLayers [key] = {};
30+ }
31+ this ->m_pipelineLayers [key].emplace (pipeline);
2732 }
28- this ->m_pipelineLayers [key].emplace (pipeline);
29- this ->UpdateLayers ();
33+ return true ;
3034}
3135
32- vtkMRMLLayerDMLayerManager::LayerKey vtkMRMLLayerDMLayerManager::GetPipelineLayerKey (vtkMRMLLayerDMPipelineI* pipeline)
36+ void vtkMRMLLayerDMLayerManager::AddPipeline (vtkMRMLLayerDMPipelineI* pipeline)
3337{
3438 if (!pipeline)
3539 {
36- return {} ;
40+ return ;
3741 }
38- return { pipeline->GetRenderOrder (), vtkMRMLLayerDMLayerManager::GetCameraId (pipeline->GetCustomCamera ()) };
42+
43+ this ->m_obs ->UpdateObserver (nullptr , pipeline, vtkMRMLLayerDMPipelineI::RenderGroupingModified);
44+ this ->AddPipelineLayers (pipeline);
45+ this ->UpdateLayers ();
3946}
4047
4148int vtkMRMLLayerDMLayerManager::GetNumberOfDistinctLayers () const
@@ -53,24 +60,24 @@ int vtkMRMLLayerDMLayerManager::GetNumberOfRenderers() const
5360 return static_cast <int >(this ->m_renderers .size ());
5461}
5562
56- void vtkMRMLLayerDMLayerManager::RemovePipeline (vtkMRMLLayerDMPipelineI* pipeline)
63+ void vtkMRMLLayerDMLayerManager::RemovePipelineLayers (vtkMRMLLayerDMPipelineI* pipeline)
5764{
58- if (!pipeline )
65+ for ( auto & [key, pipelines] : m_pipelineLayers )
5966 {
60- return ;
67+ pipelines. erase (pipeline) ;
6168 }
69+ }
6270
63- auto key = this ->GetPipelineLayerKey (pipeline);
64- if (!this ->ContainsLayerKey (key))
71+ void vtkMRMLLayerDMLayerManager::RemovePipeline (vtkMRMLLayerDMPipelineI* pipeline)
72+ {
73+ if (!pipeline)
6574 {
6675 return ;
6776 }
6877
69- // Remove pipeline from its renderer
78+ this -> m_obs -> UpdateObserver ( pipeline, nullptr );
7079 this ->RemovePipelineRenderer (pipeline);
71-
72- // Update the other pipeline layers if needed
73- this ->m_pipelineLayers [key].erase (pipeline);
80+ this ->RemovePipelineLayers (pipeline);
7481 this ->UpdateLayers ();
7582}
7683
@@ -114,7 +121,18 @@ void vtkMRMLLayerDMLayerManager::SetDefaultCamera(const vtkSmartPointer<vtkCamer
114121
115122vtkMRMLLayerDMLayerManager::vtkMRMLLayerDMLayerManager ()
116123 : m_emptyPipeline(vtkSmartPointer<vtkMRMLLayerDMPipelineI>::New())
124+ , m_obs(vtkSmartPointer<vtkMRMLLayerDMObjectEventObserver>::New())
117125{
126+ this ->m_obs ->SetUpdateCallback (
127+ [this ](vtkObject* obj)
128+ {
129+ if (auto pipeline = vtkMRMLLayerDMPipelineI::SafeDownCast (obj))
130+ {
131+ this ->RemovePipelineLayers (pipeline);
132+ this ->AddPipelineLayers (pipeline);
133+ this ->UpdateLayers ();
134+ }
135+ });
118136 this ->AddPipeline (this ->m_emptyPipeline );
119137}
120138
@@ -201,7 +219,7 @@ vtkCamera* vtkMRMLLayerDMLayerManager::GetCameraForLayer(const LayerKey& key, co
201219 {
202220 if (pipeline)
203221 {
204- return pipeline->GetCustomCamera ();
222+ return pipeline->GetCustomCamera (std::get< 0 >(key) );
205223 }
206224 }
207225
@@ -248,7 +266,7 @@ void vtkMRMLLayerDMLayerManager::RemovePipelineRenderer(vtkMRMLLayerDMPipelineI*
248266{
249267 if (pipeline)
250268 {
251- pipeline->SetRenderer ( nullptr );
269+ pipeline->SetRenderers ({}, {} );
252270 }
253271}
254272
@@ -304,17 +322,27 @@ void vtkMRMLLayerDMLayerManager::ResetRenderersCameraClippingRange(const std::se
304322
305323void vtkMRMLLayerDMLayerManager::SynchronizePipelineRenderers ()
306324{
307- for (const auto & pair : m_pipelineLayers)
325+ std::map<vtkMRMLLayerDMPipelineI*, std::vector<vtkRenderer*>> pipelineRenderers;
326+ std::map<vtkMRMLLayerDMPipelineI*, std::vector<unsigned int >> pipelineOrders;
327+
328+ for (const auto & [key, pipelines] : m_pipelineLayers)
308329 {
309- auto renderer = this ->GetRendererMatchingKey (pair.first );
310- for (const auto & pipeline : pair.second )
330+ auto renderer = this ->GetRendererMatchingKey (key);
331+ auto order = std::get<0 >(key);
332+ for (const auto & pipeline : pipelines)
311333 {
312334 if (pipeline)
313335 {
314- pipeline->SetRenderer (renderer);
336+ pipelineRenderers[pipeline.GetPointer ()].push_back (renderer);
337+ pipelineOrders[pipeline.GetPointer ()].push_back (order);
315338 }
316339 }
317340 }
341+
342+ for (auto & [pipeline, renderers] : pipelineRenderers)
343+ {
344+ pipeline->SetRenderers (renderers, pipelineOrders[pipeline]);
345+ }
318346}
319347
320348void vtkMRMLLayerDMLayerManager::UpdateRenderWindowNumberOfLayers () const
0 commit comments