00001 /*========================================================================= 00002 00003 Program: Medical Imaging & Interaction Toolkit 00004 Language: C++ 00005 Date: $Date$ 00006 Version: $Revision$ 00007 00008 Copyright (c) German Cancer Research Center, Division of Medical and 00009 Biological Informatics. All rights reserved. 00010 See MITKCopyright.txt or https://www.mitk.org/copyright.html for details. 00011 00012 This software is distributed WITHOUT ANY WARRANTY; without even 00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00014 PURPOSE. See the above copyright notices for more information. 00015 00016 =========================================================================*/ 00017 00018 00019 #ifndef BASERENDERER_H_HEADER_INCLUDED_C1CCA0F4 00020 #define BASERENDERER_H_HEADER_INCLUDED_C1CCA0F4 00021 00022 #include "mitkDataStorage.h" 00023 #include "mitkGeometry2D.h" 00024 #include "mitkTimeSlicedGeometry.h" 00025 #include "mitkDisplayGeometry.h" 00026 #include "mitkGeometry2DData.h" 00027 #include "mitkCameraController.h" 00028 #include "mitkDisplayPositionEvent.h" 00029 #include "mitkWheelEvent.h" 00030 00031 //#include "mitkMapper.h" 00032 00033 #include "mitkSliceNavigationController.h" 00034 #include "mitkCameraController.h" 00035 #include "mitkCameraRotationController.h" 00036 00037 #include <vtkRenderWindow.h> 00038 #include <vtkRenderer.h> 00039 00040 #include <map> 00041 #include <set> 00042 00043 namespace mitk 00044 { 00045 00046 class NavigationController; 00047 class SliceNavigationController; 00048 class CameraRotationController; 00049 class CameraController; 00050 class DataStorage; 00051 class Mapper; 00052 class BaseLocalStorageHandler; 00053 00054 //##Documentation 00055 //## @brief Organizes the rendering process 00056 //## 00057 //## Organizes the rendering process. A Renderer contains a reference to a 00058 //## DataStorage and asks the mappers of the data objects to render 00059 //## the data into the renderwindow it is associated to. 00060 //## 00061 //## \#Render() checks if rendering is currently allowed by calling 00062 //## RenderWindow::PrepareRendering(). Initialization of a rendering context 00063 //## can also be performed in this method. 00064 //## 00065 //## The actual rendering code has been moved to \#Repaint() 00066 //## Both \#Repaint() and \#Update() are declared protected now. 00067 //## 00068 //## Note: Separation of the Repaint and Update processes (rendering vs 00069 //## creating a vtk prop tree) still needs to be worked on. The whole 00070 //## rendering process also should be reworked to use VTK based classes for 00071 //## both 2D and 3D rendering. 00072 //## @ingroup Renderer 00073 class MITK_CORE_EXPORT BaseRenderer : public itk::Object 00074 { 00075 public: 00076 typedef std::map<vtkRenderWindow*,BaseRenderer*> BaseRendererMapType; 00077 static BaseRendererMapType baseRendererMap; 00078 00079 static BaseRenderer* GetInstance(vtkRenderWindow * renWin); 00080 static void AddInstance(vtkRenderWindow* renWin, BaseRenderer* baseRenderer); 00081 static void RemoveInstance(vtkRenderWindow* renWin); 00082 00083 static BaseRenderer* GetByName( const std::string& name ); 00084 static vtkRenderWindow* GetRenderWindowByName( const std::string& name ); 00085 00086 itkEventMacro( RendererResetEvent, itk::AnyEvent ); 00087 00089 mitkClassMacro(BaseRenderer, itk::Object); 00090 00091 BaseRenderer( const char* name = NULL, vtkRenderWindow * renWin = NULL, mitk::RenderingManager* rm= NULL ); 00092 00093 //##Documentation 00094 //## @brief MapperSlotId defines which kind of mapper (e.g., 2D or 3D) shoud be used. 00095 typedef int MapperSlotId; 00096 00097 enum StandardMapperSlot{Standard2D=1, Standard3D=2}; 00098 00099 00100 virtual void SetDataStorage( DataStorage* storage ); 00101 00102 //##Documentation 00103 //## return the DataStorage that is used for rendering 00104 virtual DataStorage::Pointer GetDataStorage() const 00105 { 00106 return m_DataStorage.GetPointer(); 00107 }; 00108 00109 //##Documentation 00110 //## @brief Access the RenderWindow into which this renderer renders. 00111 vtkRenderWindow* GetRenderWindow() const 00112 { 00113 return m_RenderWindow; 00114 } 00115 vtkRenderer* GetVtkRenderer() const 00116 { 00117 return m_VtkRenderer; 00118 } 00119 00120 00121 00122 //##Documentation 00123 //## @brief Default mapper id to use. 00124 static const MapperSlotId defaultMapper; 00125 00126 //##Documentation 00127 //## @brief Do the rendering and flush the result. 00128 virtual void Paint(); 00129 00130 //##Documentation 00131 //## @brief Initialize the RenderWindow. Should only be called from RenderWindow. 00132 virtual void Initialize(); 00133 00134 //##Documentation 00135 //## @brief Called to inform the renderer that the RenderWindow has been resized. 00136 virtual void Resize(int w, int h); 00137 00138 //##Documentation 00139 //## @brief Initialize the renderer with a RenderWindow (@a renderwindow). 00140 virtual void InitRenderer(vtkRenderWindow* renderwindow); 00141 00142 //##Documentation 00143 //## @brief Set the initial size. Called by RenderWindow after it has become 00144 //## visible for the first time. 00145 virtual void InitSize(int w, int h); 00146 00147 //##Documentation 00148 //## @brief Draws a point on the widget. 00149 //## Should be used during conferences to show the position of the remote mouse 00150 virtual void DrawOverlayMouse(Point2D& p2d); 00151 00152 //##Documentation 00153 //## @brief Set/Get the WorldGeometry (m_WorldGeometry) for 3D and 2D rendering, that describing the 00154 //## (maximal) area to be rendered. 00155 //## 00156 //## Depending of the type of the passed Geometry3D more or less information can be extracted: 00157 //## \li if it is a Geometry2D (which is a sub-class of Geometry3D), m_CurrentWorldGeometry2D is 00158 //## also set to point to it. m_TimeSlicedWorldGeometry is set to NULL. 00159 //## \li if it is a TimeSlicedGeometry, m_TimeSlicedWorldGeometry is also set to point to it. 00160 //## If m_TimeSlicedWorldGeometry contains instances of SlicedGeometry3D, m_CurrentWorldGeometry2D is set to 00161 //## one of geometries stored in the SlicedGeometry3D according to the value of m_Slice; otherwise 00162 //## a PlaneGeometry describing the top of the bounding-box of the Geometry3D is set as the 00163 //## m_CurrentWorldGeometry2D. 00164 //## \li otherwise a PlaneGeometry describing the top of the bounding-box of the Geometry3D 00165 //## is set as the m_CurrentWorldGeometry2D. m_TimeSlicedWorldGeometry is set to NULL. 00166 //## @todo add calculation of PlaneGeometry describing the top of the bounding-box of the Geometry3D 00167 //## when the passed Geometry3D is not sliced. 00168 //## \sa m_WorldGeometry 00169 //## \sa m_TimeSlicedWorldGeometry 00170 //## \sa m_CurrentWorldGeometry2D 00171 virtual void SetWorldGeometry(Geometry3D* geometry); 00172 00173 itkGetConstObjectMacro(WorldGeometry, Geometry3D); 00174 00175 //##Documentation 00176 //## @brief Get the current 3D-worldgeometry (m_CurrentWorldGeometry) used for 3D-rendering 00177 itkGetConstObjectMacro(CurrentWorldGeometry, Geometry3D); 00178 00179 //##Documentation 00180 //## @brief Get the current 2D-worldgeometry (m_CurrentWorldGeometry2D) used for 2D-rendering 00181 itkGetConstObjectMacro(CurrentWorldGeometry2D, Geometry2D); 00182 00183 //##Documentation 00184 //## Calculates the bounds of the DataStorage (if it contains any valid data), 00185 //## creates a geometry from these bounds and sets it as world geometry of the renderer. 00186 //## 00187 //## Call this method to re-initialize the renderer to the current DataStorage 00188 //## (e.g. after loading an additional dataset), to ensure that the view is 00189 //## aligned correctly. 00190 //## \warn This is not implemented yet. 00191 virtual bool SetWorldGeometryToDataStorageBounds() 00192 { 00193 return false; 00194 } 00195 00196 //##Documentation 00197 //## @brief Set/Get the DisplayGeometry (for 2D rendering) 00198 //## 00199 //## The DisplayGeometry describes which part of the Geometry2D m_CurrentWorldGeometry2D 00200 //## is displayed. 00201 virtual void SetDisplayGeometry(DisplayGeometry* geometry2d); 00202 00203 itkGetConstObjectMacro(DisplayGeometry, DisplayGeometry); 00204 00205 itkGetObjectMacro(DisplayGeometry, DisplayGeometry); 00206 00207 //##Documentation 00208 //## @brief Set/Get m_Slice which defines together with m_TimeStep the 2D geometry 00209 //## stored in m_TimeSlicedWorldGeometry used as m_CurrentWorldGeometry2D 00210 //## 00211 //## \sa m_Slice 00212 virtual void SetSlice(unsigned int slice); 00213 00214 itkGetConstMacro(Slice, unsigned int); 00215 00216 //##Documentation 00217 //## @brief Set/Get m_TimeStep which defines together with m_Slice the 2D geometry 00218 //## stored in m_TimeSlicedWorldGeometry used as m_CurrentWorldGeometry2D 00219 //## 00220 //## \sa m_TimeStep 00221 virtual void SetTimeStep(unsigned int timeStep); 00222 00223 itkGetConstMacro(TimeStep, unsigned int); 00224 00225 //##Documentation 00226 //## @brief Get the time-step of a BaseData object which 00227 //## exists at the time of the currently displayed content 00228 //## 00229 //## Returns -1 or mitk::BaseData::m_TimeSteps if there 00230 //## is no data at the current time. 00231 //## \sa GetTimeStep, m_TimeStep 00232 int GetTimeStep(const BaseData* data) const; 00233 00234 //##Documentation 00235 //## @brief Get the time in ms of the currently displayed content 00236 //## 00237 //## \sa GetTimeStep, m_TimeStep 00238 ScalarType GetTime() const; 00239 00240 //##Documentation 00241 //## @brief SetWorldGeometry is called according to the geometrySliceEvent, 00242 //## which is supposed to be a SliceNavigationController::GeometrySendEvent 00243 virtual void SetGeometry(const itk::EventObject & geometrySliceEvent); 00244 00245 //##Documentation 00246 //## @brief UpdateWorldGeometry is called to re-read the 2D geometry from the 00247 //## slice navigation controller 00248 virtual void UpdateGeometry(const itk::EventObject & geometrySliceEvent); 00249 00250 //##Documentation 00251 //## @brief SetSlice is called according to the geometrySliceEvent, 00252 //## which is supposed to be a SliceNavigationController::GeometrySliceEvent 00253 virtual void SetGeometrySlice(const itk::EventObject & geometrySliceEvent); 00254 00255 //##Documentation 00256 //## @brief SetTimeStep is called according to the geometrySliceEvent, 00257 //## which is supposed to be a SliceNavigationController::GeometryTimeEvent 00258 virtual void SetGeometryTime(const itk::EventObject & geometryTimeEvent); 00259 00260 //##Documentation 00261 //## @brief Get a data object containing the DisplayGeometry (for 2D rendering) 00262 itkGetObjectMacro(DisplayGeometryData, Geometry2DData); 00263 //##Documentation 00264 //## @brief Get a data object containing the WorldGeometry (for 2D rendering) 00265 itkGetObjectMacro(WorldGeometryData, Geometry2DData); 00266 00267 //##Documentation 00268 //## @brief Get a DataNode pointing to a data object containing the WorldGeometry (3D and 2D rendering) 00269 itkGetObjectMacro(WorldGeometryNode, DataNode); 00270 //##Documentation 00271 //## @brief Get a DataNode pointing to a data object containing the DisplayGeometry (for 2D rendering) 00272 itkGetObjectMacro(DisplayGeometryNode, DataNode); 00273 //##Documentation 00274 //## @brief Get a DataNode pointing to a data object containing the current 2D-worldgeometry m_CurrentWorldGeometry2D (for 2D rendering) 00275 itkGetObjectMacro(CurrentWorldGeometry2DNode, DataNode); 00276 00277 //##Documentation 00278 //## @brief Sets timestamp of CurrentWorldGeometry2D and DisplayGeometry and forces so reslicing in that renderwindow 00279 void SendUpdateSlice(); 00280 00281 //##Documentation 00282 //## @brief Get timestamp of last call of SetCurrentWorldGeometry2D 00283 unsigned long GetCurrentWorldGeometry2DUpdateTime() { return m_CurrentWorldGeometry2DUpdateTime; }; 00284 //##Documentation 00285 //## @brief Get timestamp of last call of SetDisplayGeometry 00286 unsigned long GetDisplayGeometryUpdateTime() { return m_CurrentWorldGeometry2DUpdateTime; }; 00287 //##Documentation 00288 //## @brief Get timestamp of last change of current TimeStep 00289 unsigned long GetTimeStepUpdateTime() { return m_TimeStepUpdateTime; }; 00290 00291 //##Documentation 00292 //## @brief Perform a picking: find the x,y,z world coordinate of a 00293 //## display x,y coordinate. 00294 //## @warning Has to be overwritten in subclasses for the 3D-case. 00295 //## 00296 //## Implemented here only for 2D-rendering by using 00297 //## m_DisplayGeometry 00298 virtual void PickWorldPoint(const Point2D& diplayPosition, Point3D& worldPosition) const; 00299 00305 virtual DataNode* PickObject( const Point2D& /*displayPosition*/, Point3D& /*worldPosition*/ ) const { return NULL; }; 00306 00307 //##Documentation 00308 //## @brief Get the MapperSlotId to use. 00309 itkGetMacro(MapperID, MapperSlotId); 00310 //##Documentation 00311 //## @brief Set the MapperSlotId to use. 00312 itkSetMacro(MapperID, MapperSlotId); 00313 00314 //##Documentation 00315 //## @brief Has the renderer the focus? 00316 itkGetMacro(Focused, bool); 00317 //##Documentation 00318 //## @brief Tell the renderer that it is focused. The caller is responsible for focus management, 00319 //## not the renderer itself. 00320 itkSetMacro(Focused, bool); 00321 00322 //##Documentation 00323 //## @brief Sets whether depth peeling is enabled or not 00324 void SetDepthPeelingEnabled(bool enabled); //##Documentation 00325 //## @brief Sets maximal number of peels 00326 void SetMaxNumberOfPeels(int maxNumber); 00327 00328 itkGetMacro(Size, int*); 00329 00330 void SetSliceNavigationController(SliceNavigationController* SlicenavigationController); 00331 void SetCameraController(CameraController* cameraController); 00332 itkGetObjectMacro(CameraController, CameraController); 00333 itkGetObjectMacro(SliceNavigationController, SliceNavigationController); 00334 itkGetObjectMacro(CameraRotationController, CameraRotationController); 00335 00336 itkGetMacro(EmptyWorldGeometry, bool); 00337 00338 //##Documentation 00339 //## @brief Mouse event dispatchers 00340 //## @note for internal use only. preliminary. 00341 virtual void MousePressEvent(MouseEvent*); 00342 //##Documentation 00343 //## @brief Mouse event dispatchers 00344 //## @note for internal use only. preliminary. 00345 virtual void MouseReleaseEvent(MouseEvent*); 00346 //##Documentation 00347 //## @brief Mouse event dispatchers 00348 //## @note for internal use only. preliminary. 00349 virtual void MouseMoveEvent(MouseEvent*); 00350 //##Documentation 00351 //## @brief Wheel event dispatcher 00352 //## @note for internal use only. preliminary. 00353 virtual void WheelEvent(mitk::WheelEvent* we); 00354 //##Documentation 00355 //## @brief Key event dispatcher 00356 //## @note for internal use only. preliminary. 00357 virtual void KeyPressEvent(KeyEvent*); 00358 00359 //##Documentation 00360 //## @brief get the name of the Renderer 00361 //## @note 00362 const char * GetName() const 00363 { 00364 return m_Name.c_str(); 00365 } 00366 00367 //##Documentation 00368 //## @brief get the x_size of the RendererWindow 00369 //## @note 00370 int GetSizeX() const 00371 { 00372 return m_Size[0]; 00373 } 00374 00375 //##Documentation 00376 //## @brief get the y_size of the RendererWindow 00377 //## @note 00378 int GetSizeY() const 00379 { 00380 return m_Size[1]; 00381 } 00382 00383 const double* GetBounds() const; 00384 00385 void RequestUpdate(); 00386 void ForceImmediateUpdate(); 00387 00388 00391 unsigned int GetNumberOfVisibleLODEnabledMappers() const; 00392 00394 //* \brief Setter for the RenderingManager that handles this instance of BaseRenderer 00395 //*/ 00396 //void SetRenderingManager( mitk::RenderingManager* ); 00397 00401 virtual mitk::RenderingManager* GetRenderingManager() const; 00402 00403 00404 protected: 00405 00406 virtual ~BaseRenderer(); 00407 00408 //##Documentation 00409 //## @brief Call update of all mappers. To be implemented in subclasses. 00410 virtual void Update() = 0; 00411 00412 vtkRenderWindow* m_RenderWindow; 00413 vtkRenderer* m_VtkRenderer; 00414 00415 //##Documentation 00416 //## @brief MapperSlotId to use. Defines which kind of mapper (e.g., 2D or 3D) shoud be used. 00417 MapperSlotId m_MapperID; 00418 00419 //##Documentation 00420 //## @brief The DataStorage that is used for rendering. 00421 DataStorage::Pointer m_DataStorage; 00422 00423 //##Documentation 00424 //## @brief The RenderingManager that manages this instance 00425 RenderingManager::Pointer m_RenderingManager; 00426 00427 //##Documentation 00428 //## @brief Timestamp of last call of Update(). 00429 unsigned long m_LastUpdateTime; 00430 00431 //##Documentation 00432 //## @brief CameraController for 3D rendering 00433 //## @note preliminary. 00434 CameraController::Pointer m_CameraController; 00435 SliceNavigationController::Pointer m_SliceNavigationController; 00436 CameraRotationController::Pointer m_CameraRotationController; 00437 00438 00439 //##Documentation 00440 //## @brief Size of the RenderWindow. 00441 int m_Size[2]; 00442 00443 //##Documentation 00444 //## @brief Contains whether the renderer that it is focused. The caller of 00445 //## SetFocused is responsible for focus management, not the renderer itself. 00446 //## is doubled because of mitk::FocusManager in GlobalInteraction!!! (ingmar) 00447 bool m_Focused; 00448 00449 //##Documentation 00450 //## @brief Sets m_CurrentWorldGeometry2D 00451 virtual void SetCurrentWorldGeometry2D(Geometry2D* geometry2d); 00452 00453 //##Documentation 00454 //## @brief Sets m_CurrentWorldGeometry 00455 virtual void SetCurrentWorldGeometry(Geometry3D* geometry); 00456 00457 00458 private: 00459 //##Documentation 00460 //## Pointer to the worldgeometry, describing the maximal area to be rendered 00461 //## (3D as well as 2D). 00462 //## It is const, since we are not allowed to change it (it may be taken 00463 //## directly from the geometry of an image-slice and thus it would be 00464 //## very strange when suddenly the image-slice changes its geometry). 00465 //## \sa SetWorldGeometry 00466 Geometry3D::Pointer m_WorldGeometry; 00467 00468 //##Documentation 00469 //## m_TimeSlicedWorldGeometry is set by SetWorldGeometry if the passed Geometry3D is a 00470 //## TimeSlicedGeometry (or a sub-class of it). If it contains instances of SlicedGeometry3D, 00471 //## m_Slice and m_TimeStep (set via SetSlice and SetTimeStep, respectively) define 00472 //## which 2D geometry stored in m_TimeSlicedWorldGeometry (if available) 00473 //## is used as m_CurrentWorldGeometry2D. 00474 //## \sa m_CurrentWorldGeometry2D 00475 TimeSlicedGeometry::Pointer m_TimeSlicedWorldGeometry; 00476 00477 //##Documentation 00478 //## Pointer to the current 3D-worldgeometry. 00479 Geometry3D::Pointer m_CurrentWorldGeometry; 00480 00481 //##Documentation 00482 //## Pointer to the current 2D-worldgeometry. The 2D-worldgeometry 00483 //## describes the maximal area (2D manifold) to be rendered in case we 00484 //## are doing 2D-rendering. More precisely, a subpart of this according 00485 //## to m_DisplayGeometry is displayed. 00486 //## It is const, since we are not allowed to change it (it may be taken 00487 //## directly from the geometry of an image-slice and thus it would be 00488 //## very strange when suddenly the image-slice changes its geometry). 00489 Geometry2D::Pointer m_CurrentWorldGeometry2D; 00490 00491 //##Documentation 00492 //## Pointer to the displaygeometry. The displaygeometry describes the 00493 //## geometry of the \em visible area in the window controlled by the renderer 00494 //## in case we are doing 2D-rendering. 00495 //## It is const, since we are not allowed to change it. 00496 DisplayGeometry::Pointer m_DisplayGeometry; 00497 00498 //##Documentation 00499 //## Defines together with m_Slice which 2D geometry stored in m_TimeSlicedWorldGeometry 00500 //## is used as m_CurrentWorldGeometry2D: m_TimeSlicedWorldGeometry->GetGeometry2D(m_Slice, m_TimeStep). 00501 //## \sa m_TimeSlicedWorldGeometry 00502 unsigned int m_Slice; 00503 //##Documentation 00504 //## Defines together with m_TimeStep which 2D geometry stored in m_TimeSlicedWorldGeometry 00505 //## is used as m_CurrentWorldGeometry2D: m_TimeSlicedWorldGeometry->GetGeometry2D(m_Slice, m_TimeStep). 00506 //## \sa m_TimeSlicedWorldGeometry 00507 unsigned int m_TimeStep; 00508 00509 //##Documentation 00510 //## @brief timestamp of last call of SetWorldGeometry 00511 itk::TimeStamp m_CurrentWorldGeometry2DUpdateTime; 00512 00513 //##Documentation 00514 //## @brief timestamp of last call of SetDisplayGeometry 00515 itk::TimeStamp m_DisplayGeometryUpdateTime; 00516 00517 //##Documentation 00518 //## @brief timestamp of last change of the current time step 00519 itk::TimeStamp m_TimeStepUpdateTime; 00520 00521 protected: 00522 virtual void PrintSelf(std::ostream& os, itk::Indent indent) const; 00523 00524 //##Documentation 00525 //## Data object containing the m_WorldGeometry defined above. 00526 Geometry2DData::Pointer m_WorldGeometryData; 00527 //##Documentation 00528 //## Data object containing the m_DisplayGeometry defined above. 00529 Geometry2DData::Pointer m_DisplayGeometryData; 00530 //##Documentation 00531 //## Data object containing the m_CurrentWorldGeometry2D defined above. 00532 Geometry2DData::Pointer m_CurrentWorldGeometry2DData; 00533 00534 //##Documentation 00535 //## DataNode objects containing the m_WorldGeometryData defined above. 00536 DataNode::Pointer m_WorldGeometryNode; 00537 //##Documentation 00538 //## DataNode objects containing the m_DisplayGeometryData defined above. 00539 DataNode::Pointer m_DisplayGeometryNode; 00540 //##Documentation 00541 //## DataNode objects containing the m_CurrentWorldGeometry2DData defined above. 00542 DataNode::Pointer m_CurrentWorldGeometry2DNode; 00543 00544 //##Documentation 00545 //## @brief test only 00546 unsigned long m_DisplayGeometryTransformTime; 00547 //##Documentation 00548 //## @brief test only 00549 unsigned long m_CurrentWorldGeometry2DTransformTime; 00550 00551 std::string m_Name; 00552 00553 double m_Bounds[6]; 00554 00555 bool m_EmptyWorldGeometry; 00556 00557 bool m_DepthPeelingEnabled; 00558 00559 int m_MaxNumberOfPeels; 00560 00561 typedef std::set< Mapper * > LODEnabledMappersType; 00562 00565 unsigned int m_NumberOfVisibleLODEnabledMappers; 00566 00567 // Local Storage Handling for mappers 00568 00569 protected: 00570 00571 std::list<mitk::BaseLocalStorageHandler*> m_RegisteredLocalStorageHandlers; 00572 00573 public: 00574 00575 void RemoveAllLocalStorages(); 00576 void RegisterLocalStorageHandler( mitk::BaseLocalStorageHandler *lsh ); 00577 void UnregisterLocalStorageHandler( mitk::BaseLocalStorageHandler *lsh ); 00578 00579 }; 00580 00581 } // namespace mitk 00582 00583 #endif /* BASERENDERER_H_HEADER_INCLUDED_C1CCA0F4 */