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.
174 lines
6.4 KiB
174 lines
6.4 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkVolumeRayCastFunction.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 vtkVolumeRayCastFunction - a superclass for ray casting functions
|
|
|
|
// .SECTION Description
|
|
// vtkVolumeRayCastFunction is a superclass for ray casting functions that
|
|
// can be used within a vtkVolumeRayCastMapper. This includes for example,
|
|
// vtkVolumeRayCastCompositeFunction, vtkVolumeRayCastMIPFunction, and
|
|
// vtkVolumeRayCastIsosurfaceFunction.
|
|
|
|
// .SECTION See Also
|
|
// vtkVolumeRayCastCompositeFunction vtkVolumeRayCastMIPFunction
|
|
// vtkVolumeRayCastIsosurfaceFunction vtkVolumeRayCastMapper
|
|
|
|
#ifndef __vtkVolumeRayCastFunction_h
|
|
#define __vtkVolumeRayCastFunction_h
|
|
|
|
#include "vtkObject.h"
|
|
|
|
class vtkRenderer;
|
|
class vtkVolume;
|
|
class vtkVolumeRayCastMapper;
|
|
|
|
// Define a couple of structures we need to hold all the important information
|
|
// This first structure hold the dynamic information - stuff that changes per
|
|
// ray
|
|
typedef struct
|
|
{
|
|
// These are the return values - RGBA
|
|
float Color[4];
|
|
float ScalarValue;
|
|
|
|
// Ray information transformed into local coordinates
|
|
float TransformedStart[4];
|
|
float TransformedEnd[4];
|
|
float TransformedDirection[4];
|
|
float TransformedIncrement[3];
|
|
|
|
// The number of steps we want to take if this is
|
|
// a ray caster that takes steps
|
|
int NumberOfStepsToTake;
|
|
|
|
// The number of steps we actually take if this is
|
|
// a ray caster that takes steps
|
|
int NumberOfStepsTaken;
|
|
|
|
} vtkVolumeRayCastDynamicInfo;
|
|
|
|
// This second structure hold the static information - things that don't
|
|
// change over the whole image
|
|
typedef struct
|
|
{
|
|
// A pointer to the volume
|
|
vtkVolume *Volume;
|
|
|
|
// A pointer to the renderer
|
|
vtkRenderer *Renderer;
|
|
|
|
// Matrices for switching from view to volume coordinate, and back
|
|
float WorldToVoxelsMatrix[16];
|
|
float VoxelsToWorldMatrix[16];
|
|
float ViewToVoxelsMatrix[16];
|
|
|
|
float *ClippingPlane;
|
|
int NumberOfClippingPlanes;
|
|
|
|
// The camera thickness (distance between near and far) is necessary
|
|
// for computing sampling distance
|
|
float CameraThickness;
|
|
|
|
// The type of the data and a pointer to it, and the information
|
|
// about its size, spacing, origin and precomputed increment
|
|
int ScalarDataType;
|
|
void *ScalarDataPointer;
|
|
int DataIncrement[3];
|
|
int DataSize[3];
|
|
double DataSpacing[3];
|
|
double DataOrigin[3];
|
|
|
|
// Information from the vtkVolumeProperty
|
|
int Shading;
|
|
int ColorChannels;
|
|
float Color[3];
|
|
int InterpolationType;
|
|
|
|
// The shading tables from the vtkEncodedGradientShader
|
|
// that will be used for shading the volume.
|
|
float *RedDiffuseShadingTable;
|
|
float *GreenDiffuseShadingTable;
|
|
float *BlueDiffuseShadingTable;
|
|
float *RedSpecularShadingTable;
|
|
float *GreenSpecularShadingTable;
|
|
float *BlueSpecularShadingTable;
|
|
|
|
// Info needed from the gradient estimator
|
|
unsigned short *EncodedNormals;
|
|
unsigned char *GradientMagnitudes;
|
|
|
|
// Image information
|
|
int ImageInUseSize[2];
|
|
int ImageMemorySize[2];
|
|
int ImageViewportSize[2];
|
|
int ImageOrigin[2];
|
|
unsigned char *Image;
|
|
|
|
int *RowBounds;
|
|
|
|
// Is a MIP ray cast function in use? This will control
|
|
// how subsegments of the ray are combined when non-subvolume
|
|
// cropping is used. If maximize opacity is used, the color[3]
|
|
// value is used to find the max othersize the dynamicInfo->ScalarValue
|
|
// value is used
|
|
int MIPFunction;
|
|
int MaximizeOpacity;
|
|
} vtkVolumeRayCastStaticInfo;
|
|
|
|
class VTK_VOLUMERENDERING_EXPORT vtkVolumeRayCastFunction : public vtkObject
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkVolumeRayCastFunction,vtkObject);
|
|
virtual void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Do the basic initialization. This includes saving the parameters
|
|
// passed in into local variables, as well as grabbing some useful
|
|
// info from the volume property and normal encoder. This initialize
|
|
// routine is called once per render. It also calls the
|
|
// SpecificFunctionInitialize of the subclass function.
|
|
//BTX
|
|
void FunctionInitialize( vtkRenderer *ren,
|
|
vtkVolume *vol,
|
|
vtkVolumeRayCastStaticInfo *staticInfo );
|
|
|
|
virtual void CastRay( vtkVolumeRayCastDynamicInfo *dynamicInfo,
|
|
vtkVolumeRayCastStaticInfo *staticInfo )=0;
|
|
//ETX
|
|
|
|
// Description:
|
|
// Get the value below which all scalar values are considered to
|
|
// have 0 opacity.
|
|
virtual float GetZeroOpacityThreshold( vtkVolume *vol )=0;
|
|
|
|
protected:
|
|
vtkVolumeRayCastFunction() {};
|
|
~vtkVolumeRayCastFunction() {};
|
|
|
|
// Description:
|
|
// This method gives the subclass a chance to do any special
|
|
// initialization that it may need to do
|
|
//BTX
|
|
virtual void SpecificFunctionInitialize( vtkRenderer *ren,
|
|
vtkVolume *vol,
|
|
vtkVolumeRayCastStaticInfo *staticInfo,
|
|
vtkVolumeRayCastMapper *mapper )=0;
|
|
//ETX
|
|
private:
|
|
vtkVolumeRayCastFunction(const vtkVolumeRayCastFunction&); // Not implemented.
|
|
void operator=(const vtkVolumeRayCastFunction&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|