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