You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
9.3 KiB
240 lines
9.3 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkUnstructuredGridVolumeRayCastMapper.h,v $
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
|
|
// .NAME vtkUnstructuredGridVolumeRayCastMapper - A software mapper for unstructured volumes
|
|
// .SECTION Description
|
|
// This is a software ray caster for rendering volumes in vtkUnstructuredGrid.
|
|
|
|
// .SECTION see also
|
|
// vtkVolumeMapper
|
|
|
|
#ifndef __vtkUnstructuredGridVolumeRayCastMapper_h
|
|
#define __vtkUnstructuredGridVolumeRayCastMapper_h
|
|
|
|
#include "vtkUnstructuredGridVolumeMapper.h"
|
|
|
|
class vtkMultiThreader;
|
|
class vtkRenderer;
|
|
class vtkTimerLog;
|
|
class vtkVolume;
|
|
class vtkUnstructuredGridVolumeRayCastFunction;
|
|
class vtkUnstructuredGridVolumeRayCastIterator;
|
|
class vtkUnstructuredGridVolumeRayIntegrator;
|
|
class vtkRayCastImageDisplayHelper;
|
|
|
|
class VTK_VOLUMERENDERING_EXPORT vtkUnstructuredGridVolumeRayCastMapper : public vtkUnstructuredGridVolumeMapper
|
|
{
|
|
public:
|
|
static vtkUnstructuredGridVolumeRayCastMapper *New();
|
|
vtkTypeRevisionMacro(vtkUnstructuredGridVolumeRayCastMapper,vtkUnstructuredGridVolumeMapper);
|
|
void PrintSelf( ostream& os, vtkIndent indent );
|
|
|
|
// Description:
|
|
// Control how the filter works with scalar point data and cell attribute
|
|
// data. By default (ScalarModeToDefault), the filter will use point data,
|
|
// and if no point data is available, then cell data is used. Alternatively
|
|
// you can explicitly set the filter to use point data
|
|
// (ScalarModeToUsePointData) or cell data (ScalarModeToUseCellData).
|
|
// You can also choose to get the scalars from an array in point field
|
|
// data (ScalarModeToUsePointFieldData) or cell field data
|
|
// (ScalarModeToUseCellFieldData). If scalars are coming from a field
|
|
// data array, you must call SelectColorArray before you call
|
|
// GetColors.
|
|
vtkSetMacro(ScalarMode,int);
|
|
vtkGetMacro(ScalarMode,int);
|
|
void SetScalarModeToDefault() {
|
|
this->SetScalarMode(VTK_SCALAR_MODE_DEFAULT);};
|
|
void SetScalarModeToUsePointData() {
|
|
this->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_DATA);};
|
|
void SetScalarModeToUseCellData() {
|
|
this->SetScalarMode(VTK_SCALAR_MODE_USE_CELL_DATA);};
|
|
void SetScalarModeToUsePointFieldData() {
|
|
this->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_FIELD_DATA);};
|
|
void SetScalarModeToUseCellFieldData() {
|
|
this->SetScalarMode(VTK_SCALAR_MODE_USE_CELL_FIELD_DATA);};
|
|
|
|
// Description:
|
|
// When ScalarMode is set to UsePointFileData or UseCellFieldData,
|
|
// you can specify which array to use for coloring using these methods.
|
|
// The transfer function in the vtkVolumeProperty (attached to the calling
|
|
// vtkVolume) will decide how to convert vectors to colors.
|
|
virtual void SelectScalarArray(int arrayNum);
|
|
virtual void SelectScalarArray(const char* arrayName);
|
|
|
|
// Description:
|
|
// Get the array name or number and component to color by.
|
|
virtual char* GetArrayName() { return this->ArrayName; }
|
|
virtual int GetArrayId() { return this->ArrayId; }
|
|
virtual int GetArrayAccessMode() { return this->ArrayAccessMode; }
|
|
|
|
// Description:
|
|
// Return the method for obtaining scalar data.
|
|
const char *GetScalarModeAsString();
|
|
|
|
// Description:
|
|
// Sampling distance in the XY image dimensions. Default value of 1 meaning
|
|
// 1 ray cast per pixel. If set to 0.5, 4 rays will be cast per pixel. If
|
|
// set to 2.0, 1 ray will be cast for every 4 (2 by 2) pixels.
|
|
vtkSetClampMacro( ImageSampleDistance, float, 0.1f, 100.0f );
|
|
vtkGetMacro( ImageSampleDistance, float );
|
|
|
|
// Description:
|
|
// This is the minimum image sample distance allow when the image
|
|
// sample distance is being automatically adjusted
|
|
vtkSetClampMacro( MinimumImageSampleDistance, float, 0.1f, 100.0f );
|
|
vtkGetMacro( MinimumImageSampleDistance, float );
|
|
|
|
// Description:
|
|
// This is the maximum image sample distance allow when the image
|
|
// sample distance is being automatically adjusted
|
|
vtkSetClampMacro( MaximumImageSampleDistance, float, 0.1f, 100.0f );
|
|
vtkGetMacro( MaximumImageSampleDistance, float );
|
|
|
|
// Description:
|
|
// If AutoAdjustSampleDistances is on, the the ImageSampleDistance
|
|
// will be varied to achieve the allocated render time of this
|
|
// prop (controlled by the desired update rate and any culling in
|
|
// use).
|
|
vtkSetClampMacro( AutoAdjustSampleDistances, int, 0, 1 );
|
|
vtkGetMacro( AutoAdjustSampleDistances, int );
|
|
vtkBooleanMacro( AutoAdjustSampleDistances, int );
|
|
|
|
// Description:
|
|
// Set/Get the number of threads to use. This by default is equal to
|
|
// the number of available processors detected.
|
|
vtkSetMacro( NumberOfThreads, int );
|
|
vtkGetMacro( NumberOfThreads, int );
|
|
|
|
// Description:
|
|
// If IntermixIntersectingGeometry is turned on, the zbuffer will be
|
|
// captured and used to limit the traversal of the rays.
|
|
vtkSetClampMacro( IntermixIntersectingGeometry, int, 0, 1 );
|
|
vtkGetMacro( IntermixIntersectingGeometry, int );
|
|
vtkBooleanMacro( IntermixIntersectingGeometry, int );
|
|
|
|
// Description:
|
|
// Set/Get the helper class for casting rays.
|
|
virtual void SetRayCastFunction(vtkUnstructuredGridVolumeRayCastFunction *f);
|
|
vtkGetObjectMacro(RayCastFunction, vtkUnstructuredGridVolumeRayCastFunction);
|
|
|
|
// Description:
|
|
// Set/Get the helper class for integrating rays. If set to NULL, a
|
|
// default integrator will be assigned.
|
|
virtual void SetRayIntegrator(vtkUnstructuredGridVolumeRayIntegrator *ri);
|
|
vtkGetObjectMacro(RayIntegrator, vtkUnstructuredGridVolumeRayIntegrator);
|
|
|
|
//BTX
|
|
// Description:
|
|
// WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE
|
|
// Initialize rendering for this volume.
|
|
void Render( vtkRenderer *, vtkVolume * );
|
|
|
|
// Description:
|
|
// WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE
|
|
// Release any graphics resources that are being consumed by this mapper.
|
|
// The parameter window could be used to determine which graphic
|
|
// resources to release.
|
|
void ReleaseGraphicsResources(vtkWindow *);
|
|
|
|
vtkGetVectorMacro( ImageInUseSize, int, 2 );
|
|
vtkGetVectorMacro( ImageOrigin, int, 2 );
|
|
vtkGetVectorMacro( ImageViewportSize, int , 2 );
|
|
|
|
//ETX
|
|
|
|
void CastRays( int threadID, int threadCount );
|
|
|
|
protected:
|
|
vtkUnstructuredGridVolumeRayCastMapper();
|
|
~vtkUnstructuredGridVolumeRayCastMapper();
|
|
|
|
float ImageSampleDistance;
|
|
float MinimumImageSampleDistance;
|
|
float MaximumImageSampleDistance;
|
|
int AutoAdjustSampleDistances;
|
|
|
|
vtkMultiThreader *Threader;
|
|
int NumberOfThreads;
|
|
|
|
vtkRayCastImageDisplayHelper *ImageDisplayHelper;
|
|
|
|
// This is how big the image would be if it covered the entire viewport
|
|
int ImageViewportSize[2];
|
|
|
|
// This is how big the allocated memory for image is. This may be bigger
|
|
// or smaller than ImageFullSize - it will be bigger if necessary to
|
|
// ensure a power of 2, it will be smaller if the volume only covers a
|
|
// small region of the viewport
|
|
int ImageMemorySize[2];
|
|
|
|
// This is the size of subregion in ImageSize image that we are using for
|
|
// the current image. Since ImageSize is a power of 2, there is likely
|
|
// wasted space in it. This number will be used for things such as clearing
|
|
// the image if necessary.
|
|
int ImageInUseSize[2];
|
|
|
|
// This is the location in ImageFullSize image where our ImageSize image
|
|
// is located.
|
|
int ImageOrigin[2];
|
|
|
|
// This is the allocated image
|
|
unsigned char *Image;
|
|
|
|
float *RenderTimeTable;
|
|
vtkVolume **RenderVolumeTable;
|
|
vtkRenderer **RenderRendererTable;
|
|
int RenderTableSize;
|
|
int RenderTableEntries;
|
|
|
|
void StoreRenderTime( vtkRenderer *ren, vtkVolume *vol, float t );
|
|
float RetrieveRenderTime( vtkRenderer *ren, vtkVolume *vol );
|
|
|
|
int IntermixIntersectingGeometry;
|
|
|
|
float *ZBuffer;
|
|
int ZBufferSize[2];
|
|
int ZBufferOrigin[2];
|
|
|
|
// Get the ZBuffer value corresponding to location (x,y) where (x,y)
|
|
// are indexing into the ImageInUse image. This must be converted to
|
|
// the zbuffer image coordinates. Nearest neighbor value is returned.
|
|
double GetZBufferValue( int x, int y );
|
|
|
|
double GetMinimumBoundsDepth( vtkRenderer *ren,
|
|
vtkVolume *vol );
|
|
|
|
vtkUnstructuredGridVolumeRayCastFunction *RayCastFunction;
|
|
vtkUnstructuredGridVolumeRayCastIterator **RayCastIterators;
|
|
vtkUnstructuredGridVolumeRayIntegrator *RayIntegrator;
|
|
vtkUnstructuredGridVolumeRayIntegrator *RealRayIntegrator;
|
|
|
|
vtkVolume *CurrentVolume;
|
|
vtkRenderer *CurrentRenderer;
|
|
|
|
int ScalarMode;
|
|
char *ArrayName;
|
|
int ArrayId;
|
|
int ArrayAccessMode;
|
|
|
|
vtkDataArray *Scalars;
|
|
int CellScalars;
|
|
|
|
private:
|
|
vtkUnstructuredGridVolumeRayCastMapper(const vtkUnstructuredGridVolumeRayCastMapper&); // Not implemented.
|
|
void operator=(const vtkUnstructuredGridVolumeRayCastMapper&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|
|
|