64 #ifndef __vtkFixedPointVolumeRayCastMapper_h
65 #define __vtkFixedPointVolumeRayCastMapper_h
67 #include "vtkRenderingVolumeModule.h"
70 #define VTKKW_FP_SHIFT 15
71 #define VTKKW_FPMM_SHIFT 17
72 #define VTKKW_FP_MASK 0x7fff
73 #define VTKKW_FP_SCALE 32767.0
115 vtkSetMacro( SampleDistance,
float );
116 vtkGetMacro( SampleDistance,
float );
126 vtkSetMacro( InteractiveSampleDistance,
float );
127 vtkGetMacro( InteractiveSampleDistance,
float );
136 vtkSetClampMacro( ImageSampleDistance,
float, 0.1f, 100.0f );
137 vtkGetMacro( ImageSampleDistance,
float );
143 vtkSetClampMacro( MinimumImageSampleDistance,
float, 0.1f, 100.0f );
144 vtkGetMacro( MinimumImageSampleDistance,
float );
150 vtkSetClampMacro( MaximumImageSampleDistance,
float, 0.1f, 100.0f );
151 vtkGetMacro( MaximumImageSampleDistance,
float );
162 vtkSetClampMacro( AutoAdjustSampleDistances,
int, 0, 1 );
163 vtkGetMacro( AutoAdjustSampleDistances,
int );
164 vtkBooleanMacro( AutoAdjustSampleDistances,
int );
175 vtkSetClampMacro( LockSampleDistanceToInputSpacing,
int, 0, 1 );
176 vtkGetMacro( LockSampleDistanceToInputSpacing,
int );
177 vtkBooleanMacro( LockSampleDistanceToInputSpacing,
int );
183 void SetNumberOfThreads(
int num );
184 int GetNumberOfThreads();
190 vtkSetClampMacro( IntermixIntersectingGeometry,
int, 0, 1 );
191 vtkGetMacro( IntermixIntersectingGeometry,
int );
192 vtkBooleanMacro( IntermixIntersectingGeometry,
int );
202 float ComputeRequiredImageSampleDistance(
float desiredTime,
204 float ComputeRequiredImageSampleDistance(
float desiredTime,
214 unsigned int ToFixedPointPosition(
float val );
215 void ToFixedPointPosition(
float in[3],
unsigned int out[3] );
216 unsigned int ToFixedPointDirection(
float dir );
217 void ToFixedPointDirection(
float in[3],
unsigned int out[3] );
218 void FixedPointIncrement(
unsigned int position[3],
unsigned int increment[3] );
219 void GetFloatTripleFromPointer(
float v[3],
float *ptr );
220 void GetUIntTripleFromPointer(
unsigned int v[3],
unsigned int *ptr );
221 void ShiftVectorDown(
unsigned int in[3],
unsigned int out[3] );
222 int CheckMinMaxVolumeFlag(
unsigned int pos[3],
int c );
223 int CheckMIPMinMaxVolumeFlag(
unsigned int pos[3],
int c,
unsigned short maxIdx,
int flip );
225 void LookupColorUC(
unsigned short *colorTable,
226 unsigned short *scalarOpacityTable,
227 unsigned short index,
228 unsigned char color[4] );
229 void LookupDependentColorUC(
unsigned short *colorTable,
230 unsigned short *scalarOpacityTable,
231 unsigned short index[4],
233 unsigned char color[4] );
234 void LookupAndCombineIndependentColorsUC(
235 unsigned short *colorTable[4],
236 unsigned short *scalarOpacityTable[4],
237 unsigned short index[4],
240 unsigned char color[4] );
241 int CheckIfCropped(
unsigned int pos[3] );
251 vtkGetVectorMacro( TableShift,
float, 4 );
252 vtkGetVectorMacro( TableScale,
float, 4 );
253 vtkGetMacro( ShadingRequired,
int );
254 vtkGetMacro( GradientOpacityRequired,
int );
270 void ComputeRayInfo(
int x,
int y,
273 unsigned int *numSteps );
275 void InitializeRayInfo(
vtkVolume *vol );
277 int ShouldUseNearestNeighborInterpolation(
vtkVolume *vol );
288 double *,
double *,
int * );
291 void RenderSubVolume();
295 void CreateCanonicalView(
vtkVolume *volume,
298 double viewDirection[3],
308 {
return this->RetrieveRenderTime( ren, vol ); }
310 {
return this->RetrieveRenderTime( ren ); }
321 vtkSetMacro( FinalColorWindow,
float );
322 vtkGetMacro( FinalColorWindow,
float );
323 vtkSetMacro( FinalColorLevel,
float );
324 vtkGetMacro( FinalColorLevel,
float );
331 vtkGetMacro( FlipMIPComparison,
int );
357 void ComputeMatrices(
double volumeOrigin[3],
358 double volumeSpacing[3],
364 int imageFlag,
int rowBoundsFlag,
365 int volumeExtent[6]);
411 int SavedColorChannels[4];
412 float SavedScalarOpacityDistance[4];
423 unsigned short ColorTable[4][32768*3];
424 unsigned short ScalarOpacityTable[4][32768];
425 unsigned short GradientOpacityTable[4][256];
430 float GradientMagnitudeScale[4];
431 float GradientMagnitudeShift[4];
446 unsigned short DiffuseShadingTable [4][65536*3];
447 unsigned short SpecularShadingTable[4][65536*3];
458 int ClipRayAgainstVolume(
float rayStart[3],
460 float rayDirection[3],
467 void UpdateCroppingRegions();
471 int ClipRayAgainstClippingPlanes(
float rayStart[3],
473 int numClippingPlanes,
474 float *clippingPlanes );
476 unsigned int FixedPointCroppingRegionPlanes[6];
477 unsigned int CroppingRegionMask[27];
482 float GetZBufferValue(
int x,
int y );
491 float ViewToVoxelsArray[16];
492 float WorldToVoxelsArray[16];
493 float VoxelsToWorldArray[16];
495 double CroppingBounds[6];
500 double SavedSpacing[3];
505 int MinMaxVolumeSize[4];
510 void UpdateMinMaxVolume(
vtkVolume *vol );
511 void FillInMaxGradientMagnitudes(
int fullDim[3],
519 void ApplyFinalColorWindowLevel();
543 (0x80000000+static_cast<unsigned int>(dir*
VTKKW_FP_SCALE + 0.5)));
548 out[0] = ((in[0]<0.0)?
552 out[1] = ((in[1]<0.0)?
556 out[2] = ((in[2]<0.0)?
564 if ( increment[0]&0x80000000 )
566 position[0] += (increment[0]&0x7fffffff);
570 position[0] -= increment[0];
572 if ( increment[1]&0x80000000 )
574 position[1] += (increment[1]&0x7fffffff);
578 position[1] -= increment[1];
580 if ( increment[2]&0x80000000 )
582 position[2] += (increment[2]&0x7fffffff);
586 position[2] -= increment[2];
606 unsigned int out[3] )
617 ( mmpos[2]*static_cast<vtkIdType>(
619 mmpos[1]*
static_cast<vtkIdType>(this->MinMaxVolumeSize[0]) +
626 unsigned short maxIdx,
int flip )
630 ( mmpos[2]*static_cast<vtkIdType>(
632 mmpos[1]*
static_cast<vtkIdType>(this->MinMaxVolumeSize[0]) +
643 return ( *(this->
MinMaxVolume + 3*offset + 1) > maxIdx );
653 unsigned short *scalarOpacityTable,
654 unsigned short index,
655 unsigned char color[4] )
657 unsigned short alpha = scalarOpacityTable[
index];
658 color[0] =
static_cast<unsigned char>
660 color[1] =
static_cast<unsigned char>
662 color[2] =
static_cast<unsigned char>
664 color[3] =
static_cast<unsigned char>(alpha>>(
VTKKW_FP_SHIFT - 8));
668 unsigned short *scalarOpacityTable,
669 unsigned short index[4],
671 unsigned char color[4] )
673 unsigned short alpha;
674 switch ( components )
677 alpha = scalarOpacityTable[index[1]];
678 color[0] =
static_cast<unsigned char>
679 ((colorTable[3*index[0] ]*alpha + 0x7fff)>>(2*
VTKKW_FP_SHIFT - 8));
680 color[1] =
static_cast<unsigned char>
681 ((colorTable[3*index[0]+1]*alpha + 0x7fff)>>(2*
VTKKW_FP_SHIFT - 8));
682 color[2] =
static_cast<unsigned char>
683 ((colorTable[3*index[0]+2]*alpha + 0x7fff)>>(2*
VTKKW_FP_SHIFT - 8));
684 color[3] =
static_cast<unsigned char>(alpha>>(
VTKKW_FP_SHIFT - 8));
687 alpha = scalarOpacityTable[index[3]];
688 color[0] =
static_cast<unsigned char>((index[0]*alpha + 0x7fff)>>
VTKKW_FP_SHIFT );
689 color[1] =
static_cast<unsigned char>((index[1]*alpha + 0x7fff)>>
VTKKW_FP_SHIFT );
690 color[2] =
static_cast<unsigned char>((index[2]*alpha + 0x7fff)>>
VTKKW_FP_SHIFT );
691 color[3] =
static_cast<unsigned char>(alpha>>(
VTKKW_FP_SHIFT - 8));
698 unsigned short *scalarOpacityTable[4],
699 unsigned short index[4],
702 unsigned char color[4] )
704 unsigned int tmp[4] = {0,0,0,0};
706 for (
int i = 0; i < components; i++ )
708 unsigned short alpha =
static_cast<unsigned short>(
static_cast<float>(scalarOpacityTable[i][index[i]])*weights[i]);
709 tmp[0] +=
static_cast<unsigned char>(((colorTable[i][3*index[i] ])*alpha + 0x7fff)>>(2*
VTKKW_FP_SHIFT - 8));
710 tmp[1] +=
static_cast<unsigned char>(((colorTable[i][3*index[i]+1])*alpha + 0x7fff)>>(2*
VTKKW_FP_SHIFT - 8));
711 tmp[2] +=
static_cast<unsigned char>(((colorTable[i][3*index[i]+2])*alpha + 0x7fff)>>(2*
VTKKW_FP_SHIFT - 8));
712 tmp[3] +=
static_cast<unsigned char>(alpha>>(
VTKKW_FP_SHIFT - 8));
715 color[0] =
static_cast<unsigned char>((tmp[0]>255)?(255):(tmp[0]));
716 color[1] =
static_cast<unsigned char>((tmp[1]>255)?(255):(tmp[1]));
717 color[2] =
static_cast<unsigned char>((tmp[2]>255)?(255):(tmp[2]));
718 color[3] =
static_cast<unsigned char>((tmp[3]>255)?(255):(tmp[3]));