VTK  9.0.1
vtkGPUVolumeRayCastMapper.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkGPUVolumeRayCastMapper.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
30 #ifndef vtkGPUVolumeRayCastMapper_h
31 #define vtkGPUVolumeRayCastMapper_h
32 #include <unordered_map> // For std::unordered_map
33 #include <vector> // For std::vector
34 
35 #include "vtkVolumeMapper.h"
36 #include <vtkRenderingVolumeModule.h> // For export macro
37 
38 class vtkContourValues;
39 class vtkRenderWindow;
40 class vtkVolumeProperty;
41 
42 class VTKRENDERINGVOLUME_EXPORT vtkGPUVolumeRayCastMapper : public vtkVolumeMapper
43 {
44 public:
47  void PrintSelf(ostream& os, vtkIndent indent) override;
48 
50 
56  vtkSetClampMacro(AutoAdjustSampleDistances, vtkTypeBool, 0, 1);
57  vtkGetMacro(AutoAdjustSampleDistances, vtkTypeBool);
58  vtkBooleanMacro(AutoAdjustSampleDistances, vtkTypeBool);
60 
62 
67  vtkSetClampMacro(LockSampleDistanceToInputSpacing, vtkTypeBool, 0, 1);
68  vtkGetMacro(LockSampleDistanceToInputSpacing, vtkTypeBool);
69  vtkBooleanMacro(LockSampleDistanceToInputSpacing, vtkTypeBool);
71 
73 
78  vtkSetClampMacro(UseJittering, vtkTypeBool, 0, 1);
79  vtkGetMacro(UseJittering, vtkTypeBool);
80  vtkBooleanMacro(UseJittering, vtkTypeBool);
82 
84 
92  vtkSetClampMacro(UseDepthPass, vtkTypeBool, 0, 1);
93  vtkGetMacro(UseDepthPass, vtkTypeBool);
94  vtkBooleanMacro(UseDepthPass, vtkTypeBool);
96 
102  vtkContourValues* GetDepthPassContourValues();
103 
105 
111  vtkSetMacro(SampleDistance, float);
112  vtkGetMacro(SampleDistance, float);
114 
116 
123  vtkSetClampMacro(ImageSampleDistance, float, 0.1f, 100.0f);
124  vtkGetMacro(ImageSampleDistance, float);
126 
128 
132  vtkSetClampMacro(MinimumImageSampleDistance, float, 0.1f, 100.0f);
133  vtkGetMacro(MinimumImageSampleDistance, float);
135 
137 
141  vtkSetClampMacro(MaximumImageSampleDistance, float, 0.1f, 100.0f);
142  vtkGetMacro(MaximumImageSampleDistance, float);
144 
146 
159  vtkSetMacro(FinalColorWindow, float);
160  vtkGetMacro(FinalColorWindow, float);
161  vtkSetMacro(FinalColorLevel, float);
162  vtkGetMacro(FinalColorLevel, float);
164 
166 
171  vtkSetMacro(MaxMemoryInBytes, vtkIdType);
172  vtkGetMacro(MaxMemoryInBytes, vtkIdType);
174 
176 
181  vtkSetClampMacro(MaxMemoryFraction, float, 0.1f, 1.0f);
182  vtkGetMacro(MaxMemoryFraction, float);
184 
186 
194  vtkSetMacro(ReportProgress, bool);
195  vtkGetMacro(ReportProgress, bool);
197 
204  virtual int IsRenderSupported(
205  vtkRenderWindow* vtkNotUsed(window), vtkVolumeProperty* vtkNotUsed(property))
206  {
207  return 0;
208  }
209 
210  void CreateCanonicalView(vtkRenderer* ren, vtkVolume* volume, vtkImageData* image, int blend_mode,
211  double viewDirection[3], double viewUp[3]);
212 
214 
234  void SetMaskInput(vtkImageData* mask);
235  vtkGetObjectMacro(MaskInput, vtkImageData);
237 
238  enum
239  {
240  BinaryMaskType = 0,
241  LabelMapMaskType
242  };
243 
245 
249  vtkSetMacro(MaskType, int);
250  vtkGetMacro(MaskType, int);
251  void SetMaskTypeToBinary();
252  void SetMaskTypeToLabelMap();
254 
256 
264  vtkSetClampMacro(MaskBlendFactor, float, 0.0f, 1.0f);
265  vtkGetMacro(MaskBlendFactor, float);
267 
269 
283  vtkSetMacro(RenderToImage, vtkTypeBool);
284  vtkGetMacro(RenderToImage, vtkTypeBool);
285  vtkBooleanMacro(RenderToImage, vtkTypeBool);
287 
289 
294  vtkSetMacro(DepthImageScalarType, int);
295  vtkGetMacro(DepthImageScalarType, int);
296  void SetDepthImageScalarTypeToUnsignedChar();
297  void SetDepthImageScalarTypeToUnsignedShort();
298  void SetDepthImageScalarTypeToFloat();
300 
302 
313  vtkSetMacro(ClampDepthToBackface, vtkTypeBool);
314  vtkGetMacro(ClampDepthToBackface, vtkTypeBool);
315  vtkBooleanMacro(ClampDepthToBackface, vtkTypeBool);
317 
324  virtual void GetDepthImage(vtkImageData*) {}
325 
332  virtual void GetColorImage(vtkImageData*) {}
333 
338  void Render(vtkRenderer*, vtkVolume*) override;
339 
344  virtual void GPURender(vtkRenderer*, vtkVolume*) {}
345 
353 
366  virtual void GetReductionRatio(double ratio[3]) = 0;
367 
369  {
370  SCALAR = 0, // default
371  NATIVE
372  };
373 
375 
391  vtkSetMacro(ColorRangeType, int);
392  vtkGetMacro(ColorRangeType, int);
393  vtkSetMacro(ScalarOpacityRangeType, int);
394  vtkGetMacro(ScalarOpacityRangeType, int);
395  vtkSetMacro(GradientOpacityRangeType, int);
396  vtkGetMacro(GradientOpacityRangeType, int);
398 
399  vtkImageData* GetInput() override { return this->GetInput(0); };
400 
402 
406  void RemoveInputConnection(int port, vtkAlgorithmOutput* input) override;
407  void RemoveInputConnection(int port, int idx) override;
408  void SetInputConnection(int port, vtkAlgorithmOutput* input) override;
410  {
411  this->SetInputConnection(0, input);
412  }
414 
418  int GetInputCount();
419 
420  vtkImageData* GetTransformedInput(const int port = 0);
421 
422  double* GetBoundsFromPort(const int port) VTK_SIZEHINT(6);
423 
424 protected:
426  ~vtkGPUVolumeRayCastMapper() override;
427 
436  int FillInputPortInformation(int port, vtkInformation* info) override;
437 
449  void TransformInput(const int port);
450 
452 
461  int ValidateRender(vtkRenderer*, vtkVolume*);
462  int ValidateInputs();
463  int ValidateInput(vtkVolumeProperty* property, const int port);
465 
467 
471  void CloneInputs();
472  void CloneInput(vtkImageData* input, const int port);
474 
475  // Special version of render called during the creation
476  // of a canonical view.
477  void CanonicalViewRender(vtkRenderer*, vtkVolume*);
478 
479  // Methods called by the AMR Volume Mapper.
480  virtual void PreRender(vtkRenderer* ren, vtkVolume* vol, double datasetBounds[6],
481  double scalarRange[2], int numberOfScalarComponents, unsigned int numberOfLevels) = 0;
482 
483  // \pre input is up-to-date
484  virtual void RenderBlock(vtkRenderer* ren, vtkVolume* vol, unsigned int level) = 0;
485 
486  virtual void PostRender(vtkRenderer* ren, int numberOfScalarComponents) = 0;
487  vtkImageData* GetInput(const int port) override;
488 
494  void SetCellFlag(int cellFlag);
495  void RemovePortInternal(const int port);
496 
502 
503  // Render to texture mode flag
505 
506  // Depth image scalar type
508 
509  // Clamp depth values to the depth of the face at which the ray
510  // exits the volume
512 
513  // Enable / disable stochastic jittering
515 
516  // Enable / disable two pass rendering
519 
520  // The distance between sample points along the ray
522 
526 
529 
530  // 1 if we are generating the canonical image, 0 otherwise
533 
535 
539  vtkSetClampMacro(AMRMode, vtkTypeBool, 0, 1);
540  vtkGetMacro(AMRMode, vtkTypeBool);
541  vtkBooleanMacro(AMRMode, vtkTypeBool);
543 
546  int MaskType;
547 
549 
550  // Transfer function range type
554 
555  // Point data or cell data (or field data, not handled) ?
556  int CellFlag;
557 
570  virtual void ClipCroppingRegionPlanes();
571 
572  using DataMap = std::unordered_map<int, vtkImageData*>;
573  void SetTransformedInput(vtkImageData*);
574  vtkImageData* FindData(int port, DataMap& container);
575 
576  double ClippedCroppingRegionPlanes[6];
577 
580 
582  std::vector<int> Ports;
583  std::vector<int> RemovedPorts;
585 
591 
592 private:
594  void operator=(const vtkGPUVolumeRayCastMapper&) = delete;
595 };
596 
597 #endif
virtual void GPURender(vtkRenderer *, vtkVolume *)
Handled in the subclass - the actual render method.
void ReleaseGraphicsResources(vtkWindow *) override
Release any graphics resources that are being consumed by this mapper.
helper object to manage setting and generating contour values
vtkImageData * GetInput() override
Set/Get the input data.
represents a volume (data & properties) in a rendered scene
Definition: vtkVolume.h:44
std::unordered_map< int, vtkImageData * > DataMap
Abstract class for a volume mapper.
Store vtkAlgorithm input/output information.
virtual void GetDepthImage(vtkImageData *)
Low level API to export the depth texture as vtkImageData in RenderToImage mode.
virtual void GetColorImage(vtkImageData *)
Low level API to export the color texture as vtkImageData in RenderToImage mode.
abstract specification for renderers
Definition: vtkRenderer.h:58
int vtkIdType
Definition: vtkType.h:338
void Render(vtkRenderer *ren, vtkVolume *vol) override=0
WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE DO NOT USE THIS METHOD OUTSIDE OF THE RENDERI...
Proxy object to connect input/output ports.
int vtkTypeBool
Definition: vtkABI.h:69
window superclass for vtkRenderWindow
Definition: vtkWindow.h:34
a simple class to control print indentation
Definition: vtkIndent.h:33
int FillInputPortInformation(int, vtkInformation *) override
Fill the input port information objects for this algorithm.
topologically and geometrically regular array of data
Definition: vtkImageData.h:41
virtual void SetInputConnection(int port, vtkAlgorithmOutput *input)
Set the connection for the given input port index.
virtual vtkImageData * GetInput()
Set/Get the input data.
#define VTK_SIZEHINT(...)
represents the common properties for rendering a volume.
virtual int IsRenderSupported(vtkRenderWindow *vtkNotUsed(window), vtkVolumeProperty *vtkNotUsed(property))
Based on hardware and properties, we may or may not be able to render using 3D texture mapping...
create a window for renderers to draw into
DataMap LastInputs
This is needed only to check if the input data has been changed since the last Render() call...
static vtkAlgorithm * New()
Ray casting performed on the GPU.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void SetInputConnection(vtkAlgorithmOutput *input) override
Add/Remove input connections.
virtual void RemoveInputConnection(int port, vtkAlgorithmOutput *input)
Remove a connection from the given input port index.