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.
140 lines
3.8 KiB
C++
140 lines
3.8 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 vtkOpenGLBufferObject_h
|
|
#define vtkOpenGLBufferObject_h
|
|
|
|
#include "vtkObject.h"
|
|
#include "vtkRenderingOpenGL2Module.h" // for export macro
|
|
#include <string> // used for std::string
|
|
#include <vector> // used for method args
|
|
|
|
class vtkCellArray;
|
|
class vtkDataArray;
|
|
class vtkPoints;
|
|
|
|
/**
|
|
* @brief OpenGL buffer object
|
|
*
|
|
* OpenGL buffer object to store index, geometry and/or attribute data on the
|
|
* GPU.
|
|
*/
|
|
|
|
class VTKRENDERINGOPENGL2_EXPORT vtkOpenGLBufferObject : public vtkObject
|
|
{
|
|
public:
|
|
static vtkOpenGLBufferObject* New();
|
|
vtkTypeMacro(vtkOpenGLBufferObject, vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
enum ObjectType
|
|
{
|
|
ArrayBuffer,
|
|
ElementArrayBuffer,
|
|
TextureBuffer
|
|
};
|
|
|
|
/** Get the type of the buffer object. */
|
|
ObjectType GetType() const;
|
|
|
|
/** Set the type of the buffer object. */
|
|
void SetType(ObjectType value);
|
|
|
|
/** Get the handle of the buffer object. */
|
|
int GetHandle() const;
|
|
|
|
/** Determine if the buffer object is ready to be used. */
|
|
bool IsReady() const { return this->Dirty == false; }
|
|
|
|
/** Generate the opengl buffer for this Handle */
|
|
bool GenerateBuffer(ObjectType type);
|
|
|
|
/**
|
|
* Upload data to the buffer object. The BufferObject::type() must match
|
|
* @a type or be uninitialized.
|
|
*
|
|
* The T type must have tightly packed values of T::value_type accessible by
|
|
* reference via T::operator[]. Additionally, the standard size() and empty()
|
|
* methods must be implemented. The std::vector class is an example of such a
|
|
* supported containers.
|
|
*/
|
|
template <class T>
|
|
bool Upload(const T& array, ObjectType type);
|
|
|
|
// non vector version
|
|
template <class T>
|
|
bool Upload(const T* array, size_t numElements, ObjectType type);
|
|
|
|
/**
|
|
* Bind the buffer object ready for rendering.
|
|
* @note Only one ARRAY_BUFFER and one ELEMENT_ARRAY_BUFFER may be bound at
|
|
* any time.
|
|
*/
|
|
bool Bind();
|
|
|
|
/**
|
|
* Release the buffer. This should be done after rendering is complete.
|
|
*/
|
|
bool Release();
|
|
|
|
// Description:
|
|
// Release any graphics resources that are being consumed by this class.
|
|
void ReleaseGraphicsResources();
|
|
|
|
/**
|
|
* Return a string describing errors.
|
|
*/
|
|
std::string GetError() const { return Error; }
|
|
|
|
protected:
|
|
vtkOpenGLBufferObject();
|
|
~vtkOpenGLBufferObject() override;
|
|
bool Dirty;
|
|
std::string Error;
|
|
|
|
bool UploadInternal(const void* buffer, size_t size, ObjectType objectType);
|
|
|
|
private:
|
|
vtkOpenGLBufferObject(const vtkOpenGLBufferObject&) = delete;
|
|
void operator=(const vtkOpenGLBufferObject&) = delete;
|
|
struct Private;
|
|
Private* Internal;
|
|
};
|
|
|
|
template <class T>
|
|
inline bool vtkOpenGLBufferObject::Upload(
|
|
const T& array, vtkOpenGLBufferObject::ObjectType objectType)
|
|
{
|
|
if (array.empty())
|
|
{
|
|
this->Error = "Refusing to upload empty array.";
|
|
return false;
|
|
}
|
|
|
|
return this->UploadInternal(&array[0], array.size() * sizeof(typename T::value_type), objectType);
|
|
}
|
|
|
|
template <class T>
|
|
inline bool vtkOpenGLBufferObject::Upload(
|
|
const T* array, size_t numElements, vtkOpenGLBufferObject::ObjectType objectType)
|
|
{
|
|
if (!array)
|
|
{
|
|
this->Error = "Refusing to upload empty array.";
|
|
return false;
|
|
}
|
|
return this->UploadInternal(array, numElements * sizeof(T), objectType);
|
|
}
|
|
|
|
#endif
|