00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00035 #ifndef __vtkVolumeRayCastMapper_h
00036 #define __vtkVolumeRayCastMapper_h
00037
00038 #include "vtkVolumeMapper.h"
00039 #include "vtkVolumeRayCastFunction.h"
00040
00041 class vtkEncodedGradientEstimator;
00042 class vtkEncodedGradientShader;
00043 class vtkMatrix4x4;
00044 class vtkMultiThreader;
00045 class vtkPlaneCollection;
00046 class vtkRenderer;
00047 class vtkTimerLog;
00048 class vtkVolume;
00049 class vtkVolumeRayCastFunction;
00050 class vtkVolumeTransform;
00051 class vtkTransform;
00052
00053
00054
00055 inline int vtkFloorFuncMacro(double x)
00056 {
00057 #if defined i386 || defined _M_IX86
00058 double tempval;
00059
00060
00061
00062 tempval = (x - 0.25) + 3377699720527872.0;
00063
00064
00065
00066 return ((int*)&tempval)[0] >> 1;
00067 #else
00068
00069 return (int)(x);
00070 #endif
00071 }
00072
00073
00074 inline int vtkRoundFuncMacro(double x)
00075 {
00076 return vtkFloorFuncMacro(x + 0.5);
00077 }
00078
00079
00080
00081
00082
00083 #define vtkTrilinFuncMacro(v,x,y,z,a,b,c,d,e,f,g,h) \
00084 t00 = a + (x)*(b-a); \
00085 t01 = c + (x)*(d-c); \
00086 t10 = e + (x)*(f-e); \
00087 t11 = g + (x)*(h-g); \
00088 t0 = t00 + (y)*(t01-t00); \
00089 t1 = t10 + (y)*(t11-t10); \
00090 v = t0 + (z)*(t1-t0);
00091
00092 class VTK_RENDERING_EXPORT vtkVolumeRayCastMapper : public vtkVolumeMapper
00093 {
00094 public:
00095 static vtkVolumeRayCastMapper *New();
00096 vtkTypeRevisionMacro(vtkVolumeRayCastMapper,vtkVolumeMapper);
00097 void PrintSelf( ostream& os, vtkIndent indent );
00098
00100
00103 vtkSetMacro( SampleDistance, float );
00104 vtkGetMacro( SampleDistance, float );
00106
00108
00110 virtual void SetVolumeRayCastFunction(vtkVolumeRayCastFunction*);
00111 vtkGetObjectMacro( VolumeRayCastFunction, vtkVolumeRayCastFunction );
00113
00115
00116 virtual void SetGradientEstimator(vtkEncodedGradientEstimator *gradest);
00117 vtkGetObjectMacro( GradientEstimator, vtkEncodedGradientEstimator );
00119
00121
00122 vtkGetObjectMacro( GradientShader, vtkEncodedGradientShader );
00124
00126
00129 vtkSetClampMacro( ImageSampleDistance, float, 0.1f, 100.0f );
00130 vtkGetMacro( ImageSampleDistance, float );
00132
00134
00136 vtkSetClampMacro( MinimumImageSampleDistance, float, 0.1f, 100.0f );
00137 vtkGetMacro( MinimumImageSampleDistance, float );
00139
00141
00143 vtkSetClampMacro( MaximumImageSampleDistance, float, 0.1f, 100.0f );
00144 vtkGetMacro( MaximumImageSampleDistance, float );
00146
00148
00151 vtkSetClampMacro( AutoAdjustSampleDistances, int, 0, 1 );
00152 vtkGetMacro( AutoAdjustSampleDistances, int );
00153 vtkBooleanMacro( AutoAdjustSampleDistances, int );
00155
00157
00159 void SetNumberOfThreads( int num );
00160 vtkGetMacro( NumberOfThreads, int );
00162
00164
00166 vtkSetClampMacro( IntermixIntersectingGeometry, int, 0, 1 );
00167 vtkGetMacro( IntermixIntersectingGeometry, int );
00168 vtkBooleanMacro( IntermixIntersectingGeometry, int );
00170
00171
00174 void Render( vtkRenderer *, vtkVolume * );
00175
00180 void ReleaseGraphicsResources(vtkWindow *);
00181
00184 float GetZeroOpacityThreshold( vtkVolume *vol );
00185
00187
00189 virtual float GetGradientMagnitudeScale();
00190 virtual float GetGradientMagnitudeBias();
00191 virtual float GetGradientMagnitudeScale(int)
00192 {return this->GetGradientMagnitudeScale();};
00193 virtual float GetGradientMagnitudeBias(int)
00194 {return this->GetGradientMagnitudeBias();};
00196
00197
00198
00199 protected:
00200 vtkVolumeRayCastMapper();
00201 ~vtkVolumeRayCastMapper();
00202
00203 vtkVolumeRayCastFunction *VolumeRayCastFunction;
00204 vtkEncodedGradientEstimator *GradientEstimator;
00205 vtkEncodedGradientShader *GradientShader;
00206
00207
00208 float SampleDistance;
00209 float ImageSampleDistance;
00210 float MinimumImageSampleDistance;
00211 float MaximumImageSampleDistance;
00212 int AutoAdjustSampleDistances;
00213
00214 float WorldSampleDistance;
00215 int ScalarDataType;
00216 void *ScalarDataPointer;
00217
00218 void UpdateShadingTables( vtkRenderer *ren,
00219 vtkVolume *vol );
00220
00221 void ComputeMatrices( vtkImageData *data, vtkVolume *vol );
00222 virtual void RenderTexture( vtkVolume *vol, vtkRenderer *ren)=0;
00223 int ComputeRowBounds( vtkVolume *vol, vtkRenderer *ren );
00224
00225 friend VTK_THREAD_RETURN_TYPE VolumeRayCastMapper_CastRays( void *arg );
00226
00227 vtkMultiThreader *Threader;
00228 int NumberOfThreads;
00229
00230 vtkMatrix4x4 *PerspectiveMatrix;
00231 vtkMatrix4x4 *ViewToWorldMatrix;
00232 vtkMatrix4x4 *ViewToVoxelsMatrix;
00233 vtkMatrix4x4 *VoxelsToViewMatrix;
00234 vtkMatrix4x4 *WorldToVoxelsMatrix;
00235 vtkMatrix4x4 *VoxelsToWorldMatrix;
00236
00237 vtkMatrix4x4 *VolumeMatrix;
00238
00239 vtkTransform *PerspectiveTransform;
00240 vtkTransform *VoxelsTransform;
00241 vtkTransform *VoxelsToViewTransform;
00242
00243
00244 int ImageViewportSize[2];
00245
00246
00247
00248
00249
00250 int ImageMemorySize[2];
00251
00252
00253
00254
00255
00256 int ImageInUseSize[2];
00257
00258
00259
00260 int ImageOrigin[2];
00261
00262
00263 unsigned char *Image;
00264
00265 int *RowBounds;
00266 int *OldRowBounds;
00267
00268 float *RenderTimeTable;
00269 vtkVolume **RenderVolumeTable;
00270 vtkRenderer **RenderRendererTable;
00271 int RenderTableSize;
00272 int RenderTableEntries;
00273
00274 void StoreRenderTime( vtkRenderer *ren, vtkVolume *vol, float t );
00275 float RetrieveRenderTime( vtkRenderer *ren, vtkVolume *vol );
00276
00277 int IntermixIntersectingGeometry;
00278
00279 float *ZBuffer;
00280 int ZBufferSize[2];
00281 int ZBufferOrigin[2];
00282
00283 float MinimumViewDistance;
00284
00285 int ClipRayAgainstVolume( vtkVolumeRayCastDynamicInfo *dynamicInfo,
00286 float bounds[6] );
00287
00288 void InitializeClippingPlanes( vtkVolumeRayCastStaticInfo *staticInfo,
00289 vtkPlaneCollection *planes );
00290
00291 int ClipRayAgainstClippingPlanes( vtkVolumeRayCastDynamicInfo *dynamicInfo,
00292 vtkVolumeRayCastStaticInfo *staticInfo);
00293
00294
00295
00296
00297 float GetZBufferValue( int x, int y );
00298
00299 private:
00300 vtkVolumeRayCastMapper(const vtkVolumeRayCastMapper&);
00301 void operator=(const vtkVolumeRayCastMapper&);
00302 };
00303
00304 #endif
00305