VTK
/Users/kitware/Dashboards/MyTests/VTK_BLD_Release_docs/Utilities/Doxygen/dox/Rendering/Volume/vtkFixedPointVolumeRayCastMapper.h
Go to the documentation of this file.
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