00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifndef __vtkSlicerFixedPointVolumeRayCastMapper_h
00054 #define __vtkSlicerFixedPointVolumeRayCastMapper_h
00055
00056 #include "vtkVolumeMapper.h"
00057 #include "vtkVolumeRenderingReplacements.h"
00058
00059 #define VTKKW_FP_SHIFT 15
00060 #define VTKKW_FPMM_SHIFT 17
00061 #define VTKKW_FP_MASK 0x7fff
00062 #define VTKKW_FP_SCALE 32767.0
00063
00064 class vtkMatrix4x4;
00065 class vtkMultiThreader;
00066 class vtkPlaneCollection;
00067 class vtkRenderer;
00068 class vtkTimerLog;
00069 class vtkVolume;
00070 class vtkTransform;
00071 class vtkRenderWindow;
00072 class vtkColorTransferFunction;
00073 class vtkPiecewiseFunction;
00074 class vtkSlicerFixedPointVolumeRayCastMIPHelper;
00075 class vtkSlicerFixedPointVolumeRayCastCompositeHelper;
00076 class vtkSlicerFixedPointVolumeRayCastCompositeGOHelper;
00077 class vtkSlicerFixedPointVolumeRayCastCompositeGOShadeHelper;
00078 class vtkSlicerFixedPointVolumeRayCastCompositeShadeHelper;
00079 class vtkDirectionEncoder;
00080 class vtkEncodedGradientShader;
00081 class vtkFiniteDifferenceGradientEstimator;
00082 #include "vtkSlicerRayCastImageDisplayHelper.h"
00083 class vtkSlicerFixedPointRayCastImage;
00084
00085
00086 VTK_THREAD_RETURN_TYPE SlicerFixedPointVolumeRayCastMapper_CastRays( void *arg );
00087
00088 class VTK_VOLUMERENDERINGREPLACEMENTS_EXPORT vtkSlicerFixedPointVolumeRayCastMapper : public vtkVolumeMapper
00089 {
00090 public:
00091
00092 vtkGetMacro(ManualInteractive,int);
00093 vtkSetMacro(ManualInteractive,int);
00094 vtkBooleanMacro(ManualInteractive,int);
00095 vtkGetMacro(ManualInteractiveRate,double);
00096 vtkSetMacro(ManualInteractiveRate,double);
00097
00098
00099
00100 static vtkSlicerFixedPointVolumeRayCastMapper *New();
00101 vtkTypeRevisionMacro(vtkSlicerFixedPointVolumeRayCastMapper,vtkVolumeMapper);
00102 void PrintSelf( ostream& os, vtkIndent indent );
00103
00104
00105
00106
00107
00108 vtkSetMacro( SampleDistance, float );
00109 vtkGetMacro( SampleDistance, float );
00110
00111
00112
00113
00114
00115
00116
00117 vtkSetMacro( InteractiveSampleDistance, float );
00118 vtkGetMacro( InteractiveSampleDistance, float );
00119
00120
00121
00122
00123
00124
00125
00126 vtkSetClampMacro( ImageSampleDistance, float, 0.1f, 100.0f );
00127 vtkGetMacro( ImageSampleDistance, float );
00128
00129
00130
00131
00132 vtkSetClampMacro( MinimumImageSampleDistance, float, 0.1f, 100.0f );
00133 vtkGetMacro( MinimumImageSampleDistance, float );
00134
00135
00136
00137
00138 vtkSetClampMacro( MaximumImageSampleDistance, float, 0.1f, 100.0f );
00139 vtkGetMacro( MaximumImageSampleDistance, float );
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149 vtkSetClampMacro( AutoAdjustSampleDistances, int, 0, 1 );
00150 vtkGetMacro( AutoAdjustSampleDistances, int );
00151 vtkBooleanMacro( AutoAdjustSampleDistances, int );
00152
00153
00154
00155
00156 void SetNumberOfThreads( int num );
00157 int GetNumberOfThreads();
00158
00159
00160
00161
00162 vtkSetClampMacro( IntermixIntersectingGeometry, int, 0, 1 );
00163 vtkGetMacro( IntermixIntersectingGeometry, int );
00164 vtkBooleanMacro( IntermixIntersectingGeometry, int );
00165
00166
00167
00168
00169
00170
00171
00172 float ComputeRequiredImageSampleDistance( float desiredTime,
00173 vtkRenderer *ren );
00174 float ComputeRequiredImageSampleDistance( float desiredTime,
00175 vtkRenderer *ren,
00176 vtkVolume *vol );
00177
00178
00179
00180
00181
00182 void Render( vtkRenderer *, vtkVolume * );
00183
00184 unsigned int ToSlicerFixedPointPosition( float val );
00185 void ToSlicerFixedPointPosition( float in[3], unsigned int out[3] );
00186 unsigned int ToSlicerFixedPointDirection( float dir );
00187 void ToSlicerFixedPointDirection( float in[3], unsigned int out[3] );
00188 void FixedPointIncrement( unsigned int position[3], unsigned int increment[3] );
00189 void GetFloatTripleFromPointer( float v[3], float *ptr );
00190 void GetUIntTripleFromPointer( unsigned int v[3], unsigned int *ptr );
00191 void ShiftVectorDown( unsigned int in[3], unsigned int out[3] );
00192 int CheckMinMaxVolumeFlag( unsigned int pos[3], int c );
00193 int CheckMIPMinMaxVolumeFlag( unsigned int pos[3], int c, unsigned short maxIdx );
00194
00195 void LookupColorUC( unsigned short *colorTable,
00196 unsigned short *scalarOpacityTable,
00197 unsigned short index,
00198 unsigned char color[4] );
00199 void LookupDependentColorUC( unsigned short *colorTable,
00200 unsigned short *scalarOpacityTable,
00201 unsigned short index[4],
00202 int components,
00203 unsigned char color[4] );
00204 void LookupAndCombineIndependentColorsUC(
00205 unsigned short *colorTable[4],
00206 unsigned short *scalarOpacityTable[4],
00207 unsigned short index[4],
00208 float weights[4],
00209 int components,
00210 unsigned char color[4] );
00211 int CheckIfCropped( unsigned int pos[3] );
00212
00213
00214
00215 vtkGetObjectMacro( RenderWindow, vtkRenderWindow );
00216 vtkGetObjectMacro( MIPHelper, vtkSlicerFixedPointVolumeRayCastMIPHelper );
00217 vtkGetObjectMacro( CompositeHelper, vtkSlicerFixedPointVolumeRayCastCompositeHelper );
00218 vtkGetObjectMacro( CompositeGOHelper, vtkSlicerFixedPointVolumeRayCastCompositeGOHelper );
00219 vtkGetObjectMacro( CompositeGOShadeHelper, vtkSlicerFixedPointVolumeRayCastCompositeGOShadeHelper );
00220 vtkGetObjectMacro( CompositeShadeHelper, vtkSlicerFixedPointVolumeRayCastCompositeShadeHelper );
00221 vtkGetVectorMacro( TableShift, float, 4 );
00222 vtkGetVectorMacro( TableScale, float, 4 );
00223 vtkGetMacro( ShadingRequired, int );
00224 vtkGetMacro( GradientOpacityRequired, int );
00225
00226 int *GetRowBounds() {return this->RowBounds;}
00227 unsigned short *GetColorTable(int c) {return this->ColorTable[c];}
00228 unsigned short *GetScalarOpacityTable(int c) {return this->ScalarOpacityTable[c];}
00229 unsigned short *GetGradientOpacityTable(int c) {return this->GradientOpacityTable[c];}
00230 vtkVolume *GetVolume() {return this->Volume;}
00231 unsigned short **GetGradientNormal() {return this->GradientNormal;}
00232 unsigned char **GetGradientMagnitude() {return this->GradientMagnitude;}
00233 unsigned short *GetDiffuseShadingTable(int c) {return this->DiffuseShadingTable[c];}
00234 unsigned short *GetSpecularShadingTable(int c) {return this->SpecularShadingTable[c];}
00235
00236 void ComputeRayInfo( int x, int y,
00237 unsigned int pos[3],
00238 unsigned int dir[3],
00239 unsigned int *numSteps );
00240
00241 void InitializeRayInfo( vtkVolume *vol );
00242
00243 int ShouldUseNearestNeighborInterpolation( vtkVolume *vol );
00244
00245
00246
00247
00248
00249 void SetRayCastImage( vtkSlicerFixedPointRayCastImage * );
00250 vtkGetObjectMacro( RayCastImage, vtkSlicerFixedPointRayCastImage );
00251
00252 int PerImageInitialization( vtkRenderer *, vtkVolume *, int,
00253 double *, double *, int * );
00254 void PerVolumeInitialization( vtkRenderer *, vtkVolume * );
00255 void PerSubVolumeInitialization( vtkRenderer *, vtkVolume *, int );
00256 void RenderSubVolume();
00257 void DisplayRenderedImage( vtkRenderer *, vtkVolume * );
00258 void AbortRender();
00259
00260
00261 protected:
00262
00263
00264 int ManualInteractive;
00265 double ManualInteractiveRate;
00266
00267
00268
00269 vtkSlicerFixedPointVolumeRayCastMapper();
00270 ~vtkSlicerFixedPointVolumeRayCastMapper();
00271
00272
00273 vtkSlicerRayCastImageDisplayHelper *ImageDisplayHelper;
00274
00275
00276 float SampleDistance;
00277 float InteractiveSampleDistance;
00278
00279
00280 float ImageSampleDistance;
00281 float MinimumImageSampleDistance;
00282 float MaximumImageSampleDistance;
00283 int AutoAdjustSampleDistances;
00284
00285
00286 float OldSampleDistance;
00287 float OldImageSampleDistance;
00288
00289
00290
00291 void ComputeMatrices( double volumeOrigin[3],
00292 double volumeSpacing[3],
00293 int volumeExtent[6],
00294 vtkRenderer *ren,
00295 vtkVolume *vol );
00296
00297 int ComputeRowBounds( vtkRenderer *ren,
00298 int imageFlag, int rowBoundsFlag,
00299 int volumeExtent[6]);
00300
00301 void CaptureZBuffer( vtkRenderer *ren );
00302
00303 friend VTK_THREAD_RETURN_TYPE SlicerFixedPointVolumeRayCastMapper_CastRays( void *arg );
00304
00305 vtkMultiThreader *Threader;
00306
00307 vtkMatrix4x4 *PerspectiveMatrix;
00308 vtkMatrix4x4 *ViewToWorldMatrix;
00309 vtkMatrix4x4 *ViewToVoxelsMatrix;
00310 vtkMatrix4x4 *VoxelsToViewMatrix;
00311 vtkMatrix4x4 *WorldToVoxelsMatrix;
00312 vtkMatrix4x4 *VoxelsToWorldMatrix;
00313
00314 vtkMatrix4x4 *VolumeMatrix;
00315
00316 vtkTransform *PerspectiveTransform;
00317 vtkTransform *VoxelsTransform;
00318 vtkTransform *VoxelsToViewTransform;
00319
00320
00321 vtkSlicerFixedPointRayCastImage *RayCastImage;
00322
00323 int *RowBounds;
00324 int *OldRowBounds;
00325
00326 float *RenderTimeTable;
00327 vtkVolume **RenderVolumeTable;
00328 vtkRenderer **RenderRendererTable;
00329 int RenderTableSize;
00330 int RenderTableEntries;
00331
00332 void StoreRenderTime( vtkRenderer *ren, vtkVolume *vol, float t );
00333 float RetrieveRenderTime( vtkRenderer *ren, vtkVolume *vol );
00334 float RetrieveRenderTime( vtkRenderer *ren );
00335
00336 int IntermixIntersectingGeometry;
00337
00338 float MinimumViewDistance;
00339
00340 vtkColorTransferFunction *SavedRGBFunction[4];
00341 vtkPiecewiseFunction *SavedGrayFunction[4];
00342 vtkPiecewiseFunction *SavedScalarOpacityFunction[4];
00343 vtkPiecewiseFunction *SavedGradientOpacityFunction[4];
00344 int SavedColorChannels[4];
00345 float SavedScalarOpacityDistance[4];
00346 int SavedBlendMode;
00347 vtkImageData *SavedParametersInput;
00348 vtkTimeStamp SavedParametersMTime;
00349
00350 vtkImageData *SavedGradientsInput;
00351 vtkTimeStamp SavedGradientsMTime;
00352
00353 float SavedSampleDistance;
00354
00355
00356 unsigned short ColorTable[4][32768*3];
00357 unsigned short ScalarOpacityTable[4][32768];
00358 unsigned short GradientOpacityTable[4][256];
00359 int TableSize[4];
00360 float TableScale[4];
00361 float TableShift[4];
00362
00363 float GradientMagnitudeScale[4];
00364 float GradientMagnitudeShift[4];
00365
00366 unsigned short **GradientNormal;
00367 unsigned char **GradientMagnitude;
00368 unsigned short *ContiguousGradientNormal;
00369 unsigned char *ContiguousGradientMagnitude;
00370
00371 int NumberOfGradientSlices;
00372
00373 vtkDirectionEncoder *DirectionEncoder;
00374
00375 vtkEncodedGradientShader *GradientShader;
00376
00377 vtkFiniteDifferenceGradientEstimator *GradientEstimator;
00378
00379 unsigned short DiffuseShadingTable [4][65536*3];
00380 unsigned short SpecularShadingTable[4][65536*3];
00381
00382 int ShadingRequired;
00383 int GradientOpacityRequired;
00384
00385 vtkRenderWindow *RenderWindow;
00386 vtkVolume *Volume;
00387
00388 int ClipRayAgainstVolume( float rayStart[3],
00389 float rayEnd[3],
00390 float rayDirection[3],
00391 double bounds[6] );
00392
00393 int UpdateColorTable( vtkVolume *vol );
00394 int UpdateGradients( vtkVolume *vol );
00395 int UpdateShadingTable( vtkRenderer *ren,
00396 vtkVolume *vol );
00397 void UpdateCroppingRegions();
00398
00399 void ComputeGradients( vtkVolume *vol );
00400
00401 int ClipRayAgainstClippingPlanes( float rayStart[3],
00402 float rayEnd[3],
00403 int numClippingPlanes,
00404 float *clippingPlanes );
00405
00406 unsigned int SlicerFixedPointCroppingRegionPlanes[6];
00407 unsigned int CroppingRegionMask[27];
00408
00409
00410
00411
00412 float GetZBufferValue( int x, int y );
00413
00414 vtkSlicerFixedPointVolumeRayCastMIPHelper *MIPHelper;
00415 vtkSlicerFixedPointVolumeRayCastCompositeHelper *CompositeHelper;
00416 vtkSlicerFixedPointVolumeRayCastCompositeGOHelper *CompositeGOHelper;
00417 vtkSlicerFixedPointVolumeRayCastCompositeShadeHelper *CompositeShadeHelper;
00418 vtkSlicerFixedPointVolumeRayCastCompositeGOShadeHelper *CompositeGOShadeHelper;
00419
00420
00421 float ViewToVoxelsArray[16];
00422 float WorldToVoxelsArray[16];
00423 float VoxelsToWorldArray[16];
00424
00425 double CroppingBounds[6];
00426
00427 int NumTransformedClippingPlanes;
00428 float *TransformedClippingPlanes;
00429
00430 double SavedSpacing[3];
00431
00432
00433
00434 unsigned short *MinMaxVolume;
00435 int MinMaxVolumeSize[4];
00436 vtkImageData *SavedMinMaxInput;
00437 vtkTimeStamp SavedMinMaxBuildTime;
00438 vtkTimeStamp SavedMinMaxGradientTime;
00439 vtkTimeStamp SavedMinMaxFlagTime;
00440
00441 void UpdateMinMaxVolume( vtkVolume *vol );
00442 void FillInMaxGradientMagnitudes( int fullDim[3],
00443 int smallDim[3] );
00444 void InitMapperHelpers();
00445
00446 private:
00447 vtkSlicerFixedPointVolumeRayCastMapper(const vtkSlicerFixedPointVolumeRayCastMapper&);
00448 void operator=(const vtkSlicerFixedPointVolumeRayCastMapper&);
00449 };
00450
00451
00452 inline unsigned int vtkSlicerFixedPointVolumeRayCastMapper::ToSlicerFixedPointPosition( float val )
00453 {
00454 return static_cast<unsigned int>(val * VTKKW_FP_SCALE + 0.5);
00455 }
00456
00457 inline void vtkSlicerFixedPointVolumeRayCastMapper::ToSlicerFixedPointPosition( float in[3], unsigned int out[3] )
00458 {
00459 out[0] = static_cast<unsigned int>(in[0] * VTKKW_FP_SCALE + 0.5);
00460 out[1] = static_cast<unsigned int>(in[1] * VTKKW_FP_SCALE + 0.5);
00461 out[2] = static_cast<unsigned int>(in[2] * VTKKW_FP_SCALE + 0.5);
00462 }
00463
00464 inline unsigned int vtkSlicerFixedPointVolumeRayCastMapper::ToSlicerFixedPointDirection( float dir )
00465 {
00466 return ((dir<0.0)?
00467 (static_cast<unsigned int>(-dir * VTKKW_FP_SCALE + 0.5)):
00468 (0x80000000+static_cast<unsigned int>(dir*VTKKW_FP_SCALE + 0.5)));
00469 }
00470
00471 inline void vtkSlicerFixedPointVolumeRayCastMapper::ToSlicerFixedPointDirection( float in[3], unsigned int out[3] )
00472 {
00473 out[0] = ((in[0]<0.0)?
00474 (static_cast<unsigned int>(-in[0] * VTKKW_FP_SCALE + 0.5)):
00475 (0x80000000+
00476 static_cast<unsigned int>(in[0]*VTKKW_FP_SCALE + 0.5)));
00477 out[1] = ((in[1]<0.0)?
00478 (static_cast<unsigned int>(-in[1] * VTKKW_FP_SCALE + 0.5)):
00479 (0x80000000+
00480 static_cast<unsigned int>(in[1]*VTKKW_FP_SCALE + 0.5)));
00481 out[2] = ((in[2]<0.0)?
00482 (static_cast<unsigned int>(-in[2] * VTKKW_FP_SCALE + 0.5)):
00483 (0x80000000+
00484 static_cast<unsigned int>(in[2]*VTKKW_FP_SCALE + 0.5)));
00485 }
00486
00487 inline void vtkSlicerFixedPointVolumeRayCastMapper::FixedPointIncrement( unsigned int position[3], unsigned int increment[3] )
00488 {
00489 if ( increment[0]&0x80000000 )
00490 {
00491 position[0] += (increment[0]&0x7fffffff);
00492 }
00493 else
00494 {
00495 position[0] -= increment[0];
00496 }
00497 if ( increment[1]&0x80000000 )
00498 {
00499 position[1] += (increment[1]&0x7fffffff);
00500 }
00501 else
00502 {
00503 position[1] -= increment[1];
00504 }
00505 if ( increment[2]&0x80000000 )
00506 {
00507 position[2] += (increment[2]&0x7fffffff);
00508 }
00509 else
00510 {
00511 position[2] -= increment[2];
00512 }
00513 }
00514
00515
00516 inline void vtkSlicerFixedPointVolumeRayCastMapper::GetFloatTripleFromPointer( float v[3], float *ptr )
00517 {
00518 v[0] = *(ptr);
00519 v[1] = *(ptr+1);
00520 v[2] = *(ptr+2);
00521 }
00522
00523 inline void vtkSlicerFixedPointVolumeRayCastMapper::GetUIntTripleFromPointer( unsigned int v[3], unsigned int *ptr )
00524 {
00525 v[0] = *(ptr);
00526 v[1] = *(ptr+1);
00527 v[2] = *(ptr+2);
00528 }
00529
00530 inline void vtkSlicerFixedPointVolumeRayCastMapper::ShiftVectorDown( unsigned int in[3],
00531 unsigned int out[3] )
00532 {
00533 out[0] = in[0] >> VTKKW_FP_SHIFT;
00534 out[1] = in[1] >> VTKKW_FP_SHIFT;
00535 out[2] = in[2] >> VTKKW_FP_SHIFT;
00536 }
00537
00538 inline int vtkSlicerFixedPointVolumeRayCastMapper::CheckMinMaxVolumeFlag( unsigned int mmpos[3], int c )
00539 {
00540 unsigned int offset =
00541 this->MinMaxVolumeSize[3] *
00542 ( mmpos[2]*this->MinMaxVolumeSize[0]*this->MinMaxVolumeSize[1] +
00543 mmpos[1]*this->MinMaxVolumeSize[0] +
00544 mmpos[0] ) + c;
00545
00546 return ((*(this->MinMaxVolume + 3*offset + 2))&0x00ff);
00547 }
00548
00549 inline int vtkSlicerFixedPointVolumeRayCastMapper::CheckMIPMinMaxVolumeFlag( unsigned int mmpos[3], int c,
00550 unsigned short maxIdx )
00551 {
00552 unsigned int offset =
00553 this->MinMaxVolumeSize[3] *
00554 ( mmpos[2]*this->MinMaxVolumeSize[0]*this->MinMaxVolumeSize[1] +
00555 mmpos[1]*this->MinMaxVolumeSize[0] +
00556 mmpos[0] ) + c;
00557
00558 if ( (*(this->MinMaxVolume + 3*offset + 2)&0x00ff) )
00559 {
00560 return ( *(this->MinMaxVolume + 3*offset + 1) > maxIdx );
00561 }
00562 else
00563 {
00564 return 0;
00565 }
00566 }
00567
00568 inline void vtkSlicerFixedPointVolumeRayCastMapper::LookupColorUC( unsigned short *colorTable,
00569 unsigned short *scalarOpacityTable,
00570 unsigned short index,
00571 unsigned char color[4] )
00572 {
00573 unsigned short alpha = scalarOpacityTable[index];
00574 color[0] = static_cast<unsigned char>
00575 ((colorTable[3*index ]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00576 color[1] = static_cast<unsigned char>
00577 ((colorTable[3*index+1]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00578 color[2] = static_cast<unsigned char>
00579 ((colorTable[3*index+2]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00580 color[3] = static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8));
00581 }
00582
00583 inline void vtkSlicerFixedPointVolumeRayCastMapper::LookupDependentColorUC( unsigned short *colorTable,
00584 unsigned short *scalarOpacityTable,
00585 unsigned short index[4],
00586 int components,
00587 unsigned char color[4] )
00588 {
00589 unsigned short alpha;
00590 switch ( components )
00591 {
00592 case 2:
00593 alpha = scalarOpacityTable[index[1]];
00594 color[0] = static_cast<unsigned char>
00595 ((colorTable[3*index[0] ]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00596 color[1] = static_cast<unsigned char>
00597 ((colorTable[3*index[0]+1]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00598 color[2] = static_cast<unsigned char>
00599 ((colorTable[3*index[0]+2]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00600 color[3] = static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8));
00601 break;
00602 case 4:
00603 alpha = scalarOpacityTable[index[3]];
00604 color[0] = static_cast<unsigned char>((index[0]*alpha + 0x7fff)>>VTKKW_FP_SHIFT );
00605 color[1] = static_cast<unsigned char>((index[1]*alpha + 0x7fff)>>VTKKW_FP_SHIFT );
00606 color[2] = static_cast<unsigned char>((index[2]*alpha + 0x7fff)>>VTKKW_FP_SHIFT );
00607 color[3] = static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8));
00608 break;
00609 }
00610 }
00611
00612
00613 inline void vtkSlicerFixedPointVolumeRayCastMapper::LookupAndCombineIndependentColorsUC( unsigned short *colorTable[4],
00614 unsigned short *scalarOpacityTable[4],
00615 unsigned short index[4],
00616 float weights[4],
00617 int components,
00618 unsigned char color[4] )
00619 {
00620 unsigned int tmp[4] = {0,0,0,0};
00621
00622 for ( int i = 0; i < components; i++ )
00623 {
00624 unsigned short alpha = static_cast<unsigned short>(scalarOpacityTable[i][index[i]]*weights[i]);
00625 tmp[0] += static_cast<unsigned char>(((colorTable[i][3*index[i] ])*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00626 tmp[1] += static_cast<unsigned char>(((colorTable[i][3*index[i]+1])*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00627 tmp[2] += static_cast<unsigned char>(((colorTable[i][3*index[i]+2])*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8));
00628 tmp[3] += static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8));
00629 }
00630
00631 color[0] = (tmp[0]>255)?(255):(tmp[0]);
00632 color[1] = (tmp[1]>255)?(255):(tmp[1]);
00633 color[2] = (tmp[2]>255)?(255):(tmp[2]);
00634 color[3] = (tmp[3]>255)?(255):(tmp[3]);
00635
00636 }
00637
00638 inline int vtkSlicerFixedPointVolumeRayCastMapper::CheckIfCropped( unsigned int pos[3] )
00639 {
00640 int idx;
00641
00642 if ( pos[2] < this->SlicerFixedPointCroppingRegionPlanes[4] )
00643 {
00644 idx = 0;
00645 }
00646 else if ( pos[2] > this->SlicerFixedPointCroppingRegionPlanes[5] )
00647 {
00648 idx = 18;
00649 }
00650 else
00651 {
00652 idx = 9;
00653 }
00654
00655 if ( pos[1] >= this->SlicerFixedPointCroppingRegionPlanes[2] )
00656 {
00657 if ( pos[1] > this->SlicerFixedPointCroppingRegionPlanes[3] )
00658 {
00659 idx += 6;
00660 }
00661 else
00662 {
00663 idx += 3;
00664 }
00665 }
00666
00667 if ( pos[0] >= this->SlicerFixedPointCroppingRegionPlanes[0] )
00668 {
00669 if ( pos[0] > this->SlicerFixedPointCroppingRegionPlanes[1] )
00670 {
00671 idx += 2;
00672 }
00673 else
00674 {
00675 idx += 1;
00676 }
00677 }
00678
00679 return !(this->CroppingRegionFlags&this->CroppingRegionMask[idx]);
00680 }
00681
00682 #endif