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.
283 lines
10 KiB
283 lines
10 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkVolumeRayCastMapper.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 vtkVolumeRayCastMapper - A slow but accurate mapper for rendering volumes
|
|
// .SECTION Description
|
|
// This is a software ray caster for rendering volumes in vtkImageData.
|
|
|
|
// .SECTION see also
|
|
// vtkVolumeMapper
|
|
|
|
#ifndef __vtkVolumeRayCastMapper_h
|
|
#define __vtkVolumeRayCastMapper_h
|
|
|
|
#include "vtkVolumeMapper.h"
|
|
#include "vtkVolumeRayCastFunction.h" // For vtkVolumeRayCastStaticInfo
|
|
// and vtkVolumeRayCastDynamicInfo
|
|
#include "vtkFastNumericConversion.h" // for fast rounding and floor
|
|
|
|
class vtkEncodedGradientEstimator;
|
|
class vtkEncodedGradientShader;
|
|
class vtkMatrix4x4;
|
|
class vtkMultiThreader;
|
|
class vtkPlaneCollection;
|
|
class vtkRenderer;
|
|
class vtkTimerLog;
|
|
class vtkVolume;
|
|
class vtkVolumeRayCastFunction;
|
|
class vtkVolumeTransform;
|
|
class vtkTransform;
|
|
class vtkRayCastImageDisplayHelper;
|
|
|
|
//BTX
|
|
// Macro for floor of x
|
|
|
|
inline int vtkFloorFuncMacro(double x)
|
|
{
|
|
return vtkFastNumericConversion::QuickFloor(x);
|
|
}
|
|
|
|
|
|
// Macro for rounding x (for x >= 0)
|
|
inline int vtkRoundFuncMacro(double x)
|
|
{
|
|
return vtkFastNumericConversion::Round(x);
|
|
}
|
|
//ETX
|
|
|
|
// Macro for tri-linear interpolation - do four linear interpolations on
|
|
// edges, two linear interpolations between pairs of edges, then a final
|
|
// interpolation between faces
|
|
#define vtkTrilinFuncMacro(v,x,y,z,a,b,c,d,e,f,g,h) \
|
|
t00 = a + (x)*(b-a); \
|
|
t01 = c + (x)*(d-c); \
|
|
t10 = e + (x)*(f-e); \
|
|
t11 = g + (x)*(h-g); \
|
|
t0 = t00 + (y)*(t01-t00); \
|
|
t1 = t10 + (y)*(t11-t10); \
|
|
v = t0 + (z)*(t1-t0);
|
|
|
|
// Forward declaration needed for use by friend declaration below.
|
|
VTK_THREAD_RETURN_TYPE VolumeRayCastMapper_CastRays( void *arg );
|
|
|
|
class VTK_VOLUMERENDERING_EXPORT vtkVolumeRayCastMapper : public vtkVolumeMapper
|
|
{
|
|
public:
|
|
static vtkVolumeRayCastMapper *New();
|
|
vtkTypeRevisionMacro(vtkVolumeRayCastMapper,vtkVolumeMapper);
|
|
void PrintSelf( ostream& os, vtkIndent indent );
|
|
|
|
// Description:
|
|
// Set/Get the distance between samples. This variable is only
|
|
// used for sampling ray casting methods. Methods that compute
|
|
// a ray value by stepping cell-by-cell are not affected by this
|
|
// value.
|
|
vtkSetMacro( SampleDistance, double );
|
|
vtkGetMacro( SampleDistance, double );
|
|
|
|
// Description:
|
|
// Get / Set the volume ray cast function. This is used to process
|
|
// values found along the ray to compute a final pixel value.
|
|
virtual void SetVolumeRayCastFunction(vtkVolumeRayCastFunction*);
|
|
vtkGetObjectMacro( VolumeRayCastFunction, vtkVolumeRayCastFunction );
|
|
|
|
// Description:
|
|
// Set / Get the gradient estimator used to estimate normals
|
|
virtual void SetGradientEstimator(vtkEncodedGradientEstimator *gradest);
|
|
vtkGetObjectMacro( GradientEstimator, vtkEncodedGradientEstimator );
|
|
|
|
// Description:
|
|
// Get the gradient shader.
|
|
vtkGetObjectMacro( GradientShader, vtkEncodedGradientShader );
|
|
|
|
// 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, double, 0.1, 100.0 );
|
|
vtkGetMacro( ImageSampleDistance, double );
|
|
|
|
// Description:
|
|
// This is the minimum image sample distance allow when the image
|
|
// sample distance is being automatically adjusted
|
|
vtkSetClampMacro( MinimumImageSampleDistance, double, 0.1, 100.0 );
|
|
vtkGetMacro( MinimumImageSampleDistance, double );
|
|
|
|
// Description:
|
|
// This is the maximum image sample distance allow when the image
|
|
// sample distance is being automatically adjusted
|
|
vtkSetClampMacro( MaximumImageSampleDistance, double, 0.1, 100.0 );
|
|
vtkGetMacro( MaximumImageSampleDistance, double );
|
|
|
|
// 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.
|
|
void SetNumberOfThreads( int num );
|
|
int GetNumberOfThreads();
|
|
|
|
// 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 );
|
|
|
|
//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 *);
|
|
|
|
// Description:
|
|
// WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE
|
|
// Return the scalar value below which all opacities are zero
|
|
float GetZeroOpacityThreshold( vtkVolume *vol );
|
|
|
|
// Description:
|
|
// WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE
|
|
// Values needed by the volume
|
|
virtual float GetGradientMagnitudeScale();
|
|
virtual float GetGradientMagnitudeBias();
|
|
virtual float GetGradientMagnitudeScale(int)
|
|
{return this->GetGradientMagnitudeScale();};
|
|
virtual float GetGradientMagnitudeBias(int)
|
|
{return this->GetGradientMagnitudeBias();};
|
|
|
|
//ETX
|
|
|
|
protected:
|
|
vtkVolumeRayCastMapper();
|
|
~vtkVolumeRayCastMapper();
|
|
|
|
vtkVolumeRayCastFunction *VolumeRayCastFunction;
|
|
vtkEncodedGradientEstimator *GradientEstimator;
|
|
vtkEncodedGradientShader *GradientShader;
|
|
vtkRayCastImageDisplayHelper *ImageDisplayHelper;
|
|
|
|
virtual void ReportReferences(vtkGarbageCollector*);
|
|
|
|
// The distance between sample points along the ray
|
|
double SampleDistance;
|
|
double ImageSampleDistance;
|
|
double MinimumImageSampleDistance;
|
|
double MaximumImageSampleDistance;
|
|
int AutoAdjustSampleDistances;
|
|
|
|
double WorldSampleDistance;
|
|
int ScalarDataType;
|
|
void *ScalarDataPointer;
|
|
|
|
void UpdateShadingTables( vtkRenderer *ren,
|
|
vtkVolume *vol );
|
|
|
|
void ComputeMatrices( vtkImageData *data, vtkVolume *vol );
|
|
int ComputeRowBounds( vtkVolume *vol, vtkRenderer *ren );
|
|
|
|
friend VTK_THREAD_RETURN_TYPE VolumeRayCastMapper_CastRays( void *arg );
|
|
|
|
vtkMultiThreader *Threader;
|
|
|
|
vtkMatrix4x4 *PerspectiveMatrix;
|
|
vtkMatrix4x4 *ViewToWorldMatrix;
|
|
vtkMatrix4x4 *ViewToVoxelsMatrix;
|
|
vtkMatrix4x4 *VoxelsToViewMatrix;
|
|
vtkMatrix4x4 *WorldToVoxelsMatrix;
|
|
vtkMatrix4x4 *VoxelsToWorldMatrix;
|
|
|
|
vtkMatrix4x4 *VolumeMatrix;
|
|
|
|
vtkTransform *PerspectiveTransform;
|
|
vtkTransform *VoxelsTransform;
|
|
vtkTransform *VoxelsToViewTransform;
|
|
|
|
// 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;
|
|
|
|
int *RowBounds;
|
|
int *OldRowBounds;
|
|
|
|
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];
|
|
|
|
float MinimumViewDistance;
|
|
|
|
int ClipRayAgainstVolume( vtkVolumeRayCastDynamicInfo *dynamicInfo,
|
|
float bounds[6] );
|
|
|
|
void InitializeClippingPlanes( vtkVolumeRayCastStaticInfo *staticInfo,
|
|
vtkPlaneCollection *planes );
|
|
|
|
int ClipRayAgainstClippingPlanes( vtkVolumeRayCastDynamicInfo *dynamicInfo,
|
|
vtkVolumeRayCastStaticInfo *staticInfo);
|
|
|
|
// 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 );
|
|
|
|
private:
|
|
vtkVolumeRayCastMapper(const vtkVolumeRayCastMapper&); // Not implemented.
|
|
void operator=(const vtkVolumeRayCastMapper&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|
|
|