VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: vtkFixedPointVolumeRayCastMapper.h 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00069 #ifndef vtkFixedPointVolumeRayCastMapper_h 00070 #define vtkFixedPointVolumeRayCastMapper_h 00071 00072 #include "vtkRenderingVolumeModule.h" // For export macro 00073 #include "vtkVolumeMapper.h" 00074 00075 #define VTKKW_FP_SHIFT 15 00076 #define VTKKW_FPMM_SHIFT 17 00077 #define VTKKW_FP_MASK 0x7fff 00078 #define VTKKW_FP_SCALE 32767.0 00079 00080 class vtkMatrix4x4; 00081 class vtkMultiThreader; 00082 class vtkPlaneCollection; 00083 class vtkRenderer; 00084 class vtkTimerLog; 00085 class vtkVolume; 00086 class vtkTransform; 00087 class vtkRenderWindow; 00088 class vtkColorTransferFunction; 00089 class vtkPiecewiseFunction; 00090 class vtkFixedPointVolumeRayCastMIPHelper; 00091 class vtkFixedPointVolumeRayCastCompositeHelper; 00092 class vtkFixedPointVolumeRayCastCompositeGOHelper; 00093 class vtkFixedPointVolumeRayCastCompositeGOShadeHelper; 00094 class vtkFixedPointVolumeRayCastCompositeShadeHelper; 00095 class vtkVolumeRayCastSpaceLeapingImageFilter; 00096 class vtkDirectionEncoder; 00097 class vtkEncodedGradientShader; 00098 class vtkFiniteDifferenceGradientEstimator; 00099 class vtkRayCastImageDisplayHelper; 00100 class vtkFixedPointRayCastImage; 00101 class vtkDataArray; 00102 00103 //BTX 00104 // Forward declaration needed for use by friend declaration below. 00105 VTK_THREAD_RETURN_TYPE FixedPointVolumeRayCastMapper_CastRays( void *arg ); 00106 VTK_THREAD_RETURN_TYPE vtkFPVRCMSwitchOnDataType( void *arg ); 00107 //ETX 00108 00109 class VTKRENDERINGVOLUME_EXPORT vtkFixedPointVolumeRayCastMapper : public vtkVolumeMapper 00110 { 00111 public: 00112 static vtkFixedPointVolumeRayCastMapper *New(); 00113 vtkTypeMacro(vtkFixedPointVolumeRayCastMapper,vtkVolumeMapper); 00114 void PrintSelf( ostream& os, vtkIndent indent ); 00115 00117 00120 vtkSetMacro( SampleDistance, float ); 00121 vtkGetMacro( SampleDistance, float ); 00123 00125 00131 vtkSetMacro( InteractiveSampleDistance, float ); 00132 vtkGetMacro( InteractiveSampleDistance, float ); 00134 00136 00141 vtkSetClampMacro( ImageSampleDistance, float, 0.1f, 100.0f ); 00142 vtkGetMacro( ImageSampleDistance, float ); 00144 00146 00148 vtkSetClampMacro( MinimumImageSampleDistance, float, 0.1f, 100.0f ); 00149 vtkGetMacro( MinimumImageSampleDistance, float ); 00151 00153 00155 vtkSetClampMacro( MaximumImageSampleDistance, float, 0.1f, 100.0f ); 00156 vtkGetMacro( MaximumImageSampleDistance, float ); 00158 00160 00167 vtkSetClampMacro( AutoAdjustSampleDistances, int, 0, 1 ); 00168 vtkGetMacro( AutoAdjustSampleDistances, int ); 00169 vtkBooleanMacro( AutoAdjustSampleDistances, int ); 00171 00173 00180 vtkSetClampMacro( LockSampleDistanceToInputSpacing, int, 0, 1 ); 00181 vtkGetMacro( LockSampleDistanceToInputSpacing, int ); 00182 vtkBooleanMacro( LockSampleDistanceToInputSpacing, int ); 00184 00186 00189 void SetNumberOfThreads( int num ); 00190 int GetNumberOfThreads(); 00192 00194 00196 vtkSetClampMacro( IntermixIntersectingGeometry, int, 0, 1 ); 00197 vtkGetMacro( IntermixIntersectingGeometry, int ); 00198 vtkBooleanMacro( IntermixIntersectingGeometry, int ); 00200 00202 00208 float ComputeRequiredImageSampleDistance( float desiredTime, 00209 vtkRenderer *ren ); 00210 float ComputeRequiredImageSampleDistance( float desiredTime, 00211 vtkRenderer *ren, 00212 vtkVolume *vol ); 00214 00215 //BTX 00218 void Render( vtkRenderer *, vtkVolume * ); 00219 00220 unsigned int ToFixedPointPosition( float val ); 00221 void ToFixedPointPosition( float in[3], unsigned int out[3] ); 00222 unsigned int ToFixedPointDirection( float dir ); 00223 void ToFixedPointDirection( float in[3], unsigned int out[3] ); 00224 void FixedPointIncrement( unsigned int position[3], unsigned int increment[3] ); 00225 void GetFloatTripleFromPointer( float v[3], float *ptr ); 00226 void GetUIntTripleFromPointer( unsigned int v[3], unsigned int *ptr ); 00227 void ShiftVectorDown( unsigned int in[3], unsigned int out[3] ); 00228 int CheckMinMaxVolumeFlag( unsigned int pos[3], int c ); 00229 int CheckMIPMinMaxVolumeFlag( unsigned int pos[3], int c, unsigned short maxIdx, int flip ); 00230 00231 void LookupColorUC( unsigned short *colorTable, 00232 unsigned short *scalarOpacityTable, 00233 unsigned short index, 00234 unsigned char color[4] ); 00235 void LookupDependentColorUC( unsigned short *colorTable, 00236 unsigned short *scalarOpacityTable, 00237 unsigned short index[4], 00238 int components, 00239 unsigned char color[4] ); 00240 void LookupAndCombineIndependentColorsUC( 00241 unsigned short *colorTable[4], 00242 unsigned short *scalarOpacityTable[4], 00243 unsigned short index[4], 00244 float weights[4], 00245 int components, 00246 unsigned char color[4] ); 00247 int CheckIfCropped( unsigned int pos[3] ); 00248 00249 //ETX 00250 00251 vtkGetObjectMacro( RenderWindow, vtkRenderWindow ); 00252 vtkGetObjectMacro( MIPHelper, vtkFixedPointVolumeRayCastMIPHelper ); 00253 vtkGetObjectMacro( CompositeHelper, vtkFixedPointVolumeRayCastCompositeHelper ); 00254 vtkGetObjectMacro( CompositeGOHelper, vtkFixedPointVolumeRayCastCompositeGOHelper ); 00255 vtkGetObjectMacro( CompositeGOShadeHelper, vtkFixedPointVolumeRayCastCompositeGOShadeHelper ); 00256 vtkGetObjectMacro( CompositeShadeHelper, vtkFixedPointVolumeRayCastCompositeShadeHelper ); 00257 vtkGetVectorMacro( TableShift, float, 4 ); 00258 vtkGetVectorMacro( TableScale, float, 4 ); 00259 vtkGetMacro( ShadingRequired, int ); 00260 vtkGetMacro( GradientOpacityRequired, int ); 00261 00262 vtkGetObjectMacro( CurrentScalars, vtkDataArray ); 00263 vtkGetObjectMacro( PreviousScalars, vtkDataArray ); 00264 00265 00266 int *GetRowBounds() {return this->RowBounds;} 00267 unsigned short *GetColorTable(int c) {return this->ColorTable[c];} 00268 unsigned short *GetScalarOpacityTable(int c) {return this->ScalarOpacityTable[c];} 00269 unsigned short *GetGradientOpacityTable(int c) {return this->GradientOpacityTable[c];} 00270 vtkVolume *GetVolume() {return this->Volume;} 00271 unsigned short **GetGradientNormal() {return this->GradientNormal;} 00272 unsigned char **GetGradientMagnitude() {return this->GradientMagnitude;} 00273 unsigned short *GetDiffuseShadingTable(int c) {return this->DiffuseShadingTable[c];} 00274 unsigned short *GetSpecularShadingTable(int c) {return this->SpecularShadingTable[c];} 00275 00276 void ComputeRayInfo( int x, int y, 00277 unsigned int pos[3], 00278 unsigned int dir[3], 00279 unsigned int *numSteps ); 00280 00281 void InitializeRayInfo( vtkVolume *vol ); 00282 00283 int ShouldUseNearestNeighborInterpolation( vtkVolume *vol ); 00284 00286 00289 void SetRayCastImage( vtkFixedPointRayCastImage * ); 00290 vtkGetObjectMacro( RayCastImage, vtkFixedPointRayCastImage ); 00292 00293 int PerImageInitialization( vtkRenderer *, vtkVolume *, int, 00294 double *, double *, int * ); 00295 void PerVolumeInitialization( vtkRenderer *, vtkVolume * ); 00296 void PerSubVolumeInitialization( vtkRenderer *, vtkVolume *, int ); 00297 void RenderSubVolume(); 00298 void DisplayRenderedImage( vtkRenderer *, vtkVolume * ); 00299 void AbortRender(); 00300 00301 void CreateCanonicalView( vtkVolume *volume, 00302 vtkImageData *image, 00303 int blend_mode, 00304 double viewDirection[3], 00305 double viewUp[3] ); 00306 00308 00312 float GetEstimatedRenderTime( vtkRenderer *ren, 00313 vtkVolume *vol ) 00314 { return this->RetrieveRenderTime( ren, vol ); } 00315 float GetEstimatedRenderTime( vtkRenderer *ren ) 00316 { return this->RetrieveRenderTime( ren ); } 00318 00319 00321 00327 vtkSetMacro( FinalColorWindow, float ); 00328 vtkGetMacro( FinalColorWindow, float ); 00329 vtkSetMacro( FinalColorLevel, float ); 00330 vtkGetMacro( FinalColorLevel, float ); 00332 00333 00334 // Here to be used by the mapper to tell the helper 00335 // to flip the MIP comparison in order to support 00336 // minimum intensity blending 00337 vtkGetMacro( FlipMIPComparison, int ); 00338 00343 virtual void ReleaseGraphicsResources(vtkWindow *); 00344 00345 protected: 00346 vtkFixedPointVolumeRayCastMapper(); 00347 ~vtkFixedPointVolumeRayCastMapper(); 00348 00349 // The helper class that displays the image 00350 vtkRayCastImageDisplayHelper *ImageDisplayHelper; 00351 00352 // The distance between sample points along the ray 00353 float SampleDistance; 00354 float InteractiveSampleDistance; 00355 00356 // The distance between rays in the image 00357 float ImageSampleDistance; 00358 float MinimumImageSampleDistance; 00359 float MaximumImageSampleDistance; 00360 int AutoAdjustSampleDistances; 00361 int LockSampleDistanceToInputSpacing; 00362 00363 // Saved values used to restore 00364 float OldSampleDistance; 00365 float OldImageSampleDistance; 00366 00367 // Internal method for computing matrices needed during 00368 // ray casting 00369 void ComputeMatrices( double volumeOrigin[3], 00370 double volumeSpacing[3], 00371 int volumeExtent[6], 00372 vtkRenderer *ren, 00373 vtkVolume *vol ); 00374 00375 int ComputeRowBounds( vtkRenderer *ren, 00376 int imageFlag, int rowBoundsFlag, 00377 int volumeExtent[6]); 00378 00379 void CaptureZBuffer( vtkRenderer *ren ); 00380 00381 friend VTK_THREAD_RETURN_TYPE FixedPointVolumeRayCastMapper_CastRays( void *arg ); 00382 friend VTK_THREAD_RETURN_TYPE vtkFPVRCMSwitchOnDataType( void *arg ); 00383 00384 vtkMultiThreader *Threader; 00385 00386 vtkMatrix4x4 *PerspectiveMatrix; 00387 vtkMatrix4x4 *ViewToWorldMatrix; 00388 vtkMatrix4x4 *ViewToVoxelsMatrix; 00389 vtkMatrix4x4 *VoxelsToViewMatrix; 00390 vtkMatrix4x4 *WorldToVoxelsMatrix; 00391 vtkMatrix4x4 *VoxelsToWorldMatrix; 00392 00393 vtkMatrix4x4 *VolumeMatrix; 00394 00395 vtkTransform *PerspectiveTransform; 00396 vtkTransform *VoxelsTransform; 00397 vtkTransform *VoxelsToViewTransform; 00398 00399 // This object encapsulated the image and all related information 00400 vtkFixedPointRayCastImage *RayCastImage; 00401 00402 int *RowBounds; 00403 int *OldRowBounds; 00404 00405 float *RenderTimeTable; 00406 vtkVolume **RenderVolumeTable; 00407 vtkRenderer **RenderRendererTable; 00408 int RenderTableSize; 00409 int RenderTableEntries; 00410 00411 void StoreRenderTime( vtkRenderer *ren, vtkVolume *vol, float t ); 00412 float RetrieveRenderTime( vtkRenderer *ren, vtkVolume *vol ); 00413 float RetrieveRenderTime( vtkRenderer *ren ); 00414 00415 int IntermixIntersectingGeometry; 00416 00417 float MinimumViewDistance; 00418 00419 vtkColorTransferFunction *SavedRGBFunction[4]; 00420 vtkPiecewiseFunction *SavedGrayFunction[4]; 00421 vtkPiecewiseFunction *SavedScalarOpacityFunction[4]; 00422 vtkPiecewiseFunction *SavedGradientOpacityFunction[4]; 00423 int SavedColorChannels[4]; 00424 float SavedScalarOpacityDistance[4]; 00425 int SavedBlendMode; 00426 vtkImageData *SavedParametersInput; 00427 vtkTimeStamp SavedParametersMTime; 00428 00429 vtkImageData *SavedGradientsInput; 00430 vtkTimeStamp SavedGradientsMTime; 00431 00432 float SavedSampleDistance; 00433 00434 00435 unsigned short ColorTable[4][32768*3]; 00436 unsigned short ScalarOpacityTable[4][32768]; 00437 unsigned short GradientOpacityTable[4][256]; 00438 int TableSize[4]; 00439 float TableScale[4]; 00440 float TableShift[4]; 00441 00442 float GradientMagnitudeScale[4]; 00443 float GradientMagnitudeShift[4]; 00444 00445 unsigned short **GradientNormal; 00446 unsigned char **GradientMagnitude; 00447 unsigned short *ContiguousGradientNormal; 00448 unsigned char *ContiguousGradientMagnitude; 00449 00450 int NumberOfGradientSlices; 00451 00452 vtkDirectionEncoder *DirectionEncoder; 00453 00454 vtkEncodedGradientShader *GradientShader; 00455 00456 vtkFiniteDifferenceGradientEstimator *GradientEstimator; 00457 00458 unsigned short DiffuseShadingTable [4][65536*3]; 00459 unsigned short SpecularShadingTable[4][65536*3]; 00460 00461 int ShadingRequired; 00462 int GradientOpacityRequired; 00463 00464 vtkDataArray *CurrentScalars; 00465 vtkDataArray *PreviousScalars; 00466 00467 vtkRenderWindow *RenderWindow; 00468 vtkVolume *Volume; 00469 00470 int ClipRayAgainstVolume( float rayStart[3], 00471 float rayEnd[3], 00472 float rayDirection[3], 00473 double bounds[6] ); 00474 00475 int UpdateColorTable( vtkVolume *vol ); 00476 int UpdateGradients( vtkVolume *vol ); 00477 int UpdateShadingTable( vtkRenderer *ren, 00478 vtkVolume *vol ); 00479 void UpdateCroppingRegions(); 00480 00481 void ComputeGradients( vtkVolume *vol ); 00482 00483 int ClipRayAgainstClippingPlanes( float rayStart[3], 00484 float rayEnd[3], 00485 int numClippingPlanes, 00486 float *clippingPlanes ); 00487 00488 unsigned int FixedPointCroppingRegionPlanes[6]; 00489 unsigned int CroppingRegionMask[27]; 00490 00491 // Get the ZBuffer value corresponding to location (x,y) where (x,y) 00492 // are indexing into the ImageInUse image. This must be converted to 00493 // the zbuffer image coordinates. Nearest neighbor value is returned. 00494 float GetZBufferValue( int x, int y ); 00495 00496 vtkFixedPointVolumeRayCastMIPHelper *MIPHelper; 00497 vtkFixedPointVolumeRayCastCompositeHelper *CompositeHelper; 00498 vtkFixedPointVolumeRayCastCompositeGOHelper *CompositeGOHelper; 00499 vtkFixedPointVolumeRayCastCompositeShadeHelper *CompositeShadeHelper; 00500 vtkFixedPointVolumeRayCastCompositeGOShadeHelper *CompositeGOShadeHelper; 00501 00502 // Some variables used for ray computation 00503 float ViewToVoxelsArray[16]; 00504 float WorldToVoxelsArray[16]; 00505 float VoxelsToWorldArray[16]; 00506 00507 double CroppingBounds[6]; 00508 00509 int NumTransformedClippingPlanes; 00510 float *TransformedClippingPlanes; 00511 00512 double SavedSpacing[3]; 00513 00514 00515 // Min Max structure used to do space leaping 00516 unsigned short *MinMaxVolume; 00517 int MinMaxVolumeSize[4]; 00518 vtkImageData *SavedMinMaxInput; 00519 vtkImageData *MinMaxVolumeCache; 00520 vtkVolumeRayCastSpaceLeapingImageFilter * SpaceLeapFilter; 00521 00522 void UpdateMinMaxVolume( vtkVolume *vol ); 00523 void FillInMaxGradientMagnitudes( int fullDim[3], 00524 int smallDim[3] ); 00525 00526 float FinalColorWindow; 00527 float FinalColorLevel; 00528 00529 int FlipMIPComparison; 00530 00531 void ApplyFinalColorWindowLevel(); 00532 00533 private: 00534 vtkFixedPointVolumeRayCastMapper(const vtkFixedPointVolumeRayCastMapper&); // Not implemented. 00535 void operator=(const vtkFixedPointVolumeRayCastMapper&); // Not implemented. 00536 00537 bool ThreadWarning; 00538 }; 00539 00540 00541 inline unsigned int vtkFixedPointVolumeRayCastMapper::ToFixedPointPosition( float val ) 00542 { 00543 return static_cast<unsigned int>(val * VTKKW_FP_SCALE + 0.5); 00544 } 00545 00546 inline void vtkFixedPointVolumeRayCastMapper::ToFixedPointPosition( float in[3], unsigned int out[3] ) 00547 { 00548 out[0] = static_cast<unsigned int>(in[0] * VTKKW_FP_SCALE + 0.5); 00549 out[1] = static_cast<unsigned int>(in[1] * VTKKW_FP_SCALE + 0.5); 00550 out[2] = static_cast<unsigned int>(in[2] * VTKKW_FP_SCALE + 0.5); 00551 } 00552 00553 inline unsigned int vtkFixedPointVolumeRayCastMapper::ToFixedPointDirection( float dir ) 00554 { 00555 return ((dir<0.0)? 00556 (static_cast<unsigned int>(-dir * VTKKW_FP_SCALE + 0.5)): 00557 (0x80000000+static_cast<unsigned int>(dir*VTKKW_FP_SCALE + 0.5))); 00558 } 00559 00560 inline void vtkFixedPointVolumeRayCastMapper::ToFixedPointDirection( float in[3], unsigned int out[3] ) 00561 { 00562 out[0] = ((in[0]<0.0)? 00563 (static_cast<unsigned int>(-in[0] * VTKKW_FP_SCALE + 0.5)): 00564 (0x80000000+ 00565 static_cast<unsigned int>(in[0]*VTKKW_FP_SCALE + 0.5))); 00566 out[1] = ((in[1]<0.0)? 00567 (static_cast<unsigned int>(-in[1] * VTKKW_FP_SCALE + 0.5)): 00568 (0x80000000+ 00569 static_cast<unsigned int>(in[1]*VTKKW_FP_SCALE + 0.5))); 00570 out[2] = ((in[2]<0.0)? 00571 (static_cast<unsigned int>(-in[2] * VTKKW_FP_SCALE + 0.5)): 00572 (0x80000000+ 00573 static_cast<unsigned int>(in[2]*VTKKW_FP_SCALE + 0.5))); 00574 } 00575 00576 inline void vtkFixedPointVolumeRayCastMapper::FixedPointIncrement( unsigned int position[3], unsigned int increment[3] ) 00577 { 00578 if ( increment[0]&0x80000000 ) 00579 { 00580 position[0] += (increment[0]&0x7fffffff); 00581 } 00582 else 00583 { 00584 position[0] -= increment[0]; 00585 } 00586 if ( increment[1]&0x80000000 ) 00587 { 00588 position[1] += (increment[1]&0x7fffffff); 00589 } 00590 else 00591 { 00592 position[1] -= increment[1]; 00593 } 00594 if ( increment[2]&0x80000000 ) 00595 { 00596 position[2] += (increment[2]&0x7fffffff); 00597 } 00598 else 00599 { 00600 position[2] -= increment[2]; 00601 } 00602 } 00603 00604 00605 inline void vtkFixedPointVolumeRayCastMapper::GetFloatTripleFromPointer( float v[3], float *ptr ) 00606 { 00607 v[0] = *(ptr); 00608 v[1] = *(ptr+1); 00609 v[2] = *(ptr+2); 00610 } 00611 00612 inline void vtkFixedPointVolumeRayCastMapper::GetUIntTripleFromPointer( unsigned int v[3], unsigned int *ptr ) 00613 { 00614 v[0] = *(ptr); 00615 v[1] = *(ptr+1); 00616 v[2] = *(ptr+2); 00617 } 00618 00619 inline void vtkFixedPointVolumeRayCastMapper::ShiftVectorDown( unsigned int in[3], 00620 unsigned int out[3] ) 00621 { 00622 out[0] = in[0] >> VTKKW_FP_SHIFT; 00623 out[1] = in[1] >> VTKKW_FP_SHIFT; 00624 out[2] = in[2] >> VTKKW_FP_SHIFT; 00625 } 00626 00627 inline int vtkFixedPointVolumeRayCastMapper::CheckMinMaxVolumeFlag( unsigned int mmpos[3], int c ) 00628 { 00629 vtkIdType offset = 00630 static_cast<vtkIdType>(this->MinMaxVolumeSize[3]) * 00631 ( mmpos[2]*static_cast<vtkIdType>( 00632 this->MinMaxVolumeSize[0]*this->MinMaxVolumeSize[1]) + 00633 mmpos[1]*static_cast<vtkIdType>(this->MinMaxVolumeSize[0]) + 00634 mmpos[0] ) + static_cast<vtkIdType>(c); 00635 00636 return ((*(this->MinMaxVolume + 3*offset + 2))&0x00ff); 00637 } 00638 00639 inline int vtkFixedPointVolumeRayCastMapper::CheckMIPMinMaxVolumeFlag( unsigned int mmpos[3], int c, 00640 unsigned short maxIdx, int flip ) 00641 { 00642 vtkIdType offset = 00643 static_cast<vtkIdType>(this->MinMaxVolumeSize[3]) * 00644 ( mmpos[2]*static_cast<vtkIdType>( 00645 this->MinMaxVolumeSize[0]*this->MinMaxVolumeSize[1]) + 00646 mmpos[1]*static_cast<vtkIdType>(this->MinMaxVolumeSize[0]) + 00647 mmpos[0] ) + static_cast<vtkIdType>(c); 00648 00649 if ( (*(this->MinMaxVolume + 3*offset + 2)&0x00ff) ) 00650 { 00651 if (flip) 00652 { 00653 return ( *(this->MinMaxVolume + 3*offset) < maxIdx ); 00654 } 00655 else 00656 { 00657 return ( *(this->MinMaxVolume + 3*offset + 1) > maxIdx ); 00658 } 00659 } 00660 else 00661 { 00662 return 0; 00663 } 00664 } 00665 00666 inline void vtkFixedPointVolumeRayCastMapper::LookupColorUC( unsigned short *colorTable, 00667 unsigned short *scalarOpacityTable, 00668 unsigned short index, 00669 unsigned char color[4] ) 00670 { 00671 unsigned short alpha = scalarOpacityTable[index]; 00672 color[0] = static_cast<unsigned char> 00673 ((colorTable[3*index ]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00674 color[1] = static_cast<unsigned char> 00675 ((colorTable[3*index+1]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00676 color[2] = static_cast<unsigned char> 00677 ((colorTable[3*index+2]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00678 color[3] = static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8)); 00679 } 00680 00681 inline void vtkFixedPointVolumeRayCastMapper::LookupDependentColorUC( unsigned short *colorTable, 00682 unsigned short *scalarOpacityTable, 00683 unsigned short index[4], 00684 int components, 00685 unsigned char color[4] ) 00686 { 00687 unsigned short alpha; 00688 switch ( components ) 00689 { 00690 case 2: 00691 alpha = scalarOpacityTable[index[1]]; 00692 color[0] = static_cast<unsigned char> 00693 ((colorTable[3*index[0] ]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00694 color[1] = static_cast<unsigned char> 00695 ((colorTable[3*index[0]+1]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00696 color[2] = static_cast<unsigned char> 00697 ((colorTable[3*index[0]+2]*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00698 color[3] = static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8)); 00699 break; 00700 case 4: 00701 alpha = scalarOpacityTable[index[3]]; 00702 color[0] = static_cast<unsigned char>((index[0]*alpha + 0x7fff)>>VTKKW_FP_SHIFT ); 00703 color[1] = static_cast<unsigned char>((index[1]*alpha + 0x7fff)>>VTKKW_FP_SHIFT ); 00704 color[2] = static_cast<unsigned char>((index[2]*alpha + 0x7fff)>>VTKKW_FP_SHIFT ); 00705 color[3] = static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8)); 00706 break; 00707 } 00708 } 00709 00710 00711 inline void vtkFixedPointVolumeRayCastMapper::LookupAndCombineIndependentColorsUC( unsigned short *colorTable[4], 00712 unsigned short *scalarOpacityTable[4], 00713 unsigned short index[4], 00714 float weights[4], 00715 int components, 00716 unsigned char color[4] ) 00717 { 00718 unsigned int tmp[4] = {0,0,0,0}; 00719 00720 for ( int i = 0; i < components; i++ ) 00721 { 00722 unsigned short alpha = static_cast<unsigned short>(static_cast<float>(scalarOpacityTable[i][index[i]])*weights[i]); 00723 tmp[0] += static_cast<unsigned char>(((colorTable[i][3*index[i] ])*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00724 tmp[1] += static_cast<unsigned char>(((colorTable[i][3*index[i]+1])*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00725 tmp[2] += static_cast<unsigned char>(((colorTable[i][3*index[i]+2])*alpha + 0x7fff)>>(2*VTKKW_FP_SHIFT - 8)); 00726 tmp[3] += static_cast<unsigned char>(alpha>>(VTKKW_FP_SHIFT - 8)); 00727 } 00728 00729 color[0] = static_cast<unsigned char>((tmp[0]>255)?(255):(tmp[0])); 00730 color[1] = static_cast<unsigned char>((tmp[1]>255)?(255):(tmp[1])); 00731 color[2] = static_cast<unsigned char>((tmp[2]>255)?(255):(tmp[2])); 00732 color[3] = static_cast<unsigned char>((tmp[3]>255)?(255):(tmp[3])); 00733 00734 } 00735 00736 inline int vtkFixedPointVolumeRayCastMapper::CheckIfCropped( unsigned int pos[3] ) 00737 { 00738 int idx; 00739 00740 if ( pos[2] < this->FixedPointCroppingRegionPlanes[4] ) 00741 { 00742 idx = 0; 00743 } 00744 else if ( pos[2] > this->FixedPointCroppingRegionPlanes[5] ) 00745 { 00746 idx = 18; 00747 } 00748 else 00749 { 00750 idx = 9; 00751 } 00752 00753 if ( pos[1] >= this->FixedPointCroppingRegionPlanes[2] ) 00754 { 00755 if ( pos[1] > this->FixedPointCroppingRegionPlanes[3] ) 00756 { 00757 idx += 6; 00758 } 00759 else 00760 { 00761 idx += 3; 00762 } 00763 } 00764 00765 if ( pos[0] >= this->FixedPointCroppingRegionPlanes[0] ) 00766 { 00767 if ( pos[0] > this->FixedPointCroppingRegionPlanes[1] ) 00768 { 00769 idx += 2; 00770 } 00771 else 00772 { 00773 idx += 1; 00774 } 00775 } 00776 00777 return !(static_cast<unsigned int>(this->CroppingRegionFlags) 00778 &this->CroppingRegionMask[idx]); 00779 } 00780 00781 #endif