diff options
Diffstat (limited to 'include/llmr/geometry/vao.hpp')
-rw-r--r-- | include/llmr/geometry/vao.hpp | 43 |
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; }; |