You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
7.2 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkUnstructuredGridVolumeRayCastMapper.h
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.
=========================================================================*/
/**
* @class vtkUnstructuredGridVolumeRayCastMapper
* @brief A software mapper for unstructured volumes
*
* This is a software ray caster for rendering volumes in vtkUnstructuredGrid.
*
* @sa
* vtkVolumeMapper
*/
#ifndef vtkUnstructuredGridVolumeRayCastMapper_h
#define vtkUnstructuredGridVolumeRayCastMapper_h
#include "vtkRenderingVolumeModule.h" // For export macro
#include "vtkUnstructuredGridVolumeMapper.h"
class vtkDoubleArray;
class vtkIdList;
class vtkMultiThreader;
class vtkRayCastImageDisplayHelper;
class vtkRenderer;
class vtkTimerLog;
class vtkUnstructuredGridVolumeRayCastFunction;
class vtkUnstructuredGridVolumeRayCastIterator;
class vtkUnstructuredGridVolumeRayIntegrator;
class vtkVolume;
class VTKRENDERINGVOLUME_EXPORT vtkUnstructuredGridVolumeRayCastMapper
: public vtkUnstructuredGridVolumeMapper
{
public:
static vtkUnstructuredGridVolumeRayCastMapper* New();
vtkTypeMacro(vtkUnstructuredGridVolumeRayCastMapper, vtkUnstructuredGridVolumeMapper);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* 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);
//@}
//@{
/**
* 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);
//@}
//@{
/**
* 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);
//@}
//@{
/**
* If AutoAdjustSampleDistances is on, 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, vtkTypeBool, 0, 1);
vtkGetMacro(AutoAdjustSampleDistances, vtkTypeBool);
vtkBooleanMacro(AutoAdjustSampleDistances, vtkTypeBool);
//@}
//@{
/**
* 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);
//@}
//@{
/**
* If IntermixIntersectingGeometry is turned on, the zbuffer will be
* captured and used to limit the traversal of the rays.
*/
vtkSetClampMacro(IntermixIntersectingGeometry, vtkTypeBool, 0, 1);
vtkGetMacro(IntermixIntersectingGeometry, vtkTypeBool);
vtkBooleanMacro(IntermixIntersectingGeometry, vtkTypeBool);
//@}
//@{
/**
* Set/Get the helper class for casting rays.
*/
virtual void SetRayCastFunction(vtkUnstructuredGridVolumeRayCastFunction* f);
vtkGetObjectMacro(RayCastFunction, vtkUnstructuredGridVolumeRayCastFunction);
//@}
//@{
/**
* 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);
//@}
/**
* WARNING: INTERNAL METHOD - NOT INTENDED FOR GENERAL USE
* Initialize rendering for this volume.
*/
void Render(vtkRenderer*, vtkVolume*) override;
/**
* 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*) override;
vtkGetVectorMacro(ImageInUseSize, int, 2);
vtkGetVectorMacro(ImageOrigin, int, 2);
vtkGetVectorMacro(ImageViewportSize, int, 2);
void CastRays(int threadID, int threadCount);
protected:
vtkUnstructuredGridVolumeRayCastMapper();
~vtkUnstructuredGridVolumeRayCastMapper() override;
float ImageSampleDistance;
float MinimumImageSampleDistance;
float MaximumImageSampleDistance;
vtkTypeBool 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);
vtkTypeBool 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;
vtkIdList** IntersectedCellsBuffer;
vtkDoubleArray** IntersectionLengthsBuffer;
vtkDataArray** NearIntersectionsBuffer;
vtkDataArray** FarIntersectionsBuffer;
vtkVolume* CurrentVolume;
vtkRenderer* CurrentRenderer;
vtkDataArray* Scalars;
int CellScalars;
private:
vtkUnstructuredGridVolumeRayCastMapper(const vtkUnstructuredGridVolumeRayCastMapper&) = delete;
void operator=(const vtkUnstructuredGridVolumeRayCastMapper&) = delete;
};
#endif