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.
242 lines
7.6 KiB
C++
242 lines
7.6 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkValuePass.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 vtkValuePass
|
|
*
|
|
* Renders geometry using the values of a field array as fragment colors. The
|
|
* output can be used for deferred color mapping. It supports using arrays of
|
|
* either point or cell data. The target array can be selected by setting an
|
|
* array name/id and a component number. Only opaque geometry is supported.
|
|
*
|
|
* There are two rendering modes available:
|
|
*
|
|
* * INVERTIBLE_LUT Encodes array values as RGB data and renders the result to
|
|
* the default framebuffer. It uses a texture as a color LUT to map the values
|
|
* to RGB data. Texture size constraints limit its precision (currently 12-bit).
|
|
* The implementation of this mode is in vtkInternalsInvertible. This option
|
|
* is deprecated now that the SGI patent on floating point textures has
|
|
* expired and Mesa and other OpenGL's always supports it.
|
|
*
|
|
* * FLOATING_POINT Renders actual array values as floating point data to an
|
|
* internal RGBA32F framebuffer. This class binds and unbinds the framebuffer
|
|
* on each render pass. Resources are allocated on demand. When rendering point
|
|
* data values are uploaded to the GPU as vertex attributes. When rendering cell
|
|
* data values are uploaded as a texture buffer. Custom vertex and fragment
|
|
* shaders are defined in order to adjust its behavior for either type of data.
|
|
*
|
|
* @sa
|
|
* vtkRenderPass vtkOpenGLRenderPass
|
|
*/
|
|
#ifndef vtkValuePass_h
|
|
#define vtkValuePass_h
|
|
|
|
#include "vtkOpenGLRenderPass.h"
|
|
#include "vtkRenderingOpenGL2Module.h" // For export macro
|
|
#include "vtkSmartPointer.h" //for ivar
|
|
|
|
class vtkAbstractArray;
|
|
class vtkActor;
|
|
class vtkDataArray;
|
|
class vtkDataObject;
|
|
class vtkFloatArray;
|
|
class vtkMapper;
|
|
class vtkOpenGLVertexArrayObject;
|
|
class vtkProperty;
|
|
class vtkRenderer;
|
|
class vtkRenderWindow;
|
|
class vtkShaderProgram;
|
|
|
|
class VTKRENDERINGOPENGL2_EXPORT vtkValuePass : public vtkOpenGLRenderPass
|
|
{
|
|
public:
|
|
enum Mode
|
|
{
|
|
INVERTIBLE_LUT = 1,
|
|
FLOATING_POINT = 2
|
|
};
|
|
|
|
static vtkValuePass* New();
|
|
vtkTypeMacro(vtkValuePass, vtkOpenGLRenderPass);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
// @deprecated As of 9.0, We are moving to only FLOATING_POINT.
|
|
VTK_LEGACY(vtkSetMacro(RenderingMode, int));
|
|
VTK_LEGACY(vtkGetMacro(RenderingMode, int));
|
|
void SetInputArrayToProcess(int fieldAssociation, const char* name);
|
|
void SetInputArrayToProcess(int fieldAssociation, int fieldId);
|
|
void SetInputComponentToProcess(int component);
|
|
// @deprecated As of 9.0, Not needed with FLOATING_POINT.
|
|
VTK_LEGACY(void SetScalarRange(double min, double max));
|
|
|
|
/**
|
|
* Perform rendering according to a render state \p s.
|
|
* \pre s_exists: s!=0
|
|
*/
|
|
void Render(const vtkRenderState* s) override;
|
|
|
|
/**
|
|
* Interface to get the rendered image in FLOATING_POINT mode. Returns a
|
|
* single component array containing the rendered values.
|
|
* \warning The returned array is owned by this class.
|
|
*/
|
|
vtkFloatArray* GetFloatImageDataArray(vtkRenderer* ren);
|
|
|
|
/**
|
|
* Interface to get the rendered image in FLOATING_POINT mode. Low level API,
|
|
* a format for the internal glReadPixels call can be specified. 'data' is expected
|
|
* to be allocated and cleaned-up by the caller.
|
|
*/
|
|
void GetFloatImageData(int const format, int const width, int const height, void* data);
|
|
|
|
/**
|
|
* Interface to get the rendered image in FLOATING_POINT mode. Image extents of
|
|
* the value array.
|
|
*/
|
|
int* GetFloatImageExtents();
|
|
|
|
/**
|
|
* Check for extension support.
|
|
* @deprecated As of 9.0, All platforms support FLOATING_POINT.
|
|
*/
|
|
VTK_LEGACY(bool IsFloatingPointModeSupported());
|
|
|
|
void ReleaseGraphicsResources(vtkWindow* win) override;
|
|
|
|
/**
|
|
* Convert an RGB triplet to a floating point value. This method is exposed
|
|
* as a convenience function for testing (TestValuePass2).
|
|
* @deprecated As of 9.0, not necessary with FLOATING_POINT.
|
|
*/
|
|
VTK_LEGACY(void ColorToValue(
|
|
unsigned char const* color, double const min, double const scale, double& value));
|
|
|
|
protected:
|
|
vtkValuePass();
|
|
~vtkValuePass() override;
|
|
|
|
///@{
|
|
/**
|
|
* \brief vtkOpenGLRenderPass API.
|
|
*/
|
|
|
|
/**
|
|
* Use vtkShaderProgram::Substitute to replace //VTK::XXX:YYY declarations in
|
|
* the shader sources. Gets called after other mapper shader replacements.
|
|
* Return false on error.
|
|
*/
|
|
bool PostReplaceShaderValues(std::string& vertexShader, std::string& geometryShader,
|
|
std::string& fragmentShader, vtkAbstractMapper* mapper, vtkProp* prop) override;
|
|
/**
|
|
* Update the uniforms of the shader program.
|
|
* Return false on error.
|
|
*/
|
|
bool SetShaderParameters(vtkShaderProgram* program, vtkAbstractMapper* mapper, vtkProp* prop,
|
|
vtkOpenGLVertexArrayObject* VAO = nullptr) override;
|
|
/**
|
|
* For multi-stage render passes that need to change shader code during a
|
|
* single pass, use this method to notify a mapper that the shader needs to be
|
|
* rebuilt (rather than reuse the last cached shader. This method should
|
|
* return the last time that the shader stage changed, or 0 if the shader
|
|
* is single-stage.
|
|
*/
|
|
vtkMTimeType GetShaderStageMTime() override;
|
|
///@}
|
|
|
|
/**
|
|
* Manages graphics resources depending on the rendering mode. Binds internal
|
|
* FBO when FLOATING_POINT mode is enabled.
|
|
*/
|
|
void BeginPass(vtkRenderer* ren);
|
|
|
|
/**
|
|
* Unbinds internal FBO when FLOATING_POINT mode is enabled.
|
|
*/
|
|
void EndPass();
|
|
|
|
/**
|
|
* Opaque pass with key checking.
|
|
* \pre s_exists: s!=0
|
|
*/
|
|
void RenderOpaqueGeometry(const vtkRenderState* s);
|
|
|
|
/**
|
|
* Unbind textures, etc.
|
|
*/
|
|
void RenderPieceFinish();
|
|
|
|
/**
|
|
* Upload new data if necessary, bind textures, etc.
|
|
*/
|
|
void RenderPieceStart(vtkDataArray* dataArr, vtkMapper* m);
|
|
|
|
/**
|
|
* Setup the mapper state, buffer objects or property variables necessary
|
|
* to render the active rendering mode.
|
|
*/
|
|
void BeginMapperRender(vtkMapper* mapper, vtkDataArray* dataArray, vtkProperty* property);
|
|
|
|
/**
|
|
* Revert any changes made in BeginMapperRender.
|
|
*/
|
|
void EndMapperRender(vtkMapper* mapper, vtkProperty* property);
|
|
|
|
void InitializeBuffers(vtkRenderer* ren);
|
|
|
|
/**
|
|
* Add necessary shader definitions.
|
|
*/
|
|
bool UpdateShaders(std::string& VSSource, std::string& FSSource);
|
|
|
|
/**
|
|
* Bind shader variables.
|
|
*/
|
|
void BindAttributes(vtkShaderProgram* prog, vtkOpenGLVertexArrayObject* VAO);
|
|
void BindUniforms(vtkShaderProgram* prog);
|
|
|
|
//@{
|
|
/**
|
|
* Methods managing graphics resources required during FLOATING_POINT mode.
|
|
*/
|
|
bool HasWindowSizeChanged(vtkRenderer* ren);
|
|
bool InitializeFBO(vtkRenderer* ren);
|
|
void ReleaseFBO(vtkWindow* win);
|
|
//@}
|
|
|
|
class vtkInternalsFloat;
|
|
vtkInternalsFloat* ImplFloat;
|
|
|
|
class vtkInternalsInvertible;
|
|
vtkInternalsInvertible* ImplInv;
|
|
|
|
struct Parameters;
|
|
Parameters* PassState;
|
|
|
|
int RenderingMode;
|
|
|
|
private:
|
|
vtkDataArray* GetCurrentArray(vtkMapper* mapper, Parameters* arrayPar);
|
|
|
|
vtkAbstractArray* GetArrayFromCompositeData(vtkMapper* mapper, Parameters* arrayPar);
|
|
|
|
vtkSmartPointer<vtkAbstractArray> MultiBlocksArray;
|
|
|
|
void PopulateCellCellMap(const vtkRenderState* s);
|
|
|
|
vtkValuePass(const vtkValuePass&) = delete;
|
|
void operator=(const vtkValuePass&) = delete;
|
|
};
|
|
|
|
#endif
|