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.
184 lines
6.5 KiB
C
184 lines
6.5 KiB
C
|
3 weeks ago
|
/*=========================================================================
|
||
|
|
|
||
|
|
Program: Visualization Toolkit
|
||
|
|
Module: vtkVolumeRayCastFunction.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 vtkVolumeRayCastFunction
|
||
|
|
* @brief a superclass for ray casting functions
|
||
|
|
*
|
||
|
|
*
|
||
|
|
* vtkVolumeRayCastFunction is a superclass for ray casting functions that
|
||
|
|
* can be used within a vtkVolumeRayCastMapper. This includes for example,
|
||
|
|
* vtkVolumeRayCastCompositeFunction, vtkVolumeRayCastMIPFunction, and
|
||
|
|
* vtkVolumeRayCastIsosurfaceFunction.
|
||
|
|
*
|
||
|
|
* @sa
|
||
|
|
* vtkVolumeRayCastCompositeFunction vtkVolumeRayCastMIPFunction
|
||
|
|
* vtkVolumeRayCastIsosurfaceFunction vtkVolumeRayCastMapper
|
||
|
|
* @deprecated
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef vtkVolumeRayCastFunction_h
|
||
|
|
#define vtkVolumeRayCastFunction_h
|
||
|
|
|
||
|
|
#include "vtkRenderingVolumeModule.h" // For export macro
|
||
|
|
#include "vtkObject.h"
|
||
|
|
|
||
|
|
class vtkRenderer;
|
||
|
|
class vtkVolume;
|
||
|
|
class vtkVolumeRayCastMapper;
|
||
|
|
|
||
|
|
#if !defined(VTK_LEGACY_REMOVE)
|
||
|
|
// 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;
|
||
|
|
vtkIdType 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 VTKRENDERINGVOLUME_EXPORT vtkVolumeRayCastFunction : public vtkObject
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
vtkTypeMacro(vtkVolumeRayCastFunction,vtkObject);
|
||
|
|
void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 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.
|
||
|
|
*/
|
||
|
|
void FunctionInitialize( vtkRenderer *ren,
|
||
|
|
vtkVolume *vol,
|
||
|
|
vtkVolumeRayCastStaticInfo *staticInfo );
|
||
|
|
|
||
|
|
virtual void CastRay( vtkVolumeRayCastDynamicInfo *dynamicInfo,
|
||
|
|
vtkVolumeRayCastStaticInfo *staticInfo )=0;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Get the value below which all scalar values are considered to
|
||
|
|
* have 0 opacity.
|
||
|
|
*/
|
||
|
|
virtual float GetZeroOpacityThreshold( vtkVolume *vol )=0;
|
||
|
|
|
||
|
|
protected:
|
||
|
|
vtkVolumeRayCastFunction()
|
||
|
|
{
|
||
|
|
VTK_LEGACY_BODY(vtkVolumeRayCastMapper::vtkVolumeRayCastMapper,"VTK 7.0");
|
||
|
|
}
|
||
|
|
~vtkVolumeRayCastFunction() {}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* This method gives the subclass a chance to do any special
|
||
|
|
* initialization that it may need to do
|
||
|
|
*/
|
||
|
|
virtual void SpecificFunctionInitialize( vtkRenderer *ren,
|
||
|
|
vtkVolume *vol,
|
||
|
|
vtkVolumeRayCastStaticInfo *staticInfo,
|
||
|
|
vtkVolumeRayCastMapper *mapper )=0;
|
||
|
|
|
||
|
|
private:
|
||
|
|
vtkVolumeRayCastFunction(const vtkVolumeRayCastFunction&) VTK_DELETE_FUNCTION;
|
||
|
|
void operator=(const vtkVolumeRayCastFunction&) VTK_DELETE_FUNCTION;
|
||
|
|
};
|
||
|
|
#endif // VTK_LEGACY_REMOVE
|
||
|
|
#endif
|