You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
6.0 KiB
C
197 lines
6.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkMultiBlockVolumeMapper.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* \class vtkMultiBlockVolumeMapper
|
||
|
* \brief Mapper to render volumes defined as vtkMultiBlockDataSet.
|
||
|
*
|
||
|
* vtkMultiBlockVolumeMapper renders vtkMultiBlockDataSet instances containing
|
||
|
* vtkImageData blocks (all of the blocks are expected to be vtkImageData). Bounds
|
||
|
* containing the full set of blocks are computed so that vtkRenderer can adjust the
|
||
|
* clipping planes appropriately.
|
||
|
*
|
||
|
* This mapper creates an instance of vtkSmartVolumeMapper per block to which
|
||
|
* it defers the actual rendering. At render time, blocks (mappers) are sorted
|
||
|
* back-to-front and each block is rendered independently. It attempts to load all
|
||
|
* of the blocks at the same time but tries to catch allocation errors in which case
|
||
|
* it falls back to using a single mapper instance and reloading data for each block.
|
||
|
*
|
||
|
* Jittering is used to alleviate seam artifacts at the block edges due to the
|
||
|
* discontinuous resolution between blocks. Jittering is enabled by default.
|
||
|
* Jittering is only supported in GPURenderMode.
|
||
|
*
|
||
|
*/
|
||
|
#ifndef vtkMultiBlockVolumeMapper_h
|
||
|
#define vtkMultiBlockVolumeMapper_h
|
||
|
|
||
|
#include <vector> // For DataBlocks
|
||
|
|
||
|
#include "vtkRenderingVolumeOpenGL2Module.h" // For export macro
|
||
|
#include "vtkVolumeMapper.h"
|
||
|
|
||
|
class vtkDataObjectTree;
|
||
|
class vtkDataSet;
|
||
|
class vtkImageData;
|
||
|
class vtkMultiBlockDataSet;
|
||
|
class vtkSmartVolumeMapper;
|
||
|
|
||
|
class VTKRENDERINGVOLUMEOPENGL2_EXPORT vtkMultiBlockVolumeMapper : public vtkVolumeMapper
|
||
|
{
|
||
|
public:
|
||
|
static vtkMultiBlockVolumeMapper* New();
|
||
|
vtkTypeMacro(vtkMultiBlockVolumeMapper, vtkVolumeMapper);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* \brief API Superclass
|
||
|
* \sa vtkAbstractVolumeMapper
|
||
|
*/
|
||
|
double* GetBounds() override;
|
||
|
using vtkAbstractVolumeMapper::GetBounds;
|
||
|
|
||
|
void SelectScalarArray(int arrayNum) override;
|
||
|
void SelectScalarArray(char const* arrayName) override;
|
||
|
void SetScalarMode(int ScalarMode) override;
|
||
|
void SetArrayAccessMode(int accessMode) override;
|
||
|
|
||
|
/**
|
||
|
* Render the current dataset.
|
||
|
*
|
||
|
* \warning Internal method - not intended for general use, do
|
||
|
* NOT use this method outside of the rendering process.
|
||
|
*/
|
||
|
void Render(vtkRenderer* ren, vtkVolume* vol) override;
|
||
|
|
||
|
/**
|
||
|
* \warning Internal method - not intended for general use, do
|
||
|
* NOT use this method outside of the rendering process.
|
||
|
*/
|
||
|
void ReleaseGraphicsResources(vtkWindow* window) override;
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* VectorMode interface exposed from vtkSmartVolumeMapper.
|
||
|
*/
|
||
|
void SetVectorMode(int mode);
|
||
|
vtkGetMacro(VectorMode, int);
|
||
|
void SetVectorComponent(int component);
|
||
|
vtkGetMacro(VectorComponent, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Blending mode API from vtkVolumeMapper
|
||
|
* \sa vtkVolumeMapper::SetBlendMode
|
||
|
*/
|
||
|
void SetBlendMode(int mode) override;
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Cropping API from vtkVolumeMapper
|
||
|
* \sa vtkVolumeMapper::SetCropping
|
||
|
*/
|
||
|
void SetCropping(vtkTypeBool mode) override;
|
||
|
|
||
|
/**
|
||
|
* \sa vtkVolumeMapper::SetCroppingRegionPlanes
|
||
|
*/
|
||
|
void SetCroppingRegionPlanes(
|
||
|
double arg1, double arg2, double arg3, double arg4, double arg5, double arg6) override;
|
||
|
void SetCroppingRegionPlanes(const double* planes) override;
|
||
|
|
||
|
/**
|
||
|
* \sa vtkVolumeMapper::SetCroppingRegionFlags
|
||
|
*/
|
||
|
void SetCroppingRegionFlags(int mode) override;
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Forwarded to internal vtkSmartVolumeMappers used.
|
||
|
* @sa vtkSmartVolumeMapper::SetRequestedRenderMode.
|
||
|
*/
|
||
|
void SetRequestedRenderMode(int);
|
||
|
//@}
|
||
|
|
||
|
protected:
|
||
|
vtkMultiBlockVolumeMapper();
|
||
|
~vtkMultiBlockVolumeMapper() override;
|
||
|
|
||
|
/**
|
||
|
* Specify the type of data this mapper can handle. This mapper requires
|
||
|
* vtkDataObjectTree, internally checks whether all the blocks of the data
|
||
|
* set are vtkImageData.
|
||
|
*
|
||
|
* \sa vtkAlgorithm::FillInputPortInformation
|
||
|
*/
|
||
|
int FillInputPortInformation(int port, vtkInformation* info) override;
|
||
|
|
||
|
private:
|
||
|
/**
|
||
|
* Traverse the vtkMultiBlockDataSet and create shallow copies to its valid blocks
|
||
|
* (vtkImageData blocks). References are kept in a vector which is sorted back-to-front
|
||
|
* on every render call.
|
||
|
*/
|
||
|
void LoadDataSet(vtkRenderer* ren, vtkVolume* vol);
|
||
|
|
||
|
/**
|
||
|
* Creates a mapper per data block and tries to load the data. If allocating
|
||
|
* fails in any of the mappers, an additional mapper instance is created
|
||
|
* (FallBackMapper) and used for rendering (single mapper). The FallBackMapper
|
||
|
* instance is created and used in single-mapper-mode for convenience, just to
|
||
|
* keep using the Mappers vector for sorting without having to manage their
|
||
|
* data.
|
||
|
*/
|
||
|
void CreateMappers(vtkDataObjectTree* input, vtkRenderer* ren, vtkVolume* vol);
|
||
|
|
||
|
vtkDataObjectTree* GetDataObjectTreeInput();
|
||
|
|
||
|
/**
|
||
|
* Compute the bounds enclosing all of the blocks in the dataset.
|
||
|
*/
|
||
|
void ComputeBounds();
|
||
|
|
||
|
/**
|
||
|
* Sort loaded vtkImageData blocks back-to-front.
|
||
|
*/
|
||
|
void SortMappers(vtkRenderer* ren, vtkMatrix4x4* volumeMat);
|
||
|
|
||
|
void ClearMappers();
|
||
|
|
||
|
/**
|
||
|
* Create and setup a proxy rendering-mapper with the current flags.
|
||
|
*/
|
||
|
vtkSmartVolumeMapper* CreateMapper();
|
||
|
|
||
|
vtkMultiBlockVolumeMapper(const vtkMultiBlockVolumeMapper&) = delete;
|
||
|
void operator=(const vtkMultiBlockVolumeMapper&) = delete;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
typedef std::vector<vtkSmartVolumeMapper*> MapperVec;
|
||
|
MapperVec Mappers;
|
||
|
vtkSmartVolumeMapper* FallBackMapper;
|
||
|
|
||
|
vtkMTimeType BlockLoadingTime;
|
||
|
vtkMTimeType BoundsComputeTime;
|
||
|
|
||
|
int VectorMode;
|
||
|
int VectorComponent;
|
||
|
int RequestedRenderMode;
|
||
|
};
|
||
|
#endif
|