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.

174 lines
5.9 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
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.
=========================================================================*/
#ifndef vtkOpenGLVertexBufferObject_h
#define vtkOpenGLVertexBufferObject_h
#include "vtkOpenGLBufferObject.h"
#include "vtkRenderingOpenGL2Module.h" // for export macro
class vtkOpenGLVertexBufferObjectCache;
/**
* @brief OpenGL vertex buffer object
*
* OpenGL buffer object to store geometry and/or attribute data on the
* GPU.
*/
// useful union for stuffing colors into a float
union vtkFourByteUnion {
unsigned char c[4];
short s[2];
float f;
};
class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLVertexBufferObject : public vtkOpenGLBufferObject
{
public:
static vtkOpenGLVertexBufferObject* New();
vtkTypeMacro(vtkOpenGLVertexBufferObject, vtkOpenGLBufferObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
// set the VBOs data to the provided data array and upload
// this can use a fast path of just passing the
// data array pointer to OpenGL if it is suitable
void UploadDataArray(vtkDataArray* array);
// append a data array to this VBO, always
// copies the data from the data array
void AppendDataArray(vtkDataArray* array);
// Get the mtime when this VBO was loaded
vtkGetMacro(UploadTime, vtkTimeStamp);
/**\brief Methods for VBO coordinate shift+scale-computation.
*
* By default, shift and scale vectors are enabled
* whenever CreateVBO is called with points whose
* bounds are many bbox-lengths away from the origin.
*
* Shifting and scaling may be completely disabled,
* or manually specified, or left at the default.
*
* Manual specification is for the case when you
* will be calling AppendVBO instead of just CreateVBO
* and know better bounds than the what CreateVBO
* might produce.
*
* The automatic method tells CreatVBO to compute shift and
* scale vectors that remap the points to the unit cube.
*/
enum ShiftScaleMethod
{
DISABLE_SHIFT_SCALE, //!< Do not shift/scale point coordinates. Ever!
AUTO_SHIFT_SCALE, //!< The default, automatic computation.
ALWAYS_AUTO_SHIFT_SCALE, //!< Always shift scale using auto computed values
MANUAL_SHIFT_SCALE //!< Manual shift/scale (for use with AppendVBO)
};
// Description:
// Get the shift and scale vectors computed by CreateVBO;
// or set the values CreateVBO and AppendVBO will use.
// Note that the "Set" methods **must** be called before the
// first time that CreateVBO or AppendVBO is invoked and
// should never be called afterwards.
//
// The CoordShiftAndScaleMethod describes how the shift
// and scale vectors are obtained (or that they should never
// be used).
// The GetCoordShiftAndScaleEnabled() method returns true if
// a shift and scale are currently being applied (or false if not).
//
// The "Get" methods are used by the mapper to modify the world
// and camera transformation matrices to match the scaling applied
// to coordinates in the VBO.
// CreateVBO only applies a shift and scale when the midpoint
// of the point bounding-box is distant from the origin by a
// factor of 10,000 or more relative to the size of the box
// along any axis.
//
// For example, if the x coordinates of the points range from
// 200,000 to 200,001 then the factor is
// 200,000.5 / (200,001 - 200,000) = 2x10^5, which is larger
// than 10,000 -- so the coordinates will be shifted and scaled.
//
// This is important as many OpenGL drivers use reduced precision
// to hold point coordinates.
//
// These methods are used by the mapper to determine the
// additional transform (if any) to apply to the rendering transform.
vtkGetMacro(CoordShiftAndScaleEnabled, bool);
vtkGetMacro(CoordShiftAndScaleMethod, ShiftScaleMethod);
virtual void SetCoordShiftAndScaleMethod(ShiftScaleMethod meth);
virtual void SetShift(const std::vector<double>& shift);
virtual void SetScale(const std::vector<double>& scale);
virtual const std::vector<double>& GetShift();
virtual const std::vector<double>& GetScale();
// Set/Get the DataType to use for the VBO
// As a side effect sets the DataTypeSize
void SetDataType(int v);
vtkGetMacro(DataType, int);
// Get the size in bytes of the data type
vtkGetMacro(DataTypeSize, unsigned int);
// How many tuples in the VBO
vtkGetMacro(NumberOfTuples, unsigned int);
// How many components in the VBO
vtkGetMacro(NumberOfComponents, unsigned int);
// Set/Get the VBO stride in bytes
vtkSetMacro(Stride, unsigned int);
vtkGetMacro(Stride, unsigned int);
// Get the underlying VBO array
std::vector<float>& GetPackedVBO() { return this->PackedVBO; }
// upload the current PackedVBO
// only used by mappers that skip the VBOGroup support
void UploadVBO();
// VBOs may hold onto the cache, never the other way around
void SetCache(vtkOpenGLVertexBufferObjectCache* cache);
protected:
vtkOpenGLVertexBufferObject();
~vtkOpenGLVertexBufferObject() override;
std::vector<float> PackedVBO; // the data
vtkTimeStamp UploadTime;
unsigned int Stride; // The size of a complete tuple
unsigned int NumberOfComponents;
unsigned int NumberOfTuples;
int DataType;
unsigned int DataTypeSize;
ShiftScaleMethod CoordShiftAndScaleMethod;
bool CoordShiftAndScaleEnabled;
std::vector<double> Shift;
std::vector<double> Scale;
vtkOpenGLVertexBufferObjectCache* Cache;
private:
vtkOpenGLVertexBufferObject(const vtkOpenGLVertexBufferObject&) = delete;
void operator=(const vtkOpenGLVertexBufferObject&) = delete;
};
#endif