/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkUnstructuredGridVolumeRayCastMapper.h,v $ Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ // .NAME vtkUnstructuredGridVolumeRayCastMapper - A software mapper for unstructured volumes // .SECTION Description // This is a software ray caster for rendering volumes in vtkUnstructuredGrid. // .SECTION see also // vtkVolumeMapper #ifndef __vtkUnstructuredGridVolumeRayCastMapper_h #define __vtkUnstructuredGridVolumeRayCastMapper_h #include "vtkUnstructuredGridVolumeMapper.h" class vtkMultiThreader; class vtkRenderer; class vtkTimerLog; class vtkVolume; class vtkUnstructuredGridVolumeRayCastFunction; class vtkUnstructuredGridVolumeRayCastIterator; class vtkUnstructuredGridVolumeRayIntegrator; class vtkRayCastImageDisplayHelper; class VTK_VOLUMERENDERING_EXPORT vtkUnstructuredGridVolumeRayCastMapper : public vtkUnstructuredGridVolumeMapper { public: static vtkUnstructuredGridVolumeRayCastMapper *New(); vtkTypeRevisionMacro(vtkUnstructuredGridVolumeRayCastMapper,vtkUnstructuredGridVolumeMapper); void PrintSelf( ostream& os, vtkIndent indent ); // Description: // Control how the filter works with scalar point data and cell attribute // data. By default (ScalarModeToDefault), the filter will use point data, // and if no point data is available, then cell data is used. Alternatively // you can explicitly set the filter to use point data // (ScalarModeToUsePointData) or cell data (ScalarModeToUseCellData). // You can also choose to get the scalars from an array in point field // data (ScalarModeToUsePointFieldData) or cell field data // (ScalarModeToUseCellFieldData). If scalars are coming from a field // data array, you must call SelectColorArray before you call // GetColors. vtkSetMacro(ScalarMode,int); vtkGetMacro(ScalarMode,int); void SetScalarModeToDefault() { this->SetScalarMode(VTK_SCALAR_MODE_DEFAULT);}; void SetScalarModeToUsePointData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_DATA);}; void SetScalarModeToUseCellData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_CELL_DATA);}; void SetScalarModeToUsePointFieldData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_POINT_FIELD_DATA);}; void SetScalarModeToUseCellFieldData() { this->SetScalarMode(VTK_SCALAR_MODE_USE_CELL_FIELD_DATA);}; // Description: // When ScalarMode is set to UsePointFileData or UseCellFieldData, // you can specify which array to use for coloring using these methods. // The transfer function in the vtkVolumeProperty (attached to the calling // vtkVolume) will decide how to convert vectors to colors. virtual void SelectScalarArray(int arrayNum); virtual void SelectScalarArray(const char* arrayName); // Description: // Get the array name or number and component to color by. virtual char* GetArrayName() { return this->ArrayName; } virtual int GetArrayId() { return this->ArrayId; } virtual int GetArrayAccessMode() { return this->ArrayAccessMode; } // Description: // Return the method for obtaining scalar data. const char *GetScalarModeAsString(); // Description: // Sampling distance in the XY image dimensions. Default value of 1 meaning // 1 ray cast per pixel. If set to 0.5, 4 rays will be cast per pixel. If // set to 2.0, 1 ray will be cast for every 4 (2 by 2) pixels. vtkSetClampMacro( ImageSampleDistance, float, 0.1f, 100.0f ); vtkGetMacro( ImageSampleDistance, float ); // Description: // This is the minimum image sample distance allow when the image // sample distance is being automatically adjusted vtkSetClampMacro( MinimumImageSampleDistance, float, 0.1f, 100.0f ); vtkGetMacro( MinimumImageSampleDistance, float ); // Description: // This is the maximum image sample distance allow when the image // sample distance is being automatically adjusted vtkSetClampMacro( MaximumImageSampleDistance, float, 0.1f, 100.0f ); vtkGetMacro( MaximumImageSampleDistance, float ); // Description: // If AutoAdjustSampleDistances is on, the the ImageSampleDistance // will be varied to achieve the allocated render time of this // prop (controlled by the desired update rate and any culling in // use). vtkSetClampMacro( AutoAdjustSampleDistances, int, 0, 1 ); vtkGetMacro( AutoAdjustSampleDistances, int ); vtkBooleanMacro( AutoAdjustSampleDistances, int ); // Description: // Set/Get the number of threads to use. This by default is equal to // the number of available processors detected. vtkSetMacro( NumberOfThreads, int ); vtkGetMacro( NumberOfThreads, int ); // Description: // If IntermixIntersectingGeometry is turned on, the zbuffer will be // captured and used to limit the traversal of the rays. vtkSetClampMacro( IntermixIntersectingGeometry, int, 0, 1 ); vtkGetMacro( IntermixIntersectingGeometry, int ); vtkBooleanMacro( IntermixIntersectingGeometry, int ); // Description: // Set/Get the helper class for casting rays. virtual void SetRayCastFunction(vtkUnstructuredGridVolumeRayCastFunction *f); vtkGetObjectMacro(RayCastFunction, vtkUnstructuredGridVolumeRayCastFunction); // Description: // Set/Get the helper class for integrating rays. If set to NULL, a // default integrator will be assigned. virtual void SetRayIntegrator(vtkUnstructuredGridVolumeRayIntegrator *ri); vtkGetObjectMacro(RayIntegrator, vtkUnstructuredGridVolumeRayIntegrator); //BTX // Description: // WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE // Initialize rendering for this volume. void Render( vtkRenderer *, vtkVolume * ); // Description: // WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE // Release any graphics resources that are being consumed by this mapper. // The parameter window could be used to determine which graphic // resources to release. void ReleaseGraphicsResources(vtkWindow *); vtkGetVectorMacro( ImageInUseSize, int, 2 ); vtkGetVectorMacro( ImageOrigin, int, 2 ); vtkGetVectorMacro( ImageViewportSize, int , 2 ); //ETX void CastRays( int threadID, int threadCount ); protected: vtkUnstructuredGridVolumeRayCastMapper(); ~vtkUnstructuredGridVolumeRayCastMapper(); float ImageSampleDistance; float MinimumImageSampleDistance; float MaximumImageSampleDistance; int AutoAdjustSampleDistances; vtkMultiThreader *Threader; int NumberOfThreads; vtkRayCastImageDisplayHelper *ImageDisplayHelper; // This is how big the image would be if it covered the entire viewport int ImageViewportSize[2]; // This is how big the allocated memory for image is. This may be bigger // or smaller than ImageFullSize - it will be bigger if necessary to // ensure a power of 2, it will be smaller if the volume only covers a // small region of the viewport int ImageMemorySize[2]; // This is the size of subregion in ImageSize image that we are using for // the current image. Since ImageSize is a power of 2, there is likely // wasted space in it. This number will be used for things such as clearing // the image if necessary. int ImageInUseSize[2]; // This is the location in ImageFullSize image where our ImageSize image // is located. int ImageOrigin[2]; // This is the allocated image unsigned char *Image; float *RenderTimeTable; vtkVolume **RenderVolumeTable; vtkRenderer **RenderRendererTable; int RenderTableSize; int RenderTableEntries; void StoreRenderTime( vtkRenderer *ren, vtkVolume *vol, float t ); float RetrieveRenderTime( vtkRenderer *ren, vtkVolume *vol ); int IntermixIntersectingGeometry; float *ZBuffer; int ZBufferSize[2]; int ZBufferOrigin[2]; // Get the ZBuffer value corresponding to location (x,y) where (x,y) // are indexing into the ImageInUse image. This must be converted to // the zbuffer image coordinates. Nearest neighbor value is returned. double GetZBufferValue( int x, int y ); double GetMinimumBoundsDepth( vtkRenderer *ren, vtkVolume *vol ); vtkUnstructuredGridVolumeRayCastFunction *RayCastFunction; vtkUnstructuredGridVolumeRayCastIterator **RayCastIterators; vtkUnstructuredGridVolumeRayIntegrator *RayIntegrator; vtkUnstructuredGridVolumeRayIntegrator *RealRayIntegrator; vtkVolume *CurrentVolume; vtkRenderer *CurrentRenderer; int ScalarMode; char *ArrayName; int ArrayId; int ArrayAccessMode; vtkDataArray *Scalars; int CellScalars; private: vtkUnstructuredGridVolumeRayCastMapper(const vtkUnstructuredGridVolumeRayCastMapper&); // Not implemented. void operator=(const vtkUnstructuredGridVolumeRayCastMapper&); // Not implemented. }; #endif