summaryrefslogtreecommitdiff
path: root/include/llmr/geometry/vao.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/llmr/geometry/vao.hpp')
-rw-r--r--include/llmr/geometry/vao.hpp43
1 files changed, 36 insertions, 7 deletions
diff --git a/include/llmr/geometry/vao.hpp b/include/llmr/geometry/vao.hpp
index 49401e01d2..a2a5a8a0d0 100644
--- a/include/llmr/geometry/vao.hpp
+++ b/include/llmr/geometry/vao.hpp
@@ -10,19 +10,47 @@ namespace llmr {
template <typename Shader>
class VertexArrayObject {
public:
- template <typename Buffer>
- void bind(Shader& shader, Buffer& buffer, char *offset) {
+ template <typename VertexBuffer>
+ void bind(Shader& shader, VertexBuffer& vertex_buffer, char *offset) {
if (!vao) {
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
- buffer.bind();
+ vertex_buffer.bind();
shader.bind(offset);
- buffer_ptr = &buffer;
+ vertex_buffer_ptr = &vertex_buffer;
+ elements_buffer_ptr = nullptr;
offset_ptr = offset;
- } else if (buffer_ptr != &buffer) {
- throw std::runtime_error("trying to bind VAO to another buffer");
+ } else if (vertex_buffer_ptr != &vertex_buffer) {
+ throw std::runtime_error("trying to bind VAO to another vertex buffer");
+ } else if (elements_buffer_ptr != nullptr) {
+ throw std::runtime_error("trying to bind VAO to another elements buffer");
+ } else if (offset_ptr != offset) {
+ throw std::runtime_error("trying to bind VAO to another offset");
+ } else {
+ // We have been given the correct information.
+ glBindVertexArray(vao);
+ }
+ }
+
+ template <typename VertexBuffer, typename ElementsBuffer>
+ void bind(Shader& shader, VertexBuffer& vertex_buffer, ElementsBuffer& elements_buffer, char *offset) {
+ if (!vao) {
+ glGenVertexArrays(1, &vao);
+ glBindVertexArray(vao);
+
+ vertex_buffer.bind();
+ elements_buffer.bind();
+ shader.bind(offset);
+
+ vertex_buffer_ptr = &vertex_buffer;
+ elements_buffer_ptr = &elements_buffer;
+ offset_ptr = offset;
+ } else if (vertex_buffer_ptr != &vertex_buffer) {
+ throw std::runtime_error("trying to bind VAO to another vertex buffer");
+ } else if (elements_buffer_ptr != &elements_buffer) {
+ throw std::runtime_error("trying to bind VAO to another elements buffer");
} else if (offset_ptr != offset) {
throw std::runtime_error("trying to bind VAO to another offset");
} else {
@@ -42,7 +70,8 @@ private:
// For debug reasons, we're storing the bind information so that we can
// detect errors and report
- void *buffer_ptr = nullptr;
+ void *vertex_buffer_ptr = nullptr;
+ void *elements_buffer_ptr = nullptr;
char *offset_ptr = 0;
};