53#ifndef vtkFixedPointVolumeRayCastMapper_h
54#define vtkFixedPointVolumeRayCastMapper_h
56#include "vtkRenderingVolumeModule.h"
57#include "vtkThreads.h"
60#define VTKKW_FP_SHIFT 15
61#define VTKKW_FPMM_SHIFT 17
62#define VTKKW_FP_MASK 0x7fff
63#define VTKKW_FP_SCALE 32767.0
65VTK_ABI_NAMESPACE_BEGIN
106 vtkSetMacro(SampleDistance,
float);
107 vtkGetMacro(SampleDistance,
float);
118 vtkSetMacro(InteractiveSampleDistance,
float);
119 vtkGetMacro(InteractiveSampleDistance,
float);
130 vtkSetClampMacro(ImageSampleDistance,
float, 0.1f, 100.0f);
131 vtkGetMacro(ImageSampleDistance,
float);
139 vtkSetClampMacro(MinimumImageSampleDistance,
float, 0.1f, 100.0f);
140 vtkGetMacro(MinimumImageSampleDistance,
float);
148 vtkSetClampMacro(MaximumImageSampleDistance,
float, 0.1f, 100.0f);
149 vtkGetMacro(MaximumImageSampleDistance,
float);
176 vtkSetClampMacro(LockSampleDistanceToInputSpacing,
vtkTypeBool, 0, 1);
196 vtkSetClampMacro(IntermixIntersectingGeometry,
vtkTypeBool, 0, 1);
219 unsigned int ToFixedPointPosition(
float val);
220 void ToFixedPointPosition(
float in[3],
unsigned int out[3]);
221 unsigned int ToFixedPointDirection(
float dir);
222 void ToFixedPointDirection(
float in[3],
unsigned int out[3]);
223 void FixedPointIncrement(
unsigned int position[3],
unsigned int increment[3]);
224 void GetFloatTripleFromPointer(
float v[3],
float* ptr);
225 void GetUIntTripleFromPointer(
unsigned int v[3],
unsigned int* ptr);
226 void ShiftVectorDown(
unsigned int in[3],
unsigned int out[3]);
227 int CheckMinMaxVolumeFlag(
unsigned int pos[3],
int c);
228 int CheckMIPMinMaxVolumeFlag(
unsigned int pos[3],
int c,
unsigned short maxIdx,
int flip);
230 void LookupColorUC(
unsigned short* colorTable,
unsigned short* scalarOpacityTable,
231 unsigned short index,
unsigned char color[4]);
232 void LookupDependentColorUC(
unsigned short* colorTable,
unsigned short* scalarOpacityTable,
233 unsigned short index[4],
int components,
unsigned char color[4]);
234 void LookupAndCombineIndependentColorsUC(
unsigned short* colorTable[4],
235 unsigned short* scalarOpacityTable[4],
unsigned short index[4],
float weights[4],
236 int components,
unsigned char color[4]);
237 int CheckIfCropped(
unsigned int pos[3]);
245 vtkGetVectorMacro(TableShift,
float, 4);
246 vtkGetVectorMacro(TableScale,
float, 4);
247 vtkGetMacro(ShadingRequired,
int);
248 vtkGetMacro(GradientOpacityRequired,
int);
264 int x,
int y,
unsigned int pos[3],
unsigned int dir[3],
unsigned int* numSteps);
288 double viewDirection[3],
double viewUp[3]);
298 return this->RetrieveRenderTime(ren, vol);
316 vtkSetMacro(FinalColorWindow,
float);
317 vtkGetMacro(FinalColorWindow,
float);
318 vtkSetMacro(FinalColorLevel,
float);
319 vtkGetMacro(FinalColorLevel,
float);
325 vtkGetMacro(FlipMIPComparison,
int);
359 void ComputeMatrices(
double inputOrigin[3],
double inputSpacing[3],
int inputExtent[6],
408 int SavedColorChannels[4];
409 float SavedScalarOpacityDistance[4];
419 unsigned short ColorTable[4][32768 * 3];
420 unsigned short ScalarOpacityTable[4][32768];
421 unsigned short GradientOpacityTable[4][256];
426 float GradientMagnitudeScale[4];
427 float GradientMagnitudeShift[4];
442 unsigned short DiffuseShadingTable[4][65536 * 3];
443 unsigned short SpecularShadingTable[4][65536 * 3];
455 double rayStart[3],
double rayEnd[3],
float rayDirection[3],
double bounds[6]);
465 double rayStart[3],
double rayEnd[3],
int numClippingPlanes,
float* clippingPlanes);
467 unsigned int FixedPointCroppingRegionPlanes[6];
468 unsigned int CroppingRegionMask[27];
482 float ViewToVoxelsArray[16];
483 float WorldToVoxelsArray[16];
484 float VoxelsToWorldArray[16];
486 double CroppingBounds[6];
491 double SavedSpacing[3];
495 int MinMaxVolumeSize[4];
531 return ((dir < 0.0) ? (
static_cast<unsigned int>(-dir *
VTKKW_FP_SCALE + 0.5))
532 : (0x80000000 +
static_cast<unsigned int>(dir *
VTKKW_FP_SCALE + 0.5)));
536 float in[3],
unsigned int out[3])
538 out[0] = ((in[0] < 0.0) ? (
static_cast<unsigned int>(-in[0] *
VTKKW_FP_SCALE + 0.5))
539 : (0x80000000 +
static_cast<unsigned int>(in[0] *
VTKKW_FP_SCALE + 0.5)));
540 out[1] = ((in[1] < 0.0) ? (
static_cast<unsigned int>(-in[1] *
VTKKW_FP_SCALE + 0.5))
541 : (0x80000000 +
static_cast<unsigned int>(in[1] *
VTKKW_FP_SCALE + 0.5)));
542 out[2] = ((in[2] < 0.0) ? (
static_cast<unsigned int>(-in[2] *
VTKKW_FP_SCALE + 0.5))
543 : (0x80000000 +
static_cast<unsigned int>(in[2] *
VTKKW_FP_SCALE + 0.5)));
547 unsigned int position[3],
unsigned int increment[3])
549 if (increment[0] & 0x80000000)
551 position[0] += (increment[0] & 0x7fffffff);
555 position[0] -= increment[0];
557 if (increment[1] & 0x80000000)
559 position[1] += (increment[1] & 0x7fffffff);
563 position[1] -= increment[1];
565 if (increment[2] & 0x80000000)
567 position[2] += (increment[2] & 0x7fffffff);
571 position[2] -= increment[2];
583 unsigned int v[3],
unsigned int* ptr)
591 unsigned int in[3],
unsigned int out[3])
602 mmpos[1] *
static_cast<vtkIdType>(this->MinMaxVolumeSize[0]) + mmpos[0]) +
605 return ((*(this->
MinMaxVolume + 3 * offset + 2)) & 0x00ff);
609 unsigned int mmpos[3],
int c,
unsigned short maxIdx,
int flip)
613 mmpos[1] *
static_cast<vtkIdType>(this->MinMaxVolumeSize[0]) + mmpos[0]) +
624 return (*(this->
MinMaxVolume + 3 * offset + 1) > maxIdx);
634 unsigned short* scalarOpacityTable,
unsigned short index,
unsigned char color[4])
636 unsigned short alpha = scalarOpacityTable[index];
637 color[0] =
static_cast<unsigned char>(
638 (colorTable[3 * index] * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
639 color[1] =
static_cast<unsigned char>(
640 (colorTable[3 * index + 1] * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
641 color[2] =
static_cast<unsigned char>(
642 (colorTable[3 * index + 2] * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
643 color[3] =
static_cast<unsigned char>(alpha >> (
VTKKW_FP_SHIFT - 8));
647 unsigned short* scalarOpacityTable,
unsigned short index[4],
int components,
648 unsigned char color[4])
650 unsigned short alpha;
654 alpha = scalarOpacityTable[index[1]];
655 color[0] =
static_cast<unsigned char>(
656 (colorTable[3 * index[0]] * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
657 color[1] =
static_cast<unsigned char>(
658 (colorTable[3 * index[0] + 1] * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
659 color[2] =
static_cast<unsigned char>(
660 (colorTable[3 * index[0] + 2] * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
661 color[3] =
static_cast<unsigned char>(alpha >> (
VTKKW_FP_SHIFT - 8));
664 alpha = scalarOpacityTable[index[3]];
665 color[0] =
static_cast<unsigned char>((index[0] * alpha + 0x7fff) >>
VTKKW_FP_SHIFT);
666 color[1] =
static_cast<unsigned char>((index[1] * alpha + 0x7fff) >>
VTKKW_FP_SHIFT);
667 color[2] =
static_cast<unsigned char>((index[2] * alpha + 0x7fff) >>
VTKKW_FP_SHIFT);
668 color[3] =
static_cast<unsigned char>(alpha >> (
VTKKW_FP_SHIFT - 8));
674 unsigned short* colorTable[4],
unsigned short* scalarOpacityTable[4],
unsigned short index[4],
675 float weights[4],
int components,
unsigned char color[4])
677 unsigned int tmp[4] = { 0, 0, 0, 0 };
679 for (
int i = 0; i < components; i++)
681 unsigned short alpha =
682 static_cast<unsigned short>(
static_cast<float>(scalarOpacityTable[i][index[i]]) * weights[i]);
683 tmp[0] +=
static_cast<unsigned char>(
684 ((colorTable[i][3 * index[i]]) * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
685 tmp[1] +=
static_cast<unsigned char>(
686 ((colorTable[i][3 * index[i] + 1]) * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
687 tmp[2] +=
static_cast<unsigned char>(
688 ((colorTable[i][3 * index[i] + 2]) * alpha + 0x7fff) >> (2 *
VTKKW_FP_SHIFT - 8));
689 tmp[3] +=
static_cast<unsigned char>(alpha >> (
VTKKW_FP_SHIFT - 8));
692 color[0] =
static_cast<unsigned char>((tmp[0] > 255) ? (255) : (tmp[0]));
693 color[1] =
static_cast<unsigned char>((tmp[1] > 255) ? (255) : (tmp[1]));
694 color[2] =
static_cast<unsigned char>((tmp[2] > 255) ? (255) : (tmp[2]));
695 color[3] =
static_cast<unsigned char>((tmp[3] > 255) ? (255) : (tmp[3]));
Defines a transfer function for mapping a property to an RGB color value.
abstract superclass for arrays of numeric data
encode a direction into a one or two byte value
Compute shading tables for encoded normals.
Use finite differences to estimate gradient.
helper class for a ray cast image
A helper that generates composite images for the volume ray cast mapper.
A helper that generates composite images for the volume ray cast mapper.
A helper that generates composite images for the volume ray cast mapper.
A helper that generates composite images for the volume ray cast mapper.
A helper that generates MIP images for the volume ray cast mapper.
A fixed point mapper for volumes.
void SetRayCastImage(vtkFixedPointRayCastImage *)
Set / Get the underlying image object.
vtkRayCastImageDisplayHelper * ImageDisplayHelper
vtkMatrix4x4 * ViewToWorldMatrix
vtkMatrix4x4 * ViewToVoxelsMatrix
vtkEncodedGradientShader * GradientShader
vtkFixedPointVolumeRayCastMIPHelper * MIPHelper
vtkFixedPointVolumeRayCastCompositeGOHelper * CompositeGOHelper
float OldImageSampleDistance
int ShouldUseNearestNeighborInterpolation(vtkVolume *vol)
void ReleaseGraphicsResources(vtkWindow *) override
WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE Release any graphics resources that are being...
vtkMultiThreader * Threader
float RetrieveRenderTime(vtkRenderer *ren)
float MaximumImageSampleDistance
unsigned short * GetColorTable(int c)
unsigned short * GetSpecularShadingTable(int c)
float ImageSampleDistance
vtkTransform * VoxelsTransform
unsigned short * ContiguousGradientNormal
float MinimumImageSampleDistance
vtkFixedPointVolumeRayCastMapper()
vtkImageData * SavedMinMaxInput
void UpdateCroppingRegions()
void GetFloatTripleFromPointer(float v[3], float *ptr)
unsigned short * MinMaxVolume
unsigned char ** GradientMagnitude
void CaptureZBuffer(vtkRenderer *ren)
void ApplyFinalColorWindowLevel()
float ComputeRequiredImageSampleDistance(float desiredTime, vtkRenderer *ren)
What is the image sample distance required to achieve the desired time? A version of this method is p...
void ComputeRayInfo(int x, int y, unsigned int pos[3], unsigned int dir[3], unsigned int *numSteps)
vtkFixedPointVolumeRayCastCompositeShadeHelper * CompositeShadeHelper
unsigned short * GetScalarOpacityTable(int c)
vtkMatrix4x4 * VoxelsToWorldMatrix
vtkTimeStamp SavedGradientsMTime
unsigned short * GetGradientOpacityTable(int c)
vtkRenderWindow * RenderWindow
float MinimumViewDistance
void StoreRenderTime(vtkRenderer *ren, vtkVolume *vol, float t)
vtkFiniteDifferenceGradientEstimator * GradientEstimator
vtkFixedPointVolumeRayCastCompositeGOShadeHelper * CompositeGOShadeHelper
vtkTypeBool IntermixIntersectingGeometry
int ComputeRowBounds(vtkRenderer *ren, int imageFlag, int rowBoundsFlag, int inputExtent[6])
vtkTypeBool AutoAdjustSampleDistances
vtkImageData * MinMaxVolumeCache
float GetZBufferValue(int x, int y)
void DisplayRenderedImage(vtkRenderer *, vtkVolume *)
void FillInMaxGradientMagnitudes(int fullDim[3], int smallDim[3])
unsigned int ToFixedPointDirection(float dir)
vtkMatrix4x4 * VolumeMatrix
void InitializeRayInfo(vtkVolume *vol)
void SetNumberOfThreads(int num)
Set/Get the number of threads to use.
vtkImageData * SavedParametersInput
void Render(vtkRenderer *, vtkVolume *) override
WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE Initialize rendering for this volume.
void ComputeGradients(vtkVolume *vol)
int UpdateShadingTable(vtkRenderer *ren, vtkVolume *vol)
void GetUIntTripleFromPointer(unsigned int v[3], unsigned int *ptr)
float ComputeRequiredImageSampleDistance(float desiredTime, vtkRenderer *ren, vtkVolume *vol)
What is the image sample distance required to achieve the desired time? A version of this method is p...
~vtkFixedPointVolumeRayCastMapper() override
float SavedSampleDistance
static vtkFixedPointVolumeRayCastMapper * New()
float GetEstimatedRenderTime(vtkRenderer *ren, vtkVolume *vol)
Get an estimate of the rendering time for a given volume / renderer.
float RetrieveRenderTime(vtkRenderer *ren, vtkVolume *vol)
int GradientOpacityRequired
int CheckMinMaxVolumeFlag(unsigned int pos[3], int c)
vtkFixedPointVolumeRayCastCompositeHelper * CompositeHelper
vtkTransform * PerspectiveTransform
unsigned int ToFixedPointPosition(float val)
int CheckMIPMinMaxVolumeFlag(unsigned int pos[3], int c, unsigned short maxIdx, int flip)
float GetEstimatedRenderTime(vtkRenderer *ren)
unsigned short * GetDiffuseShadingTable(int c)
vtkDirectionEncoder * DirectionEncoder
vtkMatrix4x4 * PerspectiveMatrix
unsigned char ** GetGradientMagnitude()
float InteractiveSampleDistance
friend VTK_THREAD_RETURN_TYPE vtkFPVRCMSwitchOnDataType(void *arg)
void PerSubVolumeInitialization(vtkRenderer *, vtkVolume *, int)
vtkImageData * SavedGradientsInput
vtkTimeStamp SavedParametersMTime
unsigned short ** GradientNormal
void ComputeMatrices(double inputOrigin[3], double inputSpacing[3], int inputExtent[6], vtkRenderer *ren, vtkVolume *vol)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void LookupColorUC(unsigned short *colorTable, unsigned short *scalarOpacityTable, unsigned short index, unsigned char color[4])
vtkTransform * VoxelsToViewTransform
void FixedPointIncrement(unsigned int position[3], unsigned int increment[3])
void LookupAndCombineIndependentColorsUC(unsigned short *colorTable[4], unsigned short *scalarOpacityTable[4], unsigned short index[4], float weights[4], int components, unsigned char color[4])
vtkMatrix4x4 * WorldToVoxelsMatrix
vtkVolumeRayCastSpaceLeapingImageFilter * SpaceLeapFilter
void PerVolumeInitialization(vtkRenderer *, vtkVolume *)
int ClipRayAgainstVolume(double rayStart[3], double rayEnd[3], float rayDirection[3], double bounds[6])
void CreateCanonicalView(vtkVolume *volume, vtkImageData *image, int blend_mode, double viewDirection[3], double viewUp[3])
int PerImageInitialization(vtkRenderer *, vtkVolume *, int, double *, double *, int *)
unsigned int FixedPointCroppingRegionPlanes[6]
vtkFixedPointRayCastImage * RayCastImage
float * TransformedClippingPlanes
vtkVolume ** RenderVolumeTable
void UpdateMinMaxVolume(vtkVolume *vol)
friend VTK_THREAD_RETURN_TYPE FixedPointVolumeRayCastMapper_CastRays(void *arg)
vtkDataArray * PreviousScalars
vtkRenderer ** RenderRendererTable
void ShiftVectorDown(unsigned int in[3], unsigned int out[3])
int UpdateColorTable(vtkVolume *vol)
int NumTransformedClippingPlanes
unsigned char * ContiguousGradientMagnitude
int ClipRayAgainstClippingPlanes(double rayStart[3], double rayEnd[3], int numClippingPlanes, float *clippingPlanes)
int GetNumberOfThreads()
Set/Get the number of threads to use.
int UpdateGradients(vtkVolume *vol)
vtkDataArray * CurrentScalars
vtkTypeBool LockSampleDistanceToInputSpacing
unsigned int CroppingRegionMask[27]
unsigned short ** GetGradientNormal()
void LookupDependentColorUC(unsigned short *colorTable, unsigned short *scalarOpacityTable, unsigned short index[4], int components, unsigned char color[4])
int CheckIfCropped(unsigned int pos[3])
int NumberOfGradientSlices
vtkMatrix4x4 * VoxelsToViewMatrix
topologically and geometrically regular array of data
a simple class to control print indentation
represent and manipulate 4x4 transformation matrices
A class for performing multithreaded execution.
Defines a 1D piecewise function.
maintain a list of planes
helper class that draws the image to the screen
create a window for renderers to draw into
abstract specification for renderers
record modification and/or execution time
Timer support and logging.
Abstract class for a volume mapper.
int CroppingRegionFlags
Cropping variables, and a method for converting the world coordinate cropping region planes to voxel ...
Builds the space leaping data structure.
represents a volume (data & properties) in a rendered scene
window superclass for vtkRenderWindow
VTK_THREAD_RETURN_TYPE vtkFPVRCMSwitchOnDataType(void *arg)
VTK_THREAD_RETURN_TYPE FixedPointVolumeRayCastMapper_CastRays(void *arg)