globjects  2.0.0.630135941c42
Strict OpenGL objects wrapper.
Loading...
Searching...
No Matches
VertexArray.h
Go to the documentation of this file.
1
2#pragma once
3
4
5#include <map>
6#include <vector>
7#include <memory>
8
9#include <glbinding/gl/types.h>
10
11#include <globjects/globjects_api.h>
12#include <globjects/Object.h>
14
15
16namespace globjects
17{
18
19
20class VertexAttributeBinding;
21class Buffer;
22
23
24// http://www.opengl.org/wiki/Vertex_Array_Object
25class GLOBJECTS_API VertexArray : public Object, public Instantiator<VertexArray>
26{
27public:
29 {
30 Legacy,
31 VertexAttribBindingARB,
32 DirectStateAccessARB
33 };
34
36
37
38public:
40
41 virtual ~VertexArray();
42
43 static std::unique_ptr<VertexArray> fromId(gl::GLuint id);
44 static std::unique_ptr<VertexArray> defaultVAO();
45
46 void bind() const;
47 static void unbind();
48
49 VertexAttributeBinding * binding(gl::GLuint bindingIndex);
50 const VertexAttributeBinding * binding(gl::GLuint bindingIndex) const;
51
52 void bindElementBuffer(const Buffer * buffer);
53
54 void enable(gl::GLint attributeIndex);
55 void disable(gl::GLint attributeIndex);
56
57 std::vector<VertexAttributeBinding *> bindings();
58 std::vector<const VertexAttributeBinding *> bindings() const;
59
60 // drawing
61
62 void drawArrays(gl::GLenum mode, gl::GLint first, gl::GLsizei count) const;
63 void drawArraysInstanced(gl::GLenum mode, gl::GLint first, gl::GLsizei count, gl::GLsizei instanceCount) const;
64 void drawArraysInstancedBaseInstance(gl::GLenum mode, gl::GLint first, gl::GLsizei count, gl::GLsizei instanceCount, gl::GLuint baseInstance) const;
65 void drawArraysIndirect(gl::GLenum mode, const void * indirect = nullptr) const;
66
67 void multiDrawArrays(gl::GLenum mode, gl::GLint * first, const gl::GLsizei * count, gl::GLsizei drawCount) const;
68 void multiDrawArraysIndirect(gl::GLenum mode, const void * indirect, gl::GLsizei drawCount, gl::GLsizei stride) const;
69
70 void drawElements(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void * indices = nullptr) const;
71 void drawElementsBaseVertex(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void * indices, gl::GLint baseVertex) const;
72 void drawElementsInstanced(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void * indices, gl::GLsizei primitiveCount) const;
73 void drawElementsInstancedBaseInstance(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void * indices, gl::GLsizei instanceCount, gl::GLuint baseInstance) const;
74 void drawElementsInstancedBaseVertex(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void * indices, gl::GLsizei instanceCount, gl::GLint baseVertex) const;
75 void drawElementsInstancedBaseVertexBaseInstance(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void * indices, gl::GLsizei instanceCount, gl::GLint baseVertex, gl::GLuint baseInstance) const;
76
77 void multiDrawElements(gl::GLenum mode, const gl::GLsizei * count, gl::GLenum type, const void ** indices, gl::GLsizei drawCount) const;
78 void multiDrawElementsBaseVertex(gl::GLenum mode, const gl::GLsizei * count, gl::GLenum type, const void ** indices, gl::GLsizei drawCount, gl::GLint * baseVertex) const;
79 void multiDrawElementsIndirect(gl::GLenum mode, gl::GLenum type, const void * indirect, gl::GLsizei drawCount, gl::GLsizei stride) const;
80
81 void drawRangeElements(gl::GLenum mode, gl::GLuint start, gl::GLuint end, gl::GLsizei count, gl::GLenum type, const void * indices = nullptr) const;
82 void drawRangeElementsBaseVertex(gl::GLenum mode, gl::GLuint start, gl::GLuint end, gl::GLsizei count, gl::GLenum type, const void * indices, gl::GLint baseVertex) const;
83
84 // convenience
86 {
87 gl::GLint first;
88 gl::GLsizei count;
89 };
90
92 {
93 gl::GLsizei count;
94 void * indices;
95 };
96
98 {
99 gl::GLsizei count;
100 void * indices;
101 gl::GLint baseVertex;
102 };
103
104 void multiDrawArrays(gl::GLenum mode, const std::vector<MultiDrawArraysRange> & ranges) const;
105 void multiDrawElements(gl::GLenum mode, gl::GLenum type, const std::vector<MultiDrawElementsRange> & ranges) const;
106 void multiDrawElementsBaseVertex(gl::GLenum mode, gl::GLenum type, const std::vector<MultiDrawElementsBaseVertexRange> & ranges) const;
107
108 virtual gl::GLenum objectType() const override;
109
110
111protected:
112 VertexArray(std::unique_ptr<IDResource> && resource);
113
114
115protected:
116 std::map<gl::GLuint, std::unique_ptr<VertexAttributeBinding>> m_bindings;
117
118};
119
120
121} // namespace globjects
Wrapper for OpenGL buffer objects.
Definition Buffer.h:38
CRTP for creating objects similar to std::make_unique.
Definition Instantiator.h:22
Superclass of all wrapped OpenGL objects.
Definition Object.h:28
Definition VertexArray.h:26
std::vector< VertexAttributeBinding * > bindings()
std::map< gl::GLuint, std::unique_ptr< VertexAttributeBinding > > m_bindings
Definition VertexArray.h:116
VertexAttributeBinding * binding(gl::GLuint bindingIndex)
void bindElementBuffer(const Buffer *buffer)
void drawElementsBaseVertex(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void *indices, gl::GLint baseVertex) const
void drawRangeElements(gl::GLenum mode, gl::GLuint start, gl::GLuint end, gl::GLsizei count, gl::GLenum type, const void *indices=nullptr) const
void multiDrawArrays(gl::GLenum mode, const std::vector< MultiDrawArraysRange > &ranges) const
void multiDrawElements(gl::GLenum mode, gl::GLenum type, const std::vector< MultiDrawElementsRange > &ranges) const
void drawElementsInstancedBaseInstance(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void *indices, gl::GLsizei instanceCount, gl::GLuint baseInstance) const
void drawElementsInstancedBaseVertexBaseInstance(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void *indices, gl::GLsizei instanceCount, gl::GLint baseVertex, gl::GLuint baseInstance) const
VertexArray(std::unique_ptr< IDResource > &&resource)
void enable(gl::GLint attributeIndex)
void multiDrawElementsBaseVertex(gl::GLenum mode, const gl::GLsizei *count, gl::GLenum type, const void **indices, gl::GLsizei drawCount, gl::GLint *baseVertex) const
AttributeImplementation
Definition VertexArray.h:29
static std::unique_ptr< VertexArray > defaultVAO()
void drawArraysIndirect(gl::GLenum mode, const void *indirect=nullptr) const
static void unbind()
const VertexAttributeBinding * binding(gl::GLuint bindingIndex) const
void multiDrawArraysIndirect(gl::GLenum mode, const void *indirect, gl::GLsizei drawCount, gl::GLsizei stride) const
void drawArraysInstancedBaseInstance(gl::GLenum mode, gl::GLint first, gl::GLsizei count, gl::GLsizei instanceCount, gl::GLuint baseInstance) const
void disable(gl::GLint attributeIndex)
static void hintAttributeImplementation(AttributeImplementation impl)
void drawElements(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void *indices=nullptr) const
void multiDrawElements(gl::GLenum mode, const gl::GLsizei *count, gl::GLenum type, const void **indices, gl::GLsizei drawCount) const
void multiDrawArrays(gl::GLenum mode, gl::GLint *first, const gl::GLsizei *count, gl::GLsizei drawCount) const
virtual gl::GLenum objectType() const override
void drawArrays(gl::GLenum mode, gl::GLint first, gl::GLsizei count) const
void drawElementsInstancedBaseVertex(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void *indices, gl::GLsizei instanceCount, gl::GLint baseVertex) const
void drawElementsInstanced(gl::GLenum mode, gl::GLsizei count, gl::GLenum type, const void *indices, gl::GLsizei primitiveCount) const
void multiDrawElementsBaseVertex(gl::GLenum mode, gl::GLenum type, const std::vector< MultiDrawElementsBaseVertexRange > &ranges) const
std::vector< const VertexAttributeBinding * > bindings() const
void drawArraysInstanced(gl::GLenum mode, gl::GLint first, gl::GLsizei count, gl::GLsizei instanceCount) const
void multiDrawElementsIndirect(gl::GLenum mode, gl::GLenum type, const void *indirect, gl::GLsizei drawCount, gl::GLsizei stride) const
static std::unique_ptr< VertexArray > fromId(gl::GLuint id)
void drawRangeElementsBaseVertex(gl::GLenum mode, gl::GLuint start, gl::GLuint end, gl::GLsizei count, gl::GLenum type, const void *indices, gl::GLint baseVertex) const
Definition VertexAttributeBinding.h:24
Contains all the classes that wrap OpenGL functionality.
gl::GLint first
Definition VertexArray.h:87
gl::GLsizei count
Definition VertexArray.h:88
gl::GLsizei count
Definition VertexArray.h:99
gl::GLint baseVertex
Definition VertexArray.h:101
void * indices
Definition VertexArray.h:94
gl::GLsizei count
Definition VertexArray.h:93