Browse Source

Buffer rework.

* Renamed Type enum to Target to be consistent with OpenGL naming
 * Strongly typed enums
 * Ability to specify different type when binding/setting data
 * Added missing buffer targets
pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
fb9b003e24
  1. 89
      src/Buffer.h
  2. 4
      src/IndexedMesh.h
  3. 2
      src/Mesh.cpp
  4. 4
      src/Primitives/Cube.cpp
  5. 2
      src/Primitives/Icosphere.h

89
src/Buffer.h

@ -33,21 +33,38 @@ class Buffer {
Buffer& operator=(Buffer&& other) = delete; Buffer& operator=(Buffer&& other) = delete;
public: public:
/** @brief Buffer type */ /** @brief %Buffer target */
enum Type { enum class Target: GLenum {
/** /** Used for storing vertex attributes. */
* Used for storing vertex attributes. Array = GL_ARRAY_BUFFER,
*/
ArrayBuffer = GL_ARRAY_BUFFER,
/** /** Source for copies. */
* Used for storing vertex indices. CopyRead = GL_COPY_READ_BUFFER,
*/
ElementArrayBuffer = GL_ELEMENT_ARRAY_BUFFER /** Target for copies. */
CopyWrite = GL_COPY_WRITE_BUFFER,
/** Used for storing vertex indices. */
ElementArray = GL_ELEMENT_ARRAY_BUFFER,
/** Source for texture update operations. */
PixelUnpack = GL_PIXEL_UNPACK_BUFFER,
/** Target for pixel pack operations. */
PixelPack = GL_PIXEL_PACK_BUFFER,
/** Source for texel fetches. */
Texture = GL_TEXTURE_BUFFER,
/** Target for transform feedback. */
TransformFeedback = GL_TRANSFORM_FEEDBACK_BUFFER,
/** Used for storing uniforms. */
Uniform = GL_UNIFORM_BUFFER
}; };
/** @brief Buffer usage */ /** @brief Buffer usage */
enum Usage { enum class Usage: GLenum {
/** /**
* Set once by the application and used infrequently for drawing. * Set once by the application and used infrequently for drawing.
*/ */
@ -71,8 +88,8 @@ class Buffer {
StaticDraw = GL_STATIC_DRAW, StaticDraw = GL_STATIC_DRAW,
/** /**
* Set once as output from an OpenGL command and queried many times * Set once as output from an OpenGL command and queried many
* by the application. * times by the application.
*/ */
StaticRead = GL_STATIC_READ, StaticRead = GL_STATIC_READ,
@ -103,11 +120,12 @@ class Buffer {
/** /**
* @brief Constructor * @brief Constructor
* @param type Buffer type * @param defaultTarget Default target (used when calling bind()
* without parameter)
* *
* Generates new OpenGL buffer. * Generates new OpenGL buffer.
*/ */
inline Buffer(Type type): _type(type) { inline Buffer(Target defaultTarget): _defaultTarget(defaultTarget) {
glGenBuffers(1, &buffer); glGenBuffers(1, &buffer);
} }
@ -120,28 +138,51 @@ class Buffer {
glDeleteBuffers(1, &buffer); glDeleteBuffers(1, &buffer);
} }
/** @brief Buffer type */ /** @brief Default bind type */
inline Type type() const { return _type; } inline Target defaultTarget() const { return _defaultTarget; }
/** @brief Bind buffer */ /**
inline void bind() const { * @brief Bind buffer
glBindBuffer(_type, buffer); *
* Binds buffer with default target.
*/
inline void bind() const { bind(_defaultTarget); }
/**
* @brief Bind buffer
* @param target %Target
*/
inline void bind(Target target) const {
glBindBuffer(static_cast<GLenum>(target), buffer);
} }
/** /**
* @brief Set buffer data * @brief Set buffer data
* @param size Data size * @param size Data size
* @param data Pointer to data * @param data Pointer to data
* @param usage Buffer usage * @param usage %Buffer usage
*
* Sets buffer data with default target.
*/ */
inline void setData(GLsizeiptr size, const GLvoid* data, Usage usage) { inline void setData(GLsizeiptr size, const GLvoid* data, Usage usage) {
bind(); setData(_defaultTarget, size, data, usage);
glBufferData(_type, size, data, usage); }
/**
* @brief Set buffer data
* @param target %Target
* @param size Data size
* @param data Pointer to data
* @param usage %Buffer usage
*/
inline void setData(Target target, GLsizeiptr size, const GLvoid* data, Usage usage) {
bind(target);
glBufferData(static_cast<GLenum>(target), size, data, static_cast<GLenum>(usage));
} }
private: private:
GLuint buffer; GLuint buffer;
Type _type; Target _defaultTarget;
}; };
} }

