comac_desk_app/ThirdpartyLibs/Libs/windows-x86_64/vtk/include/vtkImageResliceMapper.h

284 lines
9.5 KiB
C
Raw Permalink Normal View History

2024-11-21 11:50:43 +08:00
/*=========================================================================
Program: Visualization Toolkit
Module: vtkImageResliceMapper.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 vtkImageResliceMapper
* @brief map a slice of a vtkImageData to the screen
*
* vtkImageResliceMapper will cut a 3D image with an arbitrary slice plane
* and draw the results on the screen. The slice can be set to automatically
* follow the camera, so that the camera controls the slicing.
* @par Thanks:
* Thanks to David Gobbi at the Seaman Family MR Centre and Dept. of Clinical
* Neurosciences, Foothills Medical Centre, Calgary, for providing this class.
* @sa
* vtkImageSlice vtkImageProperty vtkImageSliceMapper
*/
#ifndef vtkImageResliceMapper_h
#define vtkImageResliceMapper_h
#include "vtkImageMapper3D.h"
#include "vtkRenderingImageModule.h" // For export macro
class vtkImageSliceMapper;
class vtkRenderer;
class vtkRenderWindow;
class vtkCamera;
class vtkLookupTable;
class vtkImageSlice;
class vtkImageData;
class vtkImageResliceToColors;
class vtkMatrix4x4;
class vtkAbstractImageInterpolator;
class VTKRENDERINGIMAGE_EXPORT vtkImageResliceMapper : public vtkImageMapper3D
{
public:
static vtkImageResliceMapper* New();
vtkTypeMacro(vtkImageResliceMapper, vtkImageMapper3D);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Set the slice that will be used to cut through the image.
* This slice should be in world coordinates, rather than
* data coordinates. Use SliceFacesCamera and SliceAtFocalPoint
* if you want the slice to automatically follow the camera.
*/
virtual void SetSlicePlane(vtkPlane* plane);
///@{
/**
* When using SliceAtFocalPoint, this causes the slicing to occur at
* the closest slice to the focal point, instead of the default behavior
* where a new slice is interpolated between the original slices. This
* flag is ignored if the slicing is oblique to the original slices.
*/
vtkSetMacro(JumpToNearestSlice, vtkTypeBool);
vtkBooleanMacro(JumpToNearestSlice, vtkTypeBool);
vtkGetMacro(JumpToNearestSlice, vtkTypeBool);
///@}
///@{
/**
* The slab thickness, for thick slicing (default: zero)
*/
vtkSetMacro(SlabThickness, double);
vtkGetMacro(SlabThickness, double);
///@}
///@{
/**
* The slab type, for thick slicing (default: Mean).
* The resulting view is a parallel projection through the volume. This
* method can be used to generate a facsimile of a digitally-reconstructed
* radiograph or a minimum-intensity projection as long as perspective
* geometry is not required. Note that the Sum mode provides an output
* with units of intensity times distance, while all other modes provide
* an output with units of intensity.
*/
vtkSetClampMacro(SlabType, int, VTK_IMAGE_SLAB_MIN, VTK_IMAGE_SLAB_SUM);
vtkGetMacro(SlabType, int);
void SetSlabTypeToMin() { this->SetSlabType(VTK_IMAGE_SLAB_MIN); }
void SetSlabTypeToMax() { this->SetSlabType(VTK_IMAGE_SLAB_MAX); }
void SetSlabTypeToMean() { this->SetSlabType(VTK_IMAGE_SLAB_MEAN); }
void SetSlabTypeToSum() { this->SetSlabType(VTK_IMAGE_SLAB_SUM); }
virtual const char* GetSlabTypeAsString();
///@}
///@{
/**
* Set the number of slab samples to use as a factor of the number
* of input slices within the slab thickness. The default value
* is 2, but 1 will increase speed with very little loss of quality.
*/
vtkSetClampMacro(SlabSampleFactor, int, 1, 2);
vtkGetMacro(SlabSampleFactor, int);
///@}
///@{
/**
* Set the reslice sample frequency as in relation to the input image
* sample frequency. The default value is 1, but higher values can be
* used to improve the results. This is cheaper than turning on
* ResampleToScreenPixels.
*/
vtkSetClampMacro(ImageSampleFactor, int, 1, 16);
vtkGetMacro(ImageSampleFactor, int);
///@}
///@{
/**
* Automatically reduce the rendering quality for greater speed
* when doing an interactive render. This is on by default.
*/
vtkSetMacro(AutoAdjustImageQuality, vtkTypeBool);
vtkBooleanMacro(AutoAdjustImageQuality, vtkTypeBool);
vtkGetMacro(AutoAdjustImageQuality, vtkTypeBool);
///@}
///@{
/**
* Resample the image directly to the screen pixels, instead of
* using a texture to scale the image after resampling. This is
* slower and uses more memory, but provides high-quality results.
* It is On by default.
*/
vtkSetMacro(ResampleToScreenPixels, vtkTypeBool);
vtkBooleanMacro(ResampleToScreenPixels, vtkTypeBool);
vtkGetMacro(ResampleToScreenPixels, vtkTypeBool);
///@}
///@{
/**
* Keep the color mapping stage distinct from the reslicing stage.
* This will improve the quality and possibly the speed of interactive
* window/level operations, but it uses more memory and might slow down
* interactive slicing operations. On by default.
*/
vtkSetMacro(SeparateWindowLevelOperation, vtkTypeBool);
vtkBooleanMacro(SeparateWindowLevelOperation, vtkTypeBool);
vtkGetMacro(SeparateWindowLevelOperation, vtkTypeBool);
///@}
///@{
/**
* Set a custom interpolator. This will only be used if the
* ResampleToScreenPixels option is on.
*/
virtual void SetInterpolator(vtkAbstractImageInterpolator* interpolator);
virtual vtkAbstractImageInterpolator* GetInterpolator();
///@}
/**
* This should only be called by the renderer.
*/
void Render(vtkRenderer* renderer, vtkImageSlice* prop) override;
/**
* Release any graphics resources that are being consumed by
* this mapper. The parameter window is used to determine
* which graphic resources to release.
*/
void ReleaseGraphicsResources(vtkWindow*) override;
/**
* Get the mtime for the mapper.
*/
vtkMTimeType GetMTime() override;
///@{
/**
* The bounding box (array of six doubles) of the data expressed as
* (xmin,xmax, ymin,ymax, zmin,zmax).
*/
double* GetBounds() override;
void GetBounds(double bounds[6]) override { this->vtkAbstractMapper3D::GetBounds(bounds); }
///@}
/**
* Handle requests from the pipeline executive.
*/
vtkTypeBool ProcessRequest(
vtkInformation* request, vtkInformationVector** inInfo, vtkInformationVector* outInfo) override;
// return the bounds in index space
void GetIndexBounds(double extent[6]) override;
protected:
vtkImageResliceMapper();
~vtkImageResliceMapper() override;
/**
* Do a checkerboard pattern to the alpha of an RGBA image
*/
void CheckerboardImage(vtkImageData* input, vtkCamera* camera, vtkImageProperty* property);
/**
* Update the slice-to-world matrix from the camera.
*/
void UpdateSliceToWorldMatrix(vtkCamera* camera);
/**
* Check if the vtkProp3D matrix has changed, and if so, set
* the WorldToDataMatrix to its inverse.
*/
void UpdateWorldToDataMatrix(vtkImageSlice* prop);
/**
* Update the reslice matrix, which is the slice-to-data matrix.
*/
void UpdateResliceMatrix(vtkRenderer* ren, vtkImageSlice* prop);
/**
* Set all of the reslicing parameters. This requires that
* the SliceToWorld and WorldToData matrices are up-to-date.
*/
void UpdateResliceInformation(vtkRenderer* ren);
/**
* Set the interpolation.
*/
void UpdateResliceInterpolation(vtkImageProperty* property);
/**
* Update anything related to the image coloring.
*/
void UpdateColorInformation(vtkImageProperty* property);
/**
* Make a polygon by cutting the data bounds with a plane.
*/
void UpdatePolygonCoords(vtkRenderer* ren);
///@{
/**
* Override Update to handle some tricky details.
*/
void Update(int port) override;
void Update() override;
vtkTypeBool Update(int port, vtkInformationVector* requests) override;
vtkTypeBool Update(vtkInformation* requests) override;
///@}
/**
* Garbage collection for reference loops.
*/
void ReportReferences(vtkGarbageCollector*) override;
vtkImageSliceMapper* SliceMapper; // Does the OpenGL rendering
vtkTypeBool JumpToNearestSlice; // Adjust SliceAtFocalPoint
vtkTypeBool AutoAdjustImageQuality; // LOD-style behavior
vtkTypeBool SeparateWindowLevelOperation; // Do window/level as a separate step
double SlabThickness; // Current slab thickness
int SlabType; // Current slab mode
int SlabSampleFactor; // Sampling factor for slab mode
int ImageSampleFactor; // Sampling factor for image pixels
vtkTypeBool ResampleToScreenPixels; // Use software interpolation only
int InternalResampleToScreenPixels; // Use software interpolation only
int ResliceNeedUpdate; // Execute reslice on next render
vtkImageResliceToColors* ImageReslice; // For software interpolation
vtkMatrix4x4* ResliceMatrix; // Cached reslice matrix
vtkMatrix4x4* WorldToDataMatrix; // World to Data transform matrix
vtkMatrix4x4* SliceToWorldMatrix; // Slice to World transform matrix
vtkTimeStamp UpdateTime;
private:
vtkImageResliceMapper(const vtkImageResliceMapper&) = delete;
void operator=(const vtkImageResliceMapper&) = delete;
};
#endif