Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkVtkLayerController.h"
00019
00020 #include <vtkRenderWindow.h>
00021 #include <vtkRenderer.h>
00022 #include <vtkObjectFactory.h>
00023 #include <vtkRendererCollection.h>
00024 #include <algorithm>
00025
00026 mitk::VtkLayerController::vtkLayerControllerMapType mitk::VtkLayerController::s_LayerControllerMap;
00027
00028 mitk::VtkLayerController * mitk::VtkLayerController::GetInstance(vtkRenderWindow* renWin)
00029 {
00030 for(vtkLayerControllerMapType::iterator mapit = s_LayerControllerMap.begin();
00031 mapit != s_LayerControllerMap.end(); mapit++)
00032 {
00033 if( (*mapit).first == renWin)
00034 return (*mapit).second;
00035
00036 }
00037 return NULL;
00038 }
00039
00040 void mitk::VtkLayerController::AddInstance(vtkRenderWindow* renWin, vtkRenderer * mitkSceneRenderer)
00041 {
00042
00043 mitk::VtkLayerController::RemoveInstance(renWin);
00044
00045
00046 mitk::VtkLayerController* ControllerInstance = new mitk::VtkLayerController(renWin);
00047 ControllerInstance->InsertSceneRenderer(mitkSceneRenderer);
00048
00049 s_LayerControllerMap.insert(vtkLayerControllerMapType::value_type(renWin,ControllerInstance));
00050 }
00051
00052 void mitk::VtkLayerController::RemoveInstance(vtkRenderWindow* renWin)
00053 {
00054 vtkLayerControllerMapType::iterator mapit = s_LayerControllerMap.find(renWin);
00055 if(mapit != s_LayerControllerMap.end())
00056 {
00057 delete mapit->second;
00058 s_LayerControllerMap.erase( mapit );
00059 }
00060 }
00061
00062 mitk::VtkLayerController::VtkLayerController(vtkRenderWindow* renderWindow)
00063 {
00064 m_RenderWindow = renderWindow;
00065 m_RenderWindow->Register( NULL );
00066 m_BackgroundRenderers.clear();
00067 m_ForegroundRenderers.clear();
00068 m_SceneRenderers.clear();
00069
00070 }
00071
00072 mitk::VtkLayerController::~VtkLayerController()
00073 {
00074 if ( m_RenderWindow != NULL )
00075 {
00076 m_RenderWindow->UnRegister( NULL );
00077 }
00078 }
00079
00085 void mitk::VtkLayerController::InsertBackgroundRenderer(vtkRenderer* renderer, bool forceAbsoluteBackground)
00086 {
00087
00088 if(renderer == NULL)
00089 return;
00090
00091
00092 RemoveRenderer(renderer);
00093
00094 if(forceAbsoluteBackground)
00095 {
00096 RendererVectorType::iterator it = m_BackgroundRenderers.begin();
00097 m_BackgroundRenderers.insert(it,renderer);
00098 }
00099 else
00100 m_BackgroundRenderers.push_back(renderer);
00101 UpdateLayers();
00102 }
00108 void mitk::VtkLayerController::InsertForegroundRenderer(vtkRenderer* renderer, bool forceAbsoluteForeground)
00109 {
00110
00111 if(renderer == NULL)
00112 return;
00113
00114
00115 RemoveRenderer(renderer);
00116
00117 if(forceAbsoluteForeground)
00118 {
00119 RendererVectorType::iterator it = m_ForegroundRenderers.begin();
00120 m_ForegroundRenderers.insert(it,renderer);
00121 }
00122 else
00123 m_ForegroundRenderers.push_back(renderer);
00124
00125 UpdateLayers();
00126 }
00130 vtkRenderer* mitk::VtkLayerController::GetSceneRenderer()
00131 {
00132 if(m_SceneRenderers.size() > 0)
00133 {
00134 RendererVectorType::iterator it = m_SceneRenderers.begin();
00135 return (*it);
00136 }
00137 else
00138 return NULL;
00139 }
00144 void mitk::VtkLayerController::InsertSceneRenderer(vtkRenderer* renderer)
00145 {
00146
00147 if(renderer == NULL)
00148 return;
00149
00150
00151 RemoveRenderer(renderer);
00152
00153 m_SceneRenderers.push_back(renderer);
00154 UpdateLayers();
00155 }
00160 void mitk::VtkLayerController::RemoveRenderer(vtkRenderer* renderer)
00161 {
00162 RendererVectorType::iterator it;
00163
00164 if(m_BackgroundRenderers.size() > 0)
00165 {
00166 it = std::find(m_BackgroundRenderers.begin(),m_BackgroundRenderers.end(),renderer);
00167 if(it != m_BackgroundRenderers.end())
00168 {
00169 m_BackgroundRenderers.erase(it);
00170 UpdateLayers();
00171 return;
00172 }
00173 }
00174
00175 if(m_SceneRenderers.size() > 0)
00176 {
00177 it = std::find(m_SceneRenderers.begin(),m_SceneRenderers.end(),renderer);
00178 if(it != m_SceneRenderers.end())
00179 {
00180 m_SceneRenderers.erase(it);
00181 UpdateLayers();
00182 return;
00183 }
00184 }
00185
00186 if(m_ForegroundRenderers.size() > 0 )
00187 {
00188 it = std::find(m_ForegroundRenderers.begin(),m_ForegroundRenderers.end(),renderer);
00189 if(it != m_ForegroundRenderers.end())
00190 {
00191 m_ForegroundRenderers.erase(it);
00192 UpdateLayers();
00193 return;
00194 }
00195 }
00196 }
00200 void mitk::VtkLayerController::SetRenderWindow(vtkRenderWindow* renwin)
00201 {
00202 if(renwin != NULL)
00203 {
00204 RendererVectorType::iterator it;
00205
00206 for(it = m_BackgroundRenderers.begin(); it != m_BackgroundRenderers.end(); it++)
00207 {
00208 (*it)->SetRenderWindow(renwin);
00209 }
00210 for(it = m_SceneRenderers.begin(); it != m_SceneRenderers.end(); it++)
00211 {
00212 (*it)->SetRenderWindow(renwin);
00213 }
00214 for(it = m_ForegroundRenderers.begin(); it != m_ForegroundRenderers.end(); it++)
00215 {
00216 (*it)->SetRenderWindow(renwin);
00217 }
00218
00219 m_RenderWindow = renwin;
00220 }
00221
00222 UpdateLayers();
00223 }
00224
00228 bool mitk::VtkLayerController::IsRendererInserted(vtkRenderer* renderer)
00229 {
00230 RendererVectorType::iterator it;
00231
00232 if(m_BackgroundRenderers.size() > 0)
00233 {
00234 it = std::find(m_BackgroundRenderers.begin(),m_BackgroundRenderers.end(),renderer);
00235 if ( it != m_BackgroundRenderers.end() )
00236 {
00237 return true;
00238 }
00239 }
00240
00241 if(m_SceneRenderers.size() > 0)
00242 {
00243 it = std::find(m_SceneRenderers.begin(),m_SceneRenderers.end(),renderer);
00244 if ( it != m_SceneRenderers.end() )
00245 {
00246 return true;
00247 }
00248 }
00249
00250 if(m_ForegroundRenderers.size() > 0 )
00251 {
00252 it = std::find(m_ForegroundRenderers.begin(),m_ForegroundRenderers.end(),renderer);
00253 if ( it != m_ForegroundRenderers.end() )
00254 {
00255 return true;
00256 }
00257 }
00258 return false;
00259
00260 }
00266 void mitk::VtkLayerController::UpdateLayers()
00267 {
00268
00269 vtkRendererCollection* v = m_RenderWindow->GetRenderers();
00270 v->RemoveAllItems();
00271
00272
00273 unsigned int numberOfLayers = static_cast<unsigned int>(m_BackgroundRenderers.size() + m_SceneRenderers.size() + m_ForegroundRenderers.size());
00274 int currentLayerNumber;
00275 bool traverseUpwards;
00276
00277 #if ( VTK_MAJOR_VERSION >= 5 )
00278 currentLayerNumber = 0;
00279 traverseUpwards = true;
00280 #else
00281 currentLayerNumber = numberOfLayers - 1;
00282 traverseUpwards = false;
00283 #endif
00284
00285
00286 m_RenderWindow->SetNumberOfLayers(numberOfLayers);
00287 RendererVectorType::iterator it;
00288
00289 for(it = m_BackgroundRenderers.begin(); it != m_BackgroundRenderers.end(); it++)
00290 {
00291 (*it)->SetRenderWindow(m_RenderWindow);
00292 (*it)->SetLayer(currentLayerNumber);
00293 m_RenderWindow->AddRenderer((*it));
00294
00295 if(traverseUpwards)
00296 currentLayerNumber++;
00297 else
00298 currentLayerNumber--;
00299 }
00300
00301 for(it = m_SceneRenderers.begin(); it != m_SceneRenderers.end(); it++)
00302 {
00303 (*it)->SetRenderWindow(m_RenderWindow);
00304 (*it)->SetLayer(currentLayerNumber);
00305 m_RenderWindow->AddRenderer((*it));
00306
00307 if(traverseUpwards)
00308 currentLayerNumber++;
00309 else
00310 currentLayerNumber--;
00311 }
00312
00313 for(it = m_ForegroundRenderers.begin(); it != m_ForegroundRenderers.end(); it++)
00314 {
00315 (*it)->SetRenderWindow(m_RenderWindow);
00316 (*it)->SetLayer(currentLayerNumber);
00317 m_RenderWindow->AddRenderer((*it));
00318
00319 if(traverseUpwards)
00320 currentLayerNumber++;
00321 else
00322 currentLayerNumber--;
00323 }
00324 }
00328 unsigned int mitk::VtkLayerController::GetNumberOfRenderers()
00329 {
00330 return static_cast<unsigned int>(m_BackgroundRenderers.size() + m_SceneRenderers.size() + m_ForegroundRenderers.size());
00331 }
00332
00333 void mitk::VtkLayerController::SetEraseForAllRenderers(int i)
00334 {
00335 #if ( VTK_MAJOR_VERSION >= 5 )
00336
00337 this->m_RenderWindow->SetErase(i);
00338
00339 RendererVectorType::iterator it;
00340 for(it = m_BackgroundRenderers.begin(); it != m_BackgroundRenderers.end(); it++)
00341 (*it)->SetErase(i);
00342
00343 for(it = m_SceneRenderers.begin(); it != m_SceneRenderers.end(); it++)
00344 (*it)->SetErase(i);
00345
00346 for(it = m_ForegroundRenderers.begin(); it != m_ForegroundRenderers.end(); it++)
00347 (*it)->SetErase(i);
00348
00349 #endif
00350 }
00351