4
src/IndexedMesh.h

@ -37,7 +37,7 @@ class MAGNUM_EXPORT IndexedMesh: public Mesh {
* setIndexCount() and setIndexType() manually for mesh to draw * setIndexCount() and setIndexType() manually for mesh to draw
* properly. * properly.
*/ */
inline IndexedMesh(): _indexBuffer(Buffer::ElementArrayBuffer), _indexCount(0), _indexType(Type::UnsignedShort) {} inline IndexedMesh(): _indexBuffer(Buffer::Target::ElementArray), _indexCount(0), _indexType(Type::UnsignedShort) {}
/** /**
* @brief Constructor * @brief Constructor
@ -46,7 +46,7 @@ class MAGNUM_EXPORT IndexedMesh: public Mesh {
* @param indexCount Count of indices * @param indexCount Count of indices
* @param indexType Type of indices (indexable, see TypeTraits) * @param indexType Type of indices (indexable, see TypeTraits)
*/ */
inline IndexedMesh(Primitive primitive, GLsizei vertexCount, GLsizei indexCount, Type indexType = Type::UnsignedShort): Mesh(primitive, vertexCount), _indexBuffer(Buffer::ElementArrayBuffer), _indexCount(indexCount), _indexType(indexType) {} inline IndexedMesh(Primitive primitive, GLsizei vertexCount, GLsizei indexCount, Type indexType = Type::UnsignedShort): Mesh(primitive, vertexCount), _indexBuffer(Buffer::Target::ElementArray), _indexCount(indexCount), _indexType(indexType) {}
/** @brief Index count */ /** @brief Index count */
inline GLsizei indexCount() const { return _indexCount; } inline GLsizei indexCount() const { return _indexCount; }

2
src/Mesh.cpp

@ -28,7 +28,7 @@ Mesh::~Mesh() {
} }
Buffer* Mesh::addBuffer(bool interleaved) { Buffer* Mesh::addBuffer(bool interleaved) {
Buffer* buffer = new Buffer(Buffer::ArrayBuffer); Buffer* buffer = new Buffer(Buffer::Target::Array);
_buffers.insert(pair<Buffer*, pair<bool, vector<Attribute> > >( _buffers.insert(pair<Buffer*, pair<bool, vector<Attribute> > >(
buffer, buffer,
pair<bool, vector<Attribute> >(interleaved, vector<Attribute>()) pair<bool, vector<Attribute> >(interleaved, vector<Attribute>())

4
src/Primitives/Cube.cpp

@ -49,8 +49,8 @@ const GLubyte Cube::_indices[] = {
void Cube::build(IndexedMesh* mesh, Buffer* vertexBuffer) { void Cube::build(IndexedMesh* mesh, Buffer* vertexBuffer) {
prepareMesh(mesh); prepareMesh(mesh);
vertexBuffer->setData(sizeof(_vertices), _vertices, Buffer::StaticDraw); vertexBuffer->setData(sizeof(_vertices), _vertices, Buffer::Usage::StaticDraw);
mesh->indexBuffer()->setData(sizeof(_indices), _indices, Buffer::StaticDraw); mesh->indexBuffer()->setData(sizeof(_indices), _indices, Buffer::Usage::StaticDraw);
} }
}} }}

2
src/Primitives/Icosphere.h

@ -54,7 +54,7 @@ template<size_t subdivisions> class Icosphere: public AbstractPrimitive<typename
inline void build(IndexedMesh* mesh, Buffer* vertexBuffer) { inline void build(IndexedMesh* mesh, Buffer* vertexBuffer) {
/* mesh is prepared by the builder, no need to call prepareMesh */ /* mesh is prepared by the builder, no need to call prepareMesh */
builder()->build(mesh, vertexBuffer, Buffer::StaticDraw, Buffer::StaticDraw); builder()->build(mesh, vertexBuffer, Buffer::Usage::StaticDraw, Buffer::Usage::StaticDraw);
} }
private: private:

Loading…
Cancel
Save