Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkVolumeMapperVtkSmart3D.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 
17 #include <vtkObjectFactory.h>
18 #include <vtkRenderingOpenGL2ObjectFactory.h>
19 #include <vtkRenderingVolumeOpenGL2ObjectFactory.h>
20 #include <vtkColorTransferFunction.h>
21 #include <vtkPiecewiseFunction.h>
22 
24 {
25  bool value;
26  this->GetDataNode()->GetBoolProperty("volumerendering", value, renderer);
27  if (!value)
28  {
29  m_Volume->VisibilityOff();
30  return;
31  }
32  else
33  {
34  m_Volume->VisibilityOn();
35  }
36 
37  UpdateTransferFunctions(renderer);
38  UpdateRenderMode(renderer);
39  this->Modified();
40 }
41 
43 {
44  if (!m_Volume->GetMapper())
45  {
47  createVolume();
49  }
50 
51  return m_Volume;
52 }
53 
55 {
56 
57 }
58 
60 {
61  // GPU_INFO << "SetDefaultProperties";
62 
63  node->AddProperty("volumerendering", mitk::BoolProperty::New(false), renderer, overwrite);
64  node->AddProperty("volumerendering.usemip", mitk::BoolProperty::New(false), renderer, overwrite);
65 
66  node->AddProperty("volumerendering.cpu.ambient", mitk::FloatProperty::New(0.10f), renderer, overwrite);
67  node->AddProperty("volumerendering.cpu.diffuse", mitk::FloatProperty::New(0.50f), renderer, overwrite);
68  node->AddProperty("volumerendering.cpu.specular", mitk::FloatProperty::New(0.40f), renderer, overwrite);
69  node->AddProperty("volumerendering.cpu.specular.power", mitk::FloatProperty::New(16.0f), renderer, overwrite);
70  node->AddProperty("volumerendering.usegpu", mitk::BoolProperty::New(false), renderer, overwrite);
71  node->AddProperty("volumerendering.useray", mitk::BoolProperty::New(false), renderer, overwrite);
72 
73  node->AddProperty("volumerendering.gpu.ambient", mitk::FloatProperty::New(0.25f), renderer, overwrite);
74  node->AddProperty("volumerendering.gpu.diffuse", mitk::FloatProperty::New(0.50f), renderer, overwrite);
75  node->AddProperty("volumerendering.gpu.specular", mitk::FloatProperty::New(0.40f), renderer, overwrite);
76  node->AddProperty("volumerendering.gpu.specular.power", mitk::FloatProperty::New(16.0f), renderer, overwrite);
77 
78  node->AddProperty("binary", mitk::BoolProperty::New(false), renderer, overwrite);
79 
80  mitk::Image::Pointer image = dynamic_cast<mitk::Image *>(node->GetData());
81  if (image.IsNotNull() && image->IsInitialized())
82  {
83  if ((overwrite) || (node->GetProperty("TransferFunction", renderer) == nullptr))
84  {
85  // add a default transfer function
88  tfInit->SetTransferFunctionMode(0);
89  node->SetProperty("TransferFunction", mitk::TransferFunctionProperty::New(tf.GetPointer()));
90  }
91  }
92 
93  Superclass::SetDefaultProperties(node, renderer, overwrite);
94 }
95 
97 {
98  auto input = dynamic_cast<mitk::Image*>(this->GetDataNode()->GetData());
99  return input->GetVtkImageData(this->GetTimestep());
100 }
101 
102 void mitk::VolumeMapperVtkSmart3D::createMapper(vtkImageData* imageData)
103 {
104  Vector3D spacing;
105  FillVector3D(spacing, 1.0, 1.0, 1.0);
106 
107  m_ImageChangeInformation->SetInputData(imageData);
108  m_ImageChangeInformation->SetOutputSpacing(spacing.GetDataPointer());
109 
110  m_SmartVolumeMapper->SetBlendModeToComposite();
111  m_SmartVolumeMapper->SetInputConnection(m_ImageChangeInformation->GetOutputPort());
112 }
113 
115 {
116  m_Volume->VisibilityOff();
117  m_Volume->SetMapper(m_SmartVolumeMapper);
118  m_Volume->SetProperty(m_VolumeProperty);
119 }
120 
122 {
123  m_VolumeProperty->ShadeOn();
124  m_VolumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION);
125 }
126 
128 {
129  vtkSmartPointer<vtkPiecewiseFunction> opacityTransferFunction;
130  vtkSmartPointer<vtkPiecewiseFunction> gradientTransferFunction;
131  vtkSmartPointer<vtkColorTransferFunction> colorTransferFunction;
132 
133  bool isBinary = false;
134 
135  this->GetDataNode()->GetBoolProperty("binary", isBinary, renderer);
136 
137  if (isBinary)
138  {
139  colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();
140 
141  float rgb[3];
142  if (!GetDataNode()->GetColor(rgb, renderer))
143  rgb[0] = rgb[1] = rgb[2] = 1;
144  colorTransferFunction->AddRGBPoint(0, rgb[0], rgb[1], rgb[2]);
145  colorTransferFunction->Modified();
146 
147  opacityTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
148  gradientTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
149  }
150  else
151  {
152  auto *transferFunctionProp =
153  dynamic_cast<mitk::TransferFunctionProperty *>(this->GetDataNode()->GetProperty("TransferFunction", renderer));
154 
155  if (transferFunctionProp)
156  {
157  opacityTransferFunction = transferFunctionProp->GetValue()->GetScalarOpacityFunction();
158  gradientTransferFunction = transferFunctionProp->GetValue()->GetGradientOpacityFunction();
159  colorTransferFunction = transferFunctionProp->GetValue()->GetColorTransferFunction();
160  }
161  else
162  {
163  opacityTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
164  gradientTransferFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
165  colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();
166  }
167  }
168 
169  m_VolumeProperty->SetColor(colorTransferFunction);
170  m_VolumeProperty->SetScalarOpacity(opacityTransferFunction);
171  m_VolumeProperty->SetGradientOpacity(gradientTransferFunction);
172 }
173 
174 
176 {
177  bool usegpu = false;
178  bool useray = false;
179  bool usemip = false;
180  this->GetDataNode()->GetBoolProperty("volumerendering.usegpu", usegpu);
181  this->GetDataNode()->GetBoolProperty("volumerendering.useray", useray);
182  this->GetDataNode()->GetBoolProperty("volumerendering.usemip", usemip);
183 
184  if (usegpu)
185  m_SmartVolumeMapper->SetRequestedRenderModeToGPU();
186  else if (useray)
187  m_SmartVolumeMapper->SetRequestedRenderModeToRayCast();
188  else
189  m_SmartVolumeMapper->SetRequestedRenderModeToDefault();
190 
191  int blendMode;
192  if (this->GetDataNode()->GetIntProperty("volumerendering.blendmode", blendMode))
193  m_SmartVolumeMapper->SetBlendMode(blendMode);
194  else if (usemip)
195  m_SmartVolumeMapper->SetBlendMode(vtkSmartVolumeMapper::MAXIMUM_INTENSITY_BLEND);
196 
197  // shading parameter
198  if (m_SmartVolumeMapper->GetRequestedRenderMode() == vtkSmartVolumeMapper::GPURenderMode)
199  {
200  float value = 0;
201  if (this->GetDataNode()->GetFloatProperty("volumerendering.gpu.ambient", value, renderer))
202  m_VolumeProperty->SetAmbient(value);
203  if (this->GetDataNode()->GetFloatProperty("volumerendering.gpu.diffuse", value, renderer))
204  m_VolumeProperty->SetDiffuse(value);
205  if (this->GetDataNode()->GetFloatProperty("volumerendering.gpu.specular", value, renderer))
206  m_VolumeProperty->SetSpecular(value);
207  if (this->GetDataNode()->GetFloatProperty("volumerendering.gpu.specular.power", value, renderer))
208  m_VolumeProperty->SetSpecularPower(value);
209  }
210  else
211  {
212  float value = 0;
213  if (this->GetDataNode()->GetFloatProperty("volumerendering.cpu.ambient", value, renderer))
214  m_VolumeProperty->SetAmbient(value);
215  if (this->GetDataNode()->GetFloatProperty("volumerendering.cpu.diffuse", value, renderer))
216  m_VolumeProperty->SetDiffuse(value);
217  if (this->GetDataNode()->GetFloatProperty("volumerendering.cpu.specular", value, renderer))
218  m_VolumeProperty->SetSpecular(value);
219  if (this->GetDataNode()->GetFloatProperty("volumerendering.cpu.specular.power", value, renderer))
220  m_VolumeProperty->SetSpecularPower(value);
221  }
222 }
223 
225 {
226  m_RenderingOpenGL2ObjectFactory = vtkSmartPointer<vtkRenderingOpenGL2ObjectFactory>::New();
227  m_RenderingVolumeOpenGL2ObjectFactory = vtkSmartPointer<vtkRenderingVolumeOpenGL2ObjectFactory>::New();
228 
229  vtkObjectFactory::RegisterFactory(m_RenderingOpenGL2ObjectFactory);
230  vtkObjectFactory::RegisterFactory(m_RenderingVolumeOpenGL2ObjectFactory);
231 
232  m_SmartVolumeMapper = vtkSmartPointer<vtkSmartVolumeMapper>::New();
233  m_SmartVolumeMapper->SetBlendModeToComposite();
234  m_ImageChangeInformation = vtkSmartPointer<vtkImageChangeInformation>::New();
235  m_VolumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
236  m_Volume = vtkSmartPointer<vtkVolume>::New();
237 }
238 
240 {
241 
242 }
243 
244 
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...
The TransferFunctionProperty class Property class for the mitk::TransferFunction. ...
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
vtkSmartPointer< vtkSmartVolumeMapper > m_SmartVolumeMapper
bool GetFloatProperty(const char *propertyKey, float &floatValue, const mitk::BaseRenderer *renderer=nullptr) const
Convenience access method for float properties (instances of FloatProperty)
Organizes the rendering process.
vtkSmartPointer< vtkVolume > m_Volume
virtual vtkImageData * GetVtkImageData(int t=0, int n=0)
Get a volume at a specific time t of channel n as a vtkImageData.
Definition: mitkImage.cpp:217
vtkSmartPointer< vtkRenderingVolumeOpenGL2ObjectFactory > m_RenderingVolumeOpenGL2ObjectFactory
vtkProp * GetVtkProp(mitk::BaseRenderer *renderer) override
virtual mitk::TransferFunction::Pointer GetValue() const
bool GetBoolProperty(const char *propertyKey, bool &boolValue, const mitk::BaseRenderer *renderer=nullptr) const
Convenience access method for bool properties (instances of BoolProperty)
void ApplyProperties(vtkActor *actor, mitk::BaseRenderer *renderer) override
Apply color and opacity properties read from the PropertyList.
void FillVector3D(Tout &out, mitk::ScalarType x, mitk::ScalarType y, mitk::ScalarType z)
Definition: mitkArray.h:106
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 ...
static void SetDefaultProperties(mitk::DataNode *node, mitk::BaseRenderer *renderer=nullptr, bool overwrite=false)
vtkSmartPointer< vtkImageChangeInformation > m_ImageChangeInformation
vtkSmartPointer< vtkVolumeProperty > m_VolumeProperty
virtual bool GetColor(float rgb[3], BaseRenderer *renderer, const char *name="color") const
Convenience access method for color properties (instances of ColorProperty)
Definition: mitkMapper.cpp:36
Image class for storing images.
Definition: mitkImage.h:72
void UpdateTransferFunctions(mitk::BaseRenderer *renderer)
vtkSmartPointer< vtkRenderingOpenGL2ObjectFactory > m_RenderingOpenGL2ObjectFactory
static Pointer New()
mitk::Image::Pointer image
void GenerateDataForRenderer(mitk::BaseRenderer *renderer) override
Generate the data needed for rendering into renderer.
static Pointer New()
void UpdateRenderMode(mitk::BaseRenderer *renderer)
int GetTimestep() const
Returns the current time step as calculated from the renderer.
Definition: mitkMapper.h:147
Class for nodes of the DataTree.
Definition: mitkDataNode.h:57