00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00081 #ifndef __vtkVolumeTextureMapper3D_h
00082 #define __vtkVolumeTextureMapper3D_h
00083
00084 #include "vtkVolumeMapper.h"
00085
00086 class vtkImageData;
00087 class vtkColorTransferFunction;
00088 class vtkPiecewiseFunction;
00089 class vtkVolumeProperty;
00090
00091 class VTK_VOLUMERENDERING_EXPORT vtkVolumeTextureMapper3D : public vtkVolumeMapper
00092 {
00093 public:
00094 vtkTypeMacro(vtkVolumeTextureMapper3D,vtkVolumeMapper);
00095 void PrintSelf(ostream& os, vtkIndent indent);
00096
00097 static vtkVolumeTextureMapper3D *New();
00098
00100
00103 vtkSetMacro( SampleDistance, float );
00104 vtkGetMacro( SampleDistance, float );
00106
00108
00109 vtkGetVectorMacro( VolumeDimensions, int, 3 );
00111
00113
00114 vtkGetVectorMacro( VolumeSpacing, float, 3 );
00116
00118
00122 virtual int IsRenderSupported( vtkVolumeProperty *,
00123 vtkRenderer *vtkNotUsed(r))
00124 {return 0;}
00126
00128
00129 vtkGetMacro( NumberOfPolygons, int );
00131
00133
00134 vtkGetMacro( ActualSampleDistance, float );
00136
00137
00138
00141 virtual void Render(vtkRenderer *, vtkVolume *) {};
00142
00144
00145 enum
00146 {
00147 FRAGMENT_PROGRAM_METHOD=0,
00148 NVIDIA_METHOD=1,
00149 ATI_METHOD=2,
00150 NO_METHOD=3
00151 };
00153
00154
00156
00158 vtkSetClampMacro( PreferredRenderMethod, int,
00159 vtkVolumeTextureMapper3D::FRAGMENT_PROGRAM_METHOD,
00160 vtkVolumeTextureMapper3D::NVIDIA_METHOD );
00161 void SetPreferredMethodToFragmentProgram()
00162 { this->SetPreferredRenderMethod( vtkVolumeTextureMapper3D::FRAGMENT_PROGRAM_METHOD ); }
00163 void SetPreferredMethodToNVidia()
00164 { this->SetPreferredRenderMethod( vtkVolumeTextureMapper3D::NVIDIA_METHOD ); }
00165 vtkGetMacro(PreferredRenderMethod, int);
00167
00168
00170
00175 vtkSetMacro(UseCompressedTexture,bool);
00176 vtkGetMacro(UseCompressedTexture,bool);
00178
00179 protected:
00180 vtkVolumeTextureMapper3D();
00181 ~vtkVolumeTextureMapper3D();
00182
00183 float *PolygonBuffer;
00184 float *IntersectionBuffer;
00185 int NumberOfPolygons;
00186 int BufferSize;
00187
00188 unsigned char *Volume1;
00189 unsigned char *Volume2;
00190 unsigned char *Volume3;
00191 int VolumeSize;
00192 int VolumeComponents;
00193 int VolumeDimensions[3];
00194 float VolumeSpacing[3];
00195
00196 float SampleDistance;
00197 float ActualSampleDistance;
00198
00199 vtkImageData *SavedTextureInput;
00200 vtkImageData *SavedParametersInput;
00201
00202 vtkColorTransferFunction *SavedRGBFunction;
00203 vtkPiecewiseFunction *SavedGrayFunction;
00204 vtkPiecewiseFunction *SavedScalarOpacityFunction;
00205 vtkPiecewiseFunction *SavedGradientOpacityFunction;
00206 int SavedColorChannels;
00207 float SavedSampleDistance;
00208 float SavedScalarOpacityDistance;
00209
00210 unsigned char ColorLookup[65536*4];
00211 unsigned char AlphaLookup[65536];
00212 float TempArray1[3*4096];
00213 float TempArray2[4096];
00214 int ColorTableSize;
00215 float ColorTableScale;
00216 float ColorTableOffset;
00217
00218 unsigned char DiffuseLookup[65536*4];
00219 unsigned char SpecularLookup[65536*4];
00220
00221 vtkTimeStamp SavedTextureMTime;
00222 vtkTimeStamp SavedParametersMTime;
00223
00224 int RenderMethod;
00225 int PreferredRenderMethod;
00226 bool UseCompressedTexture;
00227
00228 bool SupportsNonPowerOfTwoTextures;
00229
00231 void ComputePolygons( vtkRenderer *ren, vtkVolume *vol, double bounds[6] );
00232
00234
00236 int UpdateVolumes( vtkVolume * );
00237 int UpdateColorLookup( vtkVolume * );
00239
00241
00242 virtual int IsTextureSizeSupported(int vtkNotUsed(size)[3],
00243 int vtkNotUsed(components))
00244 {
00245 return 0;
00246 }
00247
00249
00250 private:
00251 vtkVolumeTextureMapper3D(const vtkVolumeTextureMapper3D&);
00252 void operator=(const vtkVolumeTextureMapper3D&);
00253 };
00254
00255
00256 #endif
00257
00258
00259
00260
00261
00262