Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkUnstructuredGridVtkMapper3D.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 
14 #include "mitkColorProperty.h"
15 #include "mitkDataNode.h"
16 #include "mitkProperties.h"
18 //#include "mitkLookupTableProperty.h"
23 
24 #include "mitkDataStorage.h"
25 
26 #include "mitkSurfaceVtkMapper3D.h"
27 
28 #include <vtkProperty.h>
29 #include <vtkUnstructuredGrid.h>
30 #include <vtkVolume.h>
31 #include <vtkVolumeProperty.h>
32 
33 #include <vtkPlanes.h>
34 
36 {
37  return static_cast<const mitk::UnstructuredGrid *>(GetDataNode()->GetData());
38 }
39 
41 {
42  m_VtkTriangleFilter = vtkDataSetTriangleFilter::New();
43 
44  m_Assembly = vtkAssembly::New();
45 
46  m_Volume = vtkVolume::New();
47  m_Actor = vtkActor::New();
48  m_ActorWireframe = vtkActor::New();
49 
51  m_VtkDataSetMapper->SetResolveCoincidentTopologyToPolygonOffset();
52  m_VtkDataSetMapper->SetResolveCoincidentTopologyPolygonOffsetParameters(0, 1);
53  m_Actor->SetMapper(m_VtkDataSetMapper);
54 
56  m_VtkDataSetMapper2->SetResolveCoincidentTopologyToPolygonOffset();
57  m_VtkDataSetMapper2->SetResolveCoincidentTopologyPolygonOffsetParameters(1, 1);
59  m_ActorWireframe->GetProperty()->SetRepresentationToWireframe();
60 
61  m_Assembly->AddPart(m_Actor);
62  m_Assembly->AddPart(m_ActorWireframe);
63  m_Assembly->AddPart(m_Volume);
64 
65  m_VtkVolumeRayCastMapper = nullptr;
66  m_VtkPTMapper = nullptr;
67  m_VtkVolumeZSweepMapper = nullptr;
68 
69  // m_GenerateNormals = false;
70 }
71 
73 {
74  if (m_VtkTriangleFilter != nullptr)
75  m_VtkTriangleFilter->Delete();
76 
77  if (m_VtkVolumeRayCastMapper != nullptr)
78  m_VtkVolumeRayCastMapper->Delete();
79 
80  if (m_VtkVolumeZSweepMapper != nullptr)
81  m_VtkVolumeZSweepMapper->Delete();
82 
83  if (m_VtkPTMapper != nullptr)
84  m_VtkPTMapper->Delete();
85 
86  if (m_VtkDataSetMapper != nullptr)
87  m_VtkDataSetMapper->Delete();
88 
89  if (m_VtkDataSetMapper2 != nullptr)
90  m_VtkDataSetMapper2->Delete();
91 
92  if (m_Assembly != nullptr)
93  m_Assembly->Delete();
94 
95  if (m_Actor != nullptr)
96  m_Actor->Delete();
97 
98  if (m_ActorWireframe != nullptr)
99  m_ActorWireframe->Delete();
100 
101  if (m_Volume != nullptr)
102  m_Volume->Delete();
103 }
104 
106 {
107  return m_Assembly;
108 }
109 
111 {
113 
115  bool needGenerateData = ls->IsGenerateDataRequired(renderer, this, GetDataNode());
116 
117  if (needGenerateData)
118  {
120 
121  m_Assembly->VisibilityOn();
122 
123  m_ActorWireframe->GetProperty()->SetAmbient(1.0);
124  m_ActorWireframe->GetProperty()->SetDiffuse(0.0);
125  m_ActorWireframe->GetProperty()->SetSpecular(0.0);
126 
128  if (node->GetProperty(transferFuncProp, "TransferFunction"))
129  {
130  mitk::TransferFunction::Pointer transferFunction = transferFuncProp->GetValue();
131  if (transferFunction->GetColorTransferFunction()->GetSize() < 2)
132  {
133  mitk::UnstructuredGrid::Pointer input = const_cast<mitk::UnstructuredGrid *>(this->GetInput());
134  if (input.IsNull())
135  return;
136 
137  vtkUnstructuredGrid *grid = input->GetVtkUnstructuredGrid(this->GetTimestep());
138  if (grid == nullptr)
139  return;
140 
141  double *scalarRange = grid->GetScalarRange();
142  vtkColorTransferFunction *colorFunc = transferFunction->GetColorTransferFunction();
143  colorFunc->RemoveAllPoints();
144  colorFunc->AddRGBPoint(scalarRange[0], 1, 0, 0);
145  colorFunc->AddRGBPoint((scalarRange[0] + scalarRange[1]) / 2.0, 0, 1, 0);
146  colorFunc->AddRGBPoint(scalarRange[1], 0, 0, 1);
147  }
148  }
149  }
150 
151  bool visible = true;
152  GetDataNode()->GetVisibility(visible, renderer, "visible");
153 
154  if (!visible)
155  {
156  m_Assembly->VisibilityOff();
157  return;
158  }
159 
160  //
161  // get the TimeGeometry of the input object
162  //
163  mitk::UnstructuredGrid::Pointer input = const_cast<mitk::UnstructuredGrid *>(this->GetInput());
164 
165  //
166  // set the input-object at time t for the mapper
167  //
168  vtkUnstructuredGrid *grid = input->GetVtkUnstructuredGrid(this->GetTimestep());
169  if (grid == nullptr)
170  {
171  m_Assembly->VisibilityOff();
172  return;
173  }
174 
175  m_Assembly->VisibilityOn();
176 
177  m_VtkTriangleFilter->SetInputData(grid);
180 
181  bool clip = false;
182  node->GetBoolProperty("enable clipping", clip);
183  mitk::DataNode::Pointer bbNode = renderer->GetDataStorage()->GetNamedDerivedNode("Clipping Bounding Object", node);
184  if (clip && bbNode.IsNotNull())
185  {
186  m_VtkDataSetMapper->SetBoundingObject(dynamic_cast<mitk::BoundingObject *>(bbNode->GetData()));
187  m_VtkDataSetMapper2->SetBoundingObject(dynamic_cast<mitk::BoundingObject *>(bbNode->GetData()));
188  }
189  else
190  {
193  }
194 
195  //
196  // apply properties read from the PropertyList
197  //
198  ApplyProperties(nullptr, renderer);
199 }
200 
202 {
203  m_Assembly->VisibilityOff();
204 }
205 
207 {
208  mitk::DataNode::Pointer node = this->GetDataNode();
211 
212  vtkVolumeProperty *volProp = m_Volume->GetProperty();
213  vtkProperty *property = m_Actor->GetProperty();
214  vtkProperty *wireframeProp = m_ActorWireframe->GetProperty();
215 
217  mitk::SurfaceVtkMapper3D::ApplyMitkPropertiesToVtkProperty(node, wireframeProp, renderer);
218 
220  if (node->GetProperty(transferFuncProp, "TransferFunction", renderer))
221  {
222  mitk::TransferFunction::Pointer transferFunction = transferFuncProp->GetValue();
223 
224  volProp->SetColor(transferFunction->GetColorTransferFunction());
225  volProp->SetScalarOpacity(transferFunction->GetScalarOpacityFunction());
226  volProp->SetGradientOpacity(transferFunction->GetGradientOpacityFunction());
227 
228  m_VtkDataSetMapper->SetLookupTable(transferFunction->GetColorTransferFunction());
229  m_VtkDataSetMapper2->SetLookupTable(transferFunction->GetColorTransferFunction());
230  }
231 
232  bool isVolumeRenderingOn = false;
233  node->GetBoolProperty("volumerendering", isVolumeRenderingOn, renderer);
234 
235  if (isVolumeRenderingOn)
236  {
237  m_Assembly->RemovePart(m_Actor);
238  m_Assembly->RemovePart(m_ActorWireframe);
239  m_Assembly->AddPart(m_Volume);
240 
242  if (node->GetProperty(mapperProp, "volumerendering.mapper", renderer))
243  {
244  mitk::GridVolumeMapperProperty::IdType type = mapperProp->GetValueAsId();
245  switch (type)
246  {
248  if (m_VtkVolumeRayCastMapper == nullptr)
249  {
250  m_VtkVolumeRayCastMapper = vtkUnstructuredGridVolumeRayCastMapper::New();
251  m_VtkVolumeRayCastMapper->SetInputConnection(m_VtkTriangleFilter->GetOutputPort());
252  }
254  break;
256  if (m_VtkPTMapper == nullptr)
257  {
258  m_VtkPTMapper = vtkProjectedTetrahedraMapper::New();
259  m_VtkPTMapper->SetInputConnection(m_VtkTriangleFilter->GetOutputPort());
260  }
261  m_Volume->SetMapper(m_VtkPTMapper);
262  break;
264  if (m_VtkVolumeZSweepMapper == nullptr)
265  {
266  m_VtkVolumeZSweepMapper = vtkUnstructuredGridVolumeZSweepMapper::New();
267  m_VtkVolumeZSweepMapper->SetInputConnection(m_VtkTriangleFilter->GetOutputPort());
268  }
269  m_Volume->SetMapper(m_VtkVolumeZSweepMapper);
270  break;
271  }
272  }
273  }
274  else
275  {
276  m_Assembly->RemovePart(m_Volume);
277  m_Assembly->AddPart(m_Actor);
278  m_Assembly->RemovePart(m_ActorWireframe);
279 
281  if (node->GetProperty(gridRepProp, "grid representation", renderer))
282  {
283  mitk::GridRepresentationProperty::IdType type = gridRepProp->GetValueAsId();
284  switch (type)
285  {
287  property->SetRepresentationToPoints();
288  break;
290  property->SetRepresentationToWireframe();
291  break;
293  property->SetRepresentationToSurface();
294  break;
295  }
296 
297  // if (type == mitk::GridRepresentationProperty::WIREFRAME_SURFACE)
298  // {
299  // m_Assembly->AddPart(m_ActorWireframe);
300  // }
301  }
302  }
303 
304  // mitk::LevelWindow levelWindow;
305  // if(node->GetLevelWindow(levelWindow, renderer, "levelWindow"))
306  // {
307  // m_VtkVolumeRayCastMapper->SetScalarRange(levelWindow.GetMin(),levelWindow.GetMax());
308  // }
309  // else
310  // if(node->GetLevelWindow(levelWindow, renderer))
311  // {
312  // m_VtkVolumeRayCastMapper->SetScalarRange(levelWindow.GetMin(),levelWindow.GetMax());
313  // }
314  //
315  // mitk::VtkRepresentationProperty* representationProperty;
316  // node->GetProperty(representationProperty, "material.representation", renderer);
317  // if ( representationProperty != nullptr )
318  // m_Volume->GetProperty()->SetRepresentation( representationProperty->GetVtkRepresentation() );
319  //
320  // mitk::VtkInterpolationProperty* interpolationProperty;
321  // node->GetProperty(interpolationProperty, "material.interpolation", renderer);
322  // if ( interpolationProperty != nullptr )
323  // m_Volume->GetProperty()->SetInterpolation( interpolationProperty->GetVtkInterpolation() );
324  //
325 
326  mitk::VtkScalarModeProperty *scalarMode = nullptr;
327  if (node->GetProperty(scalarMode, "scalar mode", renderer))
328  {
330  m_VtkVolumeRayCastMapper->SetScalarMode(scalarMode->GetVtkScalarMode());
331  if (m_VtkPTMapper)
332  m_VtkPTMapper->SetScalarMode(scalarMode->GetVtkScalarMode());
334  m_VtkVolumeZSweepMapper->SetScalarMode(scalarMode->GetVtkScalarMode());
335 
336  m_VtkDataSetMapper->SetScalarMode(scalarMode->GetVtkScalarMode());
337  m_VtkDataSetMapper2->SetScalarMode(scalarMode->GetVtkScalarMode());
338  }
339  else
340  {
342  m_VtkVolumeRayCastMapper->SetScalarModeToDefault();
343  if (m_VtkPTMapper)
344  m_VtkPTMapper->SetScalarModeToDefault();
346  m_VtkVolumeZSweepMapper->SetScalarModeToDefault();
347 
348  m_VtkDataSetMapper->SetScalarModeToDefault();
349  m_VtkDataSetMapper2->SetScalarModeToDefault();
350  }
351 
352  bool scalarVisibility = true;
353  node->GetBoolProperty("scalar visibility", scalarVisibility, renderer);
354  m_VtkDataSetMapper->SetScalarVisibility(scalarVisibility ? 1 : 0);
355  m_VtkDataSetMapper2->SetScalarVisibility(scalarVisibility ? 1 : 0);
356 
357  // double scalarRangeLower = std::numeric_limits<double>::min();
358  // double scalarRangeUpper = std::numeric_limits<double>::max();
359  // mitk::DoubleProperty* lowerRange = 0;
360  // if (node->GetProperty(lowerRange, "scalar range min", renderer))
361  // {
362  // scalarRangeLower = lowerRange->GetValue();
363  // }
364  // mitk::DoubleProperty* upperRange = 0;
365  // if (node->GetProperty(upperRange, "scalar range max", renderer))
366  // {
367  // scalarRangeUpper = upperRange->GetValue();
368  // }
369  // m_VtkDataSetMapper->SetScalarRange(scalarRangeLower, scalarRangeUpper);
370  // m_VtkDataSetMapper2->SetScalarRange(scalarRangeLower, scalarRangeUpper);
371 
372  // bool colorMode = false;
373  // node->GetBoolProperty("color mode", colorMode);
374  // m_VtkVolumeRayCastMapper->SetColorMode( (colorMode ? 1 : 0) );
375 
376  // double scalarsMin = 0;
377  // node->GetDoubleProperty("ScalarsRangeMinimum", scalarsMin, renderer);
378 
379  // double scalarsMax = 1.0;
380  // node->GetProperty("ScalarsRangeMaximum", scalarsMax, renderer);
381 
382  // m_VtkVolumeRayCastMapper->SetScalarRange(scalarsMin,scalarsMax);
383 }
384 
386  mitk::BaseRenderer *renderer,
387  bool overwrite)
388 {
390 
391  node->AddProperty("grid representation", GridRepresentationProperty::New(), renderer, overwrite);
392  node->AddProperty("volumerendering", BoolProperty::New(false), renderer, overwrite);
393  node->AddProperty("volumerendering.mapper", GridVolumeMapperProperty::New(), renderer, overwrite);
394  node->AddProperty("scalar mode", VtkScalarModeProperty::New(0), renderer, overwrite);
395  node->AddProperty("scalar visibility", BoolProperty::New(true), renderer, overwrite);
396  // node->AddProperty("scalar range min", DoubleProperty::New(std::numeric_limits<double>::min()), renderer,
397  // overwrite);
398  // node->AddProperty("scalar range max", DoubleProperty::New(std::numeric_limits<double>::max()), renderer,
399  // overwrite);
400  node->AddProperty("outline polygons", BoolProperty::New(false), renderer, overwrite);
401  node->AddProperty("color", ColorProperty::New(1.0f, 1.0f, 1.0f), renderer, overwrite);
402  node->AddProperty("line width", IntProperty::New(1), renderer, overwrite);
403 
404  if (overwrite || node->GetProperty("TransferFunction", renderer) == nullptr)
405  {
406  // add a default transfer function
408  // tf->GetColorTransferFunction()->RemoveAllPoints();
409  node->SetProperty("TransferFunction", mitk::TransferFunctionProperty::New(tf.GetPointer()));
410  }
411 
412  Superclass::SetDefaultProperties(node, renderer, overwrite);
413 }
#define ls
Definition: MitkMCxyz.cpp:57
mitk::BaseProperty * GetProperty(const char *propertyKey, const mitk::BaseRenderer *renderer=nullptr, bool fallBackOnDataProperties=true) const
Get the property (instance of BaseProperty) with key propertyKey from the PropertyList of the rendere...
L * GetLocalStorage(mitk::BaseRenderer *forRenderer)
Retrieves a LocalStorage for a specific BaseRenderer.
Base class for mapper specific rendering ressources.
Definition: mitkMapper.h:193
void SetInput(vtkUnstructuredGrid *input)
bool IsGenerateDataRequired(mitk::BaseRenderer *renderer, mitk::Mapper *mapper, mitk::DataNode *dataNode) const
Definition: mitkMapper.cpp:119
virtual DataNode * GetDataNode() const
Get the DataNode containing the data to map. Method only returns valid DataNode Pointer if the mapper...
Definition: mitkMapper.cpp:31
static Pointer New()
Organizes the rendering process.
void ApplyColorAndOpacityProperties(mitk::BaseRenderer *renderer, vtkActor *actor) override
Apply color and opacity properties read from the PropertyList. Called by mapper subclasses.
vtkUnstructuredGridVolumeZSweepMapper * m_VtkVolumeZSweepMapper
LocalStorageHandler< BaseLocalStorage > m_LSH
static Pointer New()
void SetProperty(const std::string &propertyKey, BaseProperty *property, const std::string &contextName="", bool fallBackOnDefaultContext=false) override
Add new or change existent property.
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
void AddProperty(const char *propertyKey, BaseProperty *property, const mitk::BaseRenderer *renderer=nullptr, bool overwrite=false)
Add the property (instance of BaseProperty) if it does not exist (or always ifoverwrite istrue) with ...
void ApplyProperties(vtkActor *, mitk::BaseRenderer *renderer) override
Apply color and opacity properties read from the PropertyList.
vtkProp * GetVtkProp(mitk::BaseRenderer *renderer) override
static void ApplyMitkPropertiesToVtkProperty(mitk::DataNode *node, vtkProperty *property, mitk::BaseRenderer *renderer)
vtkProjectedTetrahedraMapper * m_VtkPTMapper
bool GetVisibility(bool &visible, const mitk::BaseRenderer *renderer, const char *propertyKey="visible") const
Convenience access method for visibility properties (instances of BoolProperty with property-key "vis...
Definition: mitkDataNode.h:422
virtual const mitk::UnstructuredGrid * GetInput()
void SetBoundingObject(mitk::BoundingObject *bo)
static void SetDefaultProperties(mitk::DataNode *node, mitk::BaseRenderer *renderer=nullptr, bool overwrite=false)
static Pointer New()
static void SetDefaultPropertiesForVtkProperty(mitk::DataNode *node, mitk::BaseRenderer *renderer, bool overwrite)
void ResetMapper(BaseRenderer *) override
Reset the mapper (i.e., make sure that nothing is displayed) if no valid data is present. In most cases the reimplemented function disables the according actors (toggling visibility off)
static Pointer New()
static vtkUnstructuredGridMapper * New()
vtkUnstructuredGridVolumeRayCastMapper * m_VtkVolumeRayCastMapper
int GetTimestep() const
Returns the current time step as calculated from the renderer.
Definition: mitkMapper.h:147
void GenerateDataForRenderer(mitk::BaseRenderer *renderer) override
Generate the data needed for rendering into renderer.
Class for storing unstructured grids (vtkUnstructuredGrid)
virtual DataStorage::Pointer GetDataStorage() const
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57