Medical Imaging Interaction Toolkit  2016.11.0
Medical Imaging Interaction Toolkit
mitkBaseRenderer.h
Go to the documentation of this file.
1 /*===================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center,
6 Division of Medical and Biological Informatics.
7 All rights reserved.
8 
9 This software is distributed WITHOUT ANY WARRANTY; without
10 even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 A PARTICULAR PURPOSE.
12 
13 See LICENSE.txt or http://www.mitk.org for details.
14 
15 ===================================================================*/
16 
17 #ifndef BASERENDERER_H_HEADER_INCLUDED_C1CCA0F4
18 #define BASERENDERER_H_HEADER_INCLUDED_C1CCA0F4
19 
21 #include "mitkDataStorage.h"
22 #include "mitkPlaneGeometry.h"
23 #include "mitkPlaneGeometryData.h"
25 #include "mitkTimeGeometry.h"
26 
28 #include "mitkDispatcher.h"
29 
30 #include <vtkRenderWindow.h>
31 #include <vtkRenderer.h>
32 
33 #include <map>
34 #include <set>
35 
36 // DEPRECATED
37 #include <mitkTimeSlicedGeometry.h>
38 
39 namespace mitk
40 {
41  class NavigationController;
42  class SliceNavigationController;
43  class CameraRotationController;
44  class CameraController;
45  class DataStorage;
46  class Mapper;
47  class BaseLocalStorageHandler;
48  class OverlayManager;
49  class KeyEvent;
50 
51  //##Documentation
52  //## @brief Organizes the rendering process
53  //##
54  //## Organizes the rendering process. A Renderer contains a reference to a
55  //## DataStorage and asks the mappers of the data objects to render
56  //## the data into the renderwindow it is associated to.
57  //##
58  //## \#Render() checks if rendering is currently allowed by calling
59  //## RenderWindow::PrepareRendering(). Initialization of a rendering context
60  //## can also be performed in this method.
61  //##
62  //## The actual rendering code has been moved to \#Repaint()
63  //## Both \#Repaint() and \#Update() are declared protected now.
64  //##
65  //## Note: Separation of the Repaint and Update processes (rendering vs
66  //## creating a vtk prop tree) still needs to be worked on. The whole
67  //## rendering process also should be reworked to use VTK based classes for
68  //## both 2D and 3D rendering.
69  //## @ingroup Renderer
70  class MITKCORE_EXPORT BaseRenderer : public itk::Object
71  {
72  public:
79  {
80  enum Type
81  {
82  Standard = 0, // no multi-sampling, no depth-peeling
83  MultiSampling, // multi-sampling (antialiasing), no depth-peeling
84  DepthPeeling // no multi-sampling, depth-peeling is on (order-independant transparency)
85  };
86  };
87 
88  typedef std::map<vtkRenderWindow *, BaseRenderer *> BaseRendererMapType;
89  static BaseRendererMapType baseRendererMap;
90 
91  static BaseRenderer *GetInstance(vtkRenderWindow *renWin);
92  static void AddInstance(vtkRenderWindow *renWin, BaseRenderer *baseRenderer);
93  static void RemoveInstance(vtkRenderWindow *renWin);
94 
95  static BaseRenderer *GetByName(const std::string &name);
96  static vtkRenderWindow *GetRenderWindowByName(const std::string &name);
97 
98 #pragma GCC visibility push(default)
99  itkEventMacro(RendererResetEvent, itk::AnyEvent);
100 #pragma GCC visibility pop
101 
104 
105  BaseRenderer(const char *name = nullptr,
106  vtkRenderWindow *renWin = nullptr,
107  mitk::RenderingManager *rm = nullptr,
108  RenderingMode::Type mode = RenderingMode::Standard);
109 
110  //##Documentation
111  //## @brief MapperSlotId defines which kind of mapper (e.g., 2D or 3D) shoud be used.
112  typedef int MapperSlotId;
113 
115  {
116  Standard2D = 1,
117  Standard3D = 2
118  };
119 
120  virtual void SetDataStorage(DataStorage *storage);
121 
122  //##Documentation
123  //## return the DataStorage that is used for rendering
124  virtual DataStorage::Pointer GetDataStorage() const { return m_DataStorage.GetPointer(); }
125  //##Documentation
126  //## @brief Access the RenderWindow into which this renderer renders.
127  vtkRenderWindow *GetRenderWindow() const { return m_RenderWindow; }
128  vtkRenderer *GetVtkRenderer() const { return m_VtkRenderer; }
129  //##Documentation
130  //## @brief Returns the Dispatcher which handles Events for this BaseRenderer
131  Dispatcher::Pointer GetDispatcher() const;
132 
133  //##Documentation
134  //## @brief Default mapper id to use.
135  static const MapperSlotId defaultMapper;
136 
137  //##Documentation
138  //## @brief Do the rendering and flush the result.
139  virtual void Paint();
140 
141  //##Documentation
142  //## @brief Initialize the RenderWindow. Should only be called from RenderWindow.
143  virtual void Initialize();
144 
145  //##Documentation
146  //## @brief Called to inform the renderer that the RenderWindow has been resized.
147  virtual void Resize(int w, int h);
148 
149  //##Documentation
150  //## @brief Initialize the renderer with a RenderWindow (@a renderwindow).
151  virtual void InitRenderer(vtkRenderWindow *renderwindow);
152 
153  //##Documentation
154  //## @brief Set the initial size. Called by RenderWindow after it has become
155  //## visible for the first time.
156  virtual void InitSize(int w, int h);
157 
158  //##Documentation
159  //## @brief Draws a point on the widget.
160  //## Should be used during conferences to show the position of the remote mouse
161  virtual void DrawOverlayMouse(Point2D &p2d);
162 
163  //##Documentation
164  //## @brief Set/Get the WorldGeometry (m_WorldGeometry) for 3D and 2D rendering, that describing the
165  //## (maximal) area to be rendered.
166  //##
167  //## Depending of the type of the passed BaseGeometry more or less information can be extracted:
168  //## \li if it is a PlaneGeometry (which is a sub-class of BaseGeometry), m_CurrentWorldPlaneGeometry is
169  //## also set to point to it. m_WorldTimeGeometry is set to NULL.
170  //## \li if it is a TimeGeometry, m_WorldTimeGeometry is also set to point to it.
171  //## If m_WorldTimeGeometry contains instances of SlicedGeometry3D, m_CurrentWorldPlaneGeometry is set to
172  //## one of geometries stored in the SlicedGeometry3D according to the value of m_Slice; otherwise
173  //## a PlaneGeometry describing the top of the bounding-box of the BaseGeometry is set as the
174  //## m_CurrentWorldPlaneGeometry.
175  //## \li otherwise a PlaneGeometry describing the top of the bounding-box of the BaseGeometry
176  //## is set as the m_CurrentWorldPlaneGeometry. m_WorldTimeGeometry is set to NULL.
177  //## @todo add calculation of PlaneGeometry describing the top of the bounding-box of the BaseGeometry
178  //## when the passed BaseGeometry is not sliced.
179  //## \sa m_WorldGeometry
180  //## \sa m_WorldTimeGeometry
181  //## \sa m_CurrentWorldPlaneGeometry
182  virtual void SetWorldGeometry3D(BaseGeometry *geometry);
183  virtual void SetWorldTimeGeometry(mitk::TimeGeometry *geometry);
184 
189  DEPRECATED(void SetWorldGeometry3D(TimeSlicedGeometry *geometry));
190 
191  itkGetConstObjectMacro(WorldTimeGeometry, TimeGeometry) itkGetObjectMacro(WorldTimeGeometry, TimeGeometry)
192 
193  //##Documentation
194  //## @brief Get the current 3D-worldgeometry (m_CurrentWorldGeometry) used for 3D-rendering
195  itkGetConstObjectMacro(CurrentWorldGeometry, BaseGeometry)
196 
197  //##Documentation
198  //## @brief Get the current 2D-worldgeometry (m_CurrentWorldPlaneGeometry) used for 2D-rendering
199  itkGetConstObjectMacro(CurrentWorldPlaneGeometry, PlaneGeometry)
203  DEPRECATED(const PlaneGeometry *GetCurrentWorldGeometry2D())
204  {
205  return GetCurrentWorldPlaneGeometry();
206  };
207 
208  //##Documentation
209  //## Calculates the bounds of the DataStorage (if it contains any valid data),
210  //## creates a geometry from these bounds and sets it as world geometry of the renderer.
211  //##
212  //## Call this method to re-initialize the renderer to the current DataStorage
213  //## (e.g. after loading an additional dataset), to ensure that the view is
214  //## aligned correctly.
215  //## \warn This is not implemented yet.
216  virtual bool SetWorldGeometryToDataStorageBounds() { return false; }
217  //##Documentation
218  //## @brief Set/Get m_Slice which defines together with m_TimeStep the 2D geometry
219  //## stored in m_WorldTimeGeometry used as m_CurrentWorldPlaneGeometry
220  //##
221  //## \sa m_Slice
222  virtual void SetSlice(unsigned int slice);
223 
224  //##Documentation
225  //## @brief Sets an OverlayManager which is used to add various Overlays to this
226  //## renderer. If an OverlayManager was already set it will be overwritten.
227  void SetOverlayManager(itk::SmartPointer<OverlayManager> overlayManager);
228 
229  //##Documentation
230  //## @brief Get the OverlayManager registered with this renderer
231  //## if none was set, it will be created at this point.
232  itk::SmartPointer<OverlayManager> GetOverlayManager();
233 
234  itkGetConstMacro(Slice, unsigned int)
235 
236  //##Documentation
237  //## @brief Set/Get m_TimeStep which defines together with m_Slice the 2D geometry
238  //## stored in m_WorldTimeGeometry used as m_CurrentWorldPlaneGeometry
239  //##
240  //## \sa m_TimeStep
241  virtual void SetTimeStep(unsigned int timeStep);
242 
243  itkGetConstMacro(TimeStep, unsigned int)
244 
245  //##Documentation
246  //## @brief Get the time-step of a BaseData object which
247  //## exists at the time of the currently displayed content
248  //##
249  //## Returns -1 or mitk::BaseData::m_TimeSteps if there
250  //## is no data at the current time.
251  //## \sa GetTimeStep, m_TimeStep
252  int GetTimeStep(const BaseData *data) const;
253 
254  //##Documentation
255  //## @brief Get the time in ms of the currently displayed content
256  //##
257  //## \sa GetTimeStep, m_TimeStep
258  ScalarType GetTime() const;
259 
260  //##Documentation
261  //## @brief SetWorldGeometry is called according to the geometrySliceEvent,
262  //## which is supposed to be a SliceNavigationController::GeometrySendEvent
263  virtual void SetGeometry(const itk::EventObject &geometrySliceEvent);
264 
265  //##Documentation
266  //## @brief UpdateWorldGeometry is called to re-read the 2D geometry from the
267  //## slice navigation controller
268  virtual void UpdateGeometry(const itk::EventObject &geometrySliceEvent);
269 
270  //##Documentation
271  //## @brief SetSlice is called according to the geometrySliceEvent,
272  //## which is supposed to be a SliceNavigationController::GeometrySliceEvent
273  virtual void SetGeometrySlice(const itk::EventObject &geometrySliceEvent);
274 
275  //##Documentation
276  //## @brief SetTimeStep is called according to the geometrySliceEvent,
277  //## which is supposed to be a SliceNavigationController::GeometryTimeEvent
278  virtual void SetGeometryTime(const itk::EventObject &geometryTimeEvent);
279 
280  //##Documentation
281  //## @brief Get a DataNode pointing to a data object containing the current 2D-worldgeometry
282  // m_CurrentWorldPlaneGeometry (for 2D rendering)
283  itkGetObjectMacro(CurrentWorldPlaneGeometryNode, DataNode)
287  DEPRECATED(DataNode *GetCurrentWorldGeometry2DNode())
288  {
289  return GetCurrentWorldPlaneGeometryNode();
290  };
291 
292  //##Documentation
293  //## @brief Sets timestamp of CurrentWorldPlaneGeometry and forces so reslicing in that renderwindow
294  void SendUpdateSlice();
295 
296  //##Documentation
297  //## @brief Get timestamp of last call of SetCurrentWorldPlaneGeometry
298  unsigned long GetCurrentWorldPlaneGeometryUpdateTime() { return m_CurrentWorldPlaneGeometryUpdateTime; }
303  {
304  return GetCurrentWorldPlaneGeometryUpdateTime();
305  };
306  //##Documentation
307  //## @brief Get timestamp of last change of current TimeStep
308  unsigned long GetTimeStepUpdateTime() { return m_TimeStepUpdateTime; }
309  //##Documentation
310  //## @brief Perform a picking: find the x,y,z world coordinate of a
311  //## display x,y coordinate.
312  //## @warning Has to be overwritten in subclasses for the 3D-case.
313  //##
314  //## Implemented here only for 2D-rendering
315  virtual void PickWorldPoint(const Point2D &diplayPosition, Point3D &worldPosition) const = 0;
316 
322  virtual DataNode *PickObject(const Point2D & /*displayPosition*/, Point3D & /*worldPosition*/) const
323  {
324  return nullptr;
325  }
326 
327  //##Documentation
328  //## @brief Get the MapperSlotId to use.
329  itkGetMacro(MapperID, MapperSlotId) itkGetConstMacro(MapperID, MapperSlotId)
330 
331  //##Documentation
332  //## @brief Set the MapperSlotId to use.
333  itkSetMacro(MapperID, MapperSlotId)
334 
335  virtual int *GetSize() const;
336  virtual int *GetViewportSize() const;
337 
338  void SetSliceNavigationController(SliceNavigationController *SlicenavigationController);
339  itkGetObjectMacro(CameraController, CameraController)
340  itkGetObjectMacro(SliceNavigationController, SliceNavigationController)
341  itkGetObjectMacro(CameraRotationController, CameraRotationController)
342 
343  itkGetMacro(EmptyWorldGeometry, bool)
344 
345  //##Documentation
346  //## @brief Tells if the displayed region is shifted and rescaled if the render window is resized.
347  itkGetMacro(KeepDisplayedRegion, bool)
348  //##Documentation
349  //## @brief Tells if the displayed region should be shifted and rescaled if the render window is resized.
350  itkSetMacro(KeepDisplayedRegion, bool)
351 
352  //##Documentation
353  //## @brief get the name of the Renderer
354  //## @note
355  const char *GetName() const
356  {
357  return m_Name.c_str();
358  }
359 
360  //##Documentation
361  //## @brief get the x_size of the RendererWindow
362  //## @note
363  int GetSizeX() const { return GetSize()[0]; }
364  //##Documentation
365  //## @brief get the y_size of the RendererWindow
366  //## @note
367  int GetSizeY() const { return GetSize()[1]; }
368  const double *GetBounds() const;
369 
370  void RequestUpdate();
371  void ForceImmediateUpdate();
372 
375  unsigned int GetNumberOfVisibleLODEnabledMappers() const;
376 
378  //* \brief Setter for the RenderingManager that handles this instance of BaseRenderer
379  //*/
380  // void SetRenderingManager( mitk::RenderingManager* );
381 
385  virtual mitk::RenderingManager *GetRenderingManager() const;
386 
387  //##Documentation
388  //## @brief This method converts a display point to the 3D world index
389  //## using the geometry of the renderWindow.
390  void DisplayToWorld(const Point2D &displayPoint, Point3D &worldIndex) const;
391 
392  //##Documentation
393  //## @brief This method converts a display point to the 2D world index, mapped onto the display plane
394  //## using the geometry of the renderWindow.
395  void DisplayToPlane(const Point2D &displayPoint, Point2D &planePointInMM) const;
396 
397  //##Documentation
398  //## @brief This method converts a 3D world index to the display point
399  //## using the geometry of the renderWindow.
400  void WorldToDisplay(const Point3D &worldIndex, Point2D &displayPoint) const;
401 
402  //##Documentation
403  //## @brief This method converts a 2D plane coordinate to the display point
404  //## using the geometry of the renderWindow.
405  void PlaneToDisplay(const Point2D &planePointInMM, Point2D &displayPoint) const;
406 
407  double GetScaleFactorMMPerDisplayUnit() const;
408 
409  Point2D GetDisplaySizeInMM() const;
410  Point2D GetViewportSizeInMM() const;
411 
412  Point2D GetOriginInMM() const;
413 
414  itkGetConstMacro(ConstrainZoomingAndPanning, bool) virtual void SetConstrainZoomingAndPanning(bool constrain);
415 
421  DEPRECATED(virtual Point3D Map2DRendererPositionTo3DWorldPosition(const Point2D &mousePosition) const);
422 
423  protected:
424  virtual ~BaseRenderer();
425 
426  //##Documentation
427  //## @brief Call update of all mappers. To be implemented in subclasses.
428  virtual void Update() = 0;
429 
430  vtkRenderWindow *m_RenderWindow;
431  vtkRenderer *m_VtkRenderer;
432 
433  //##Documentation
434  //## @brief MapperSlotId to use. Defines which kind of mapper (e.g., 2D or 3D) shoud be used.
435  MapperSlotId m_MapperID;
436 
437  //##Documentation
438  //## @brief The DataStorage that is used for rendering.
440 
441  //##Documentation
442  //## @brief The RenderingManager that manages this instance
443  RenderingManager::Pointer m_RenderingManager;
444 
445  //##Documentation
446  //## @brief Timestamp of last call of Update().
447  unsigned long m_LastUpdateTime;
448 
449  //##Documentation
450  //## @brief CameraController for 3D rendering
451  //## @note preliminary.
452  itk::SmartPointer<CameraController> m_CameraController;
453  SliceNavigationController::Pointer m_SliceNavigationController;
454  CameraRotationController::Pointer m_CameraRotationController;
455 
456  //##Documentation
457  //## @brief Sets m_CurrentWorldPlaneGeometry
458  virtual void SetCurrentWorldPlaneGeometry(PlaneGeometry *geometry2d);
462  DEPRECATED(void SetCurrentWorldGeometry2D(PlaneGeometry *geometry2d)) { SetCurrentWorldPlaneGeometry(geometry2d); };
463  //##Documentation
464  //## @brief Sets m_CurrentWorldGeometry
465  virtual void SetCurrentWorldGeometry(BaseGeometry *geometry);
466 
467  //##Documentation
468  //## @brief This method is called during the rendering process to update or render the Overlays
469  //## which are stored in the OverlayManager
470  void UpdateOverlays();
471 
472  private:
473  itk::SmartPointer<OverlayManager> m_OverlayManager;
474 
475  //##Documentation
476  //## m_WorldTimeGeometry is set by SetWorldGeometry if the passed BaseGeometry is a
477  //## TimeGeometry (or a sub-class of it). If it contains instances of SlicedGeometry3D,
478  //## m_Slice and m_TimeStep (set via SetSlice and SetTimeStep, respectively) define
479  //## which 2D geometry stored in m_WorldTimeGeometry (if available)
480  //## is used as m_CurrentWorldPlaneGeometry.
481  //## \sa m_CurrentWorldPlaneGeometry
482  TimeGeometry::Pointer m_WorldTimeGeometry;
483 
484  //##Documentation
485  //## Pointer to the current 3D-worldgeometry.
486  BaseGeometry::Pointer m_CurrentWorldGeometry;
487 
488  //##Documentation
489  //## Pointer to the current 2D-worldgeometry. The 2D-worldgeometry
490  //## describes the maximal area (2D manifold) to be rendered in case we
491  //## are doing 2D-rendering.
492  //## It is const, since we are not allowed to change it (it may be taken
493  //## directly from the geometry of an image-slice and thus it would be
494  //## very strange when suddenly the image-slice changes its geometry).
495  PlaneGeometry::Pointer m_CurrentWorldPlaneGeometry;
496 
497  //##Documentation
498  //## Defines together with m_Slice which 2D geometry stored in m_WorldTimeGeometry
499  //## is used as m_CurrentWorldPlaneGeometry: m_WorldTimeGeometry->GetPlaneGeometry(m_Slice, m_TimeStep).
500  //## \sa m_WorldTimeGeometry
501  unsigned int m_Slice;
502  //##Documentation
503  //## Defines together with m_TimeStep which 2D geometry stored in m_WorldTimeGeometry
504  //## is used as m_CurrentWorldPlaneGeometry: m_WorldTimeGeometry->GetPlaneGeometry(m_Slice, m_TimeStep).
505  //## \sa m_WorldTimeGeometry
506  unsigned int m_TimeStep;
507 
508  //##Documentation
509  //## @brief timestamp of last call of SetWorldGeometry
510  itk::TimeStamp m_CurrentWorldPlaneGeometryUpdateTime;
511 
512  //##Documentation
513  //## @brief timestamp of last change of the current time step
514  itk::TimeStamp m_TimeStepUpdateTime;
515 
516  //##Documentation
517  //## @brief Helper class which establishes connection between Interactors and Dispatcher via a common DataStorage.
518  BindDispatcherInteractor *m_BindDispatcherInteractor;
519 
520  //##Documentation
521  //## @brief Tells if the displayed region should be shifted or rescaled if the render window is resized.
522  bool m_KeepDisplayedRegion;
523 
524  protected:
525  virtual void PrintSelf(std::ostream &os, itk::Indent indent) const override;
526 
527  //##Documentation
528  //## Data object containing the m_CurrentWorldPlaneGeometry defined above.
530 
531  //##Documentation
532  //## DataNode objects containing the m_CurrentWorldPlaneGeometryData defined above.
534 
535  //##Documentation
536  //## @brief test only
538 
539  std::string m_Name;
540 
541  double m_Bounds[6];
542 
544 
545  typedef std::set<Mapper *> LODEnabledMappersType;
546 
550 
551  // Local Storage Handling for mappers
552 
553  protected:
554  std::list<mitk::BaseLocalStorageHandler *> m_RegisteredLocalStorageHandlers;
555 
557 
558  public:
559  void RemoveAllLocalStorages();
560  void RegisterLocalStorageHandler(mitk::BaseLocalStorageHandler *lsh);
561  void UnregisterLocalStorageHandler(mitk::BaseLocalStorageHandler *lsh);
562  };
563 } // namespace mitk
564 
565 #endif /* BASERENDERER_H_HEADER_INCLUDED_C1CCA0F4 */
std::map< vtkRenderWindow *, BaseRenderer * > BaseRendererMapType
PlaneGeometryData::Pointer m_CurrentWorldPlaneGeometryData
int GetSizeX() const
get the x_size of the RendererWindow
Data management class that handles 'was created by' relations.
This Class is used to connect a DataStorage with the Dispatcher.
#define MITKCORE_EXPORT
Base of all data objects.
Definition: mitkBaseData.h:39
virtual bool SetWorldGeometryToDataStorageBounds()
double ScalarType
virtual DataNode * PickObject(const Point2D &, Point3D &) const
Determines the object (mitk::DataNode) closest to the current position by means of picking...
Organizes the rendering process.
std::set< Mapper * > LODEnabledMappersType
static void Update(vtkPolyData *)
Definition: mitkSurface.cpp:35
std::list< mitk::BaseLocalStorageHandler * > m_RegisteredLocalStorageHandlers
DataCollection - Class to facilitate loading/accessing structured data.
unsigned long GetCurrentWorldGeometry2DUpdateTime()
Interface for accessing (templated) LocalStorageHandler instances.
static const MapperSlotId defaultMapper
Default mapper id to use.
Controls the selection of the slice the associated BaseRenderer will display.
virtual DataStorage::Pointer GetDataStorage() const
#define DEPRECATED(func)
Definition: mitkCommon.h:183
mitk::DataStorage::Pointer m_DataStorage
int MapperSlotId
MapperSlotId defines which kind of mapper (e.g., 2D or 3D) shoud be used.
Manager for coordinating the rendering process.
#define mitkClassMacroItkParent(className, SuperClassName)
Definition: mitkCommon.h:53
static BaseRendererMapType baseRendererMap
unsigned long m_CurrentWorldPlaneGeometryTransformTime
test only
int GetSizeY() const
get the y_size of the RendererWindow
unsigned int m_NumberOfVisibleLODEnabledMappers
itkEventMacro(ContourModelEvent, itk::AnyEvent)
unsigned long GetTimeStepUpdateTime()
Get timestamp of last change of current TimeStep.
This rendering mode enumeration is specified at various constructors of the Renderer and RenderWindow...
static std::string GetName(std::string fileName, std::string suffix)
unsigned long GetCurrentWorldPlaneGeometryUpdateTime()
Get timestamp of last call of SetCurrentWorldPlaneGeometry.
Describes a two-dimensional, rectangular plane.
DataNode::Pointer m_CurrentWorldPlaneGeometryNode
vtkRenderer * GetVtkRenderer() const
vtkRenderWindow * GetRenderWindow() const
Access the RenderWindow into which this renderer renders.
BaseGeometry Describes the geometry of a data object.
Class for nodes of the DataTree.
Definition: mitkDataNode.h:66
controls the camera used by the associated BaseRenderer