Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkVtkLayerController.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "mitkVtkLayerController.h"
14 
15 #include <algorithm>
16 #include <vtkObjectFactory.h>
17 #include <vtkRenderWindow.h>
18 #include <vtkRenderer.h>
19 #include <vtkRendererCollection.h>
20 
21 mitk::VtkLayerController::vtkLayerControllerMapType mitk::VtkLayerController::s_LayerControllerMap;
22 
23 mitk::VtkLayerController *mitk::VtkLayerController::GetInstance(vtkSmartPointer<vtkRenderWindow> renWin)
24 {
25  for (auto mapit = s_LayerControllerMap.begin(); mapit != s_LayerControllerMap.end(); ++mapit)
26  {
27  if ((*mapit).first == renWin)
28  return (*mapit).second;
29  }
30  return nullptr;
31 }
32 
33 void mitk::VtkLayerController::AddInstance(vtkSmartPointer<vtkRenderWindow> renWin,
34  vtkSmartPointer<vtkRenderer> mitkSceneRenderer)
35 {
36  // ensure that no vtkRenderWindow is managed twice
38 
39  // instanciate controller, add it to the map
40  mitk::VtkLayerController *ControllerInstance = new mitk::VtkLayerController(renWin);
41  ControllerInstance->InsertSceneRenderer(mitkSceneRenderer);
42 
43  s_LayerControllerMap.insert(vtkLayerControllerMapType::value_type(renWin, ControllerInstance));
44 }
45 
46 void mitk::VtkLayerController::RemoveInstance(vtkSmartPointer<vtkRenderWindow> renWin)
47 {
48  auto mapit = s_LayerControllerMap.find(renWin);
49  if (mapit != s_LayerControllerMap.end())
50  {
51  delete mapit->second;
52  s_LayerControllerMap.erase(mapit);
53  }
54 }
55 
56 mitk::VtkLayerController::VtkLayerController(vtkSmartPointer<vtkRenderWindow> renderWindow)
57 {
58  m_RenderWindow = renderWindow;
59  m_RenderWindow->Register(nullptr);
60  m_BackgroundRenderers.clear();
61  m_ForegroundRenderers.clear();
62  m_SceneRenderers.clear();
63 }
64 
66 {
67  if (m_RenderWindow != nullptr)
68  {
69  m_RenderWindow->UnRegister(nullptr);
70  }
71 }
72 
78 void mitk::VtkLayerController::InsertBackgroundRenderer(vtkSmartPointer<vtkRenderer> renderer,
79  bool forceAbsoluteBackground)
80 {
81  if (renderer == nullptr)
82  return;
83 
84  // Remove renderer if it already exists
85  RemoveRenderer(renderer);
86 
87  if (forceAbsoluteBackground)
88  {
89  auto it = m_BackgroundRenderers.begin();
90  m_BackgroundRenderers.insert(it, renderer);
91  }
92  else
93  m_BackgroundRenderers.push_back(renderer);
94  UpdateLayers();
95 }
101 void mitk::VtkLayerController::InsertForegroundRenderer(vtkSmartPointer<vtkRenderer> renderer,
102  bool forceAbsoluteForeground)
103 {
104  if (renderer == nullptr)
105  return;
106 
107  // Remove renderer if it already exists
108  RemoveRenderer(renderer);
109 
110  if (forceAbsoluteForeground)
111  {
112  auto it = m_ForegroundRenderers.begin();
113  m_ForegroundRenderers.insert(it, renderer);
114  }
115  else
116  m_ForegroundRenderers.push_back(renderer);
117 
118  renderer->PreserveDepthBufferOn();
119  UpdateLayers();
120 }
124 vtkSmartPointer<vtkRenderer> mitk::VtkLayerController::GetSceneRenderer()
125 {
126  if (m_SceneRenderers.size() > 0)
127  {
128  auto it = m_SceneRenderers.begin();
129  return (*it);
130  }
131  else
132  return nullptr;
133 }
138 void mitk::VtkLayerController::InsertSceneRenderer(vtkSmartPointer<vtkRenderer> renderer)
139 {
140  if (renderer == nullptr)
141  return;
142 
143  // Remove renderer if it already exists
144  RemoveRenderer(renderer);
145 
146  m_SceneRenderers.push_back(renderer);
147  UpdateLayers();
148 }
153 void mitk::VtkLayerController::RemoveRenderer(vtkSmartPointer<vtkRenderer> renderer)
154 {
155  RendererVectorType::iterator it;
156  // background layers
157  if (m_BackgroundRenderers.size() > 0)
158  {
159  it = std::find(m_BackgroundRenderers.begin(), m_BackgroundRenderers.end(), renderer);
160  if (it != m_BackgroundRenderers.end())
161  {
162  m_BackgroundRenderers.erase(it);
163  UpdateLayers();
164  return;
165  }
166  }
167  // scene layers
168  if (m_SceneRenderers.size() > 0)
169  {
170  it = std::find(m_SceneRenderers.begin(), m_SceneRenderers.end(), renderer);
171  if (it != m_SceneRenderers.end())
172  {
173  m_SceneRenderers.erase(it);
174  UpdateLayers();
175  return;
176  }
177  }
178  // foreground layers
179  if (m_ForegroundRenderers.size() > 0)
180  {
181  it = std::find(m_ForegroundRenderers.begin(), m_ForegroundRenderers.end(), renderer);
182  if (it != m_ForegroundRenderers.end())
183  {
184  m_ForegroundRenderers.erase(it);
185  UpdateLayers();
186  return;
187  }
188  }
189 }
193 void mitk::VtkLayerController::SetRenderWindow(vtkSmartPointer<vtkRenderWindow> renwin)
194 {
195  if (renwin != nullptr)
196  {
197  RendererVectorType::iterator it;
198  // Tell all renderers that there is a new renderwindow
199  for (it = m_BackgroundRenderers.begin(); it != m_BackgroundRenderers.end(); ++it)
200  {
201  (*it)->SetRenderWindow(renwin);
202  }
203  for (it = m_SceneRenderers.begin(); it != m_SceneRenderers.end(); ++it)
204  {
205  (*it)->SetRenderWindow(renwin);
206  }
207  for (it = m_ForegroundRenderers.begin(); it != m_ForegroundRenderers.end(); ++it)
208  {
209  (*it)->SetRenderWindow(renwin);
210  }
211  // Set the new RenderWindow
212  m_RenderWindow = renwin;
213  }
214  // Now sort renderers and add them to the renderwindow
215  UpdateLayers();
216 }
217 
221 bool mitk::VtkLayerController::IsRendererInserted(vtkSmartPointer<vtkRenderer> renderer)
222 {
223  RendererVectorType::iterator it;
224  // background layers
225  if (m_BackgroundRenderers.size() > 0)
226  {
227  it = std::find(m_BackgroundRenderers.begin(), m_BackgroundRenderers.end(), renderer);
228  if (it != m_BackgroundRenderers.end())
229  {
230  return true;
231  }
232  }
233  // scene layers
234  if (m_SceneRenderers.size() > 0)
235  {
236  it = std::find(m_SceneRenderers.begin(), m_SceneRenderers.end(), renderer);
237  if (it != m_SceneRenderers.end())
238  {
239  return true;
240  }
241  }
242  // foreground layers
243  if (m_ForegroundRenderers.size() > 0)
244  {
245  it = std::find(m_ForegroundRenderers.begin(), m_ForegroundRenderers.end(), renderer);
246  if (it != m_ForegroundRenderers.end())
247  {
248  return true;
249  }
250  }
251  return false;
252 }
258 void mitk::VtkLayerController::UpdateLayers()
259 {
260  // Remove all Renderers from renderwindow
261  vtkSmartPointer<vtkRendererCollection> v = m_RenderWindow->GetRenderers();
262  v->RemoveAllItems();
263 
264  auto numberOfLayers =
265  static_cast<unsigned int>(m_BackgroundRenderers.size() + m_SceneRenderers.size() + m_ForegroundRenderers.size());
266  int currentLayerNumber;
267  bool traverseUpwards;
268 
269  currentLayerNumber = 0;
270  traverseUpwards = true;
271 
272  m_RenderWindow->SetNumberOfLayers(numberOfLayers);
273  RendererVectorType::iterator it;
274  // assign a layer number for the backround renderers
275  for (it = m_BackgroundRenderers.begin(); it != m_BackgroundRenderers.end(); ++it)
276  {
277  (*it)->SetRenderWindow(m_RenderWindow);
278  (*it)->SetLayer(currentLayerNumber);
279  m_RenderWindow->AddRenderer((*it));
280 
281  if (traverseUpwards)
282  currentLayerNumber++;
283  else
284  currentLayerNumber--;
285  }
286  // assign a layer number for the scene renderers
287  for (it = m_SceneRenderers.begin(); it != m_SceneRenderers.end(); ++it)
288  {
289  (*it)->SetRenderWindow(m_RenderWindow);
290  (*it)->SetLayer(currentLayerNumber);
291  m_RenderWindow->AddRenderer((*it));
292 
293  if (traverseUpwards)
294  currentLayerNumber++;
295  else
296  currentLayerNumber--;
297  }
298  // assign a layer number for the foreground renderers
299  for (it = m_ForegroundRenderers.begin(); it != m_ForegroundRenderers.end(); ++it)
300  {
301  (*it)->SetRenderWindow(m_RenderWindow);
302  (*it)->SetLayer(currentLayerNumber);
303  m_RenderWindow->AddRenderer((*it));
304 
305  if (traverseUpwards)
306  currentLayerNumber++;
307  else
308  currentLayerNumber--;
309  }
310 }
315 {
316  return static_cast<unsigned int>(m_BackgroundRenderers.size() + m_SceneRenderers.size() +
317  m_ForegroundRenderers.size());
318 }
319 
321 {
322  this->m_RenderWindow->SetErase(i);
323 
324  RendererVectorType::iterator it;
325  for (it = m_BackgroundRenderers.begin(); it != m_BackgroundRenderers.end(); ++it)
326  (*it)->SetErase(i);
327 
328  for (it = m_SceneRenderers.begin(); it != m_SceneRenderers.end(); ++it)
329  (*it)->SetErase(i);
330 
331  for (it = m_ForegroundRenderers.begin(); it != m_ForegroundRenderers.end(); ++it)
332  (*it)->SetErase(i);
333 }
vtkSmartPointer< vtkRenderWindow > m_RenderWindow
void InsertSceneRenderer(vtkSmartPointer< vtkRenderer > renderer)
void InsertForegroundRenderer(vtkSmartPointer< vtkRenderer > renderer, bool forceAbsoluteForeground)
static void AddInstance(vtkSmartPointer< vtkRenderWindow > renWin, vtkSmartPointer< vtkRenderer > mitkSceneRenderer)
static VtkLayerController * GetInstance(vtkSmartPointer< vtkRenderWindow > renWin)
void SetRenderWindow(vtkSmartPointer< vtkRenderWindow > renwin)
VtkLayerController(vtkSmartPointer< vtkRenderWindow > renderWindow)
vtkSmartPointer< vtkRenderer > GetSceneRenderer()
void RemoveRenderer(vtkSmartPointer< vtkRenderer > renderer)
bool IsRendererInserted(vtkSmartPointer< vtkRenderer > renderer)
void InsertBackgroundRenderer(vtkSmartPointer< vtkRenderer > renderer, bool forceAbsoluteBackground)
static void RemoveInstance(vtkSmartPointer< vtkRenderWindow > renWin)