always pass the parameters and verify that they're correct
This commit is contained in:
@@ -3,38 +3,50 @@
|
||||
|
||||
#include <llmr/platform/gl.hpp>
|
||||
|
||||
#include <cassert>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace llmr {
|
||||
|
||||
class VertexArrayObject {
|
||||
public:
|
||||
template <typename Shader, typename VertexBuffer>
|
||||
inline void setup(Shader& shader, VertexBuffer& vertex_buffer, char *vertex_offset) {
|
||||
glGenVertexArrays(1, &vao);
|
||||
glBindVertexArray(vao);
|
||||
void bind(Shader& shader, VertexBuffer& vertex_buffer, char *vertex_offset) {
|
||||
if (!vao) {
|
||||
glGenVertexArrays(1, &vao);
|
||||
glBindVertexArray(vao);
|
||||
|
||||
vertex_buffer.bind();
|
||||
shader.bind_vertex(vertex_offset);
|
||||
vertex_buffer.bind();
|
||||
shader.bind_vertex(vertex_offset);
|
||||
|
||||
program = shader.program;
|
||||
buffer = &vertex_buffer;
|
||||
offset = vertex_offset;
|
||||
} else if (program != shader.program) {
|
||||
throw std::runtime_error("trying to bind VAO to different program");
|
||||
} else if (buffer != &vertex_buffer) {
|
||||
throw std::runtime_error("trying to bind VAO to another buffer");
|
||||
} else if (offset != vertex_offset) {
|
||||
throw std::runtime_error("trying to bind VAO to another offset");
|
||||
} else {
|
||||
// This is the correct program for this VAO.
|
||||
glBindVertexArray(vao);
|
||||
}
|
||||
}
|
||||
|
||||
inline ~VertexArrayObject() {
|
||||
~VertexArrayObject() {
|
||||
if (vao) {
|
||||
glDeleteVertexArrays(1, &vao);
|
||||
}
|
||||
}
|
||||
|
||||
inline operator bool() const {
|
||||
return vao != 0;
|
||||
}
|
||||
|
||||
inline void bind() {
|
||||
assert(vao);
|
||||
glBindVertexArray(vao);
|
||||
}
|
||||
|
||||
private:
|
||||
GLuint vao = 0;
|
||||
|
||||
// For debug reasons, we're storing the bind information so that we can
|
||||
// detect errors and report
|
||||
GLuint program = 0;
|
||||
void *buffer = NULL;
|
||||
char *offset = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -66,11 +66,7 @@ void FillBucket::drawElements(Shader& shader) {
|
||||
char *vertex_index = BUFFER_OFFSET(vertex_start * 2 * sizeof(int16_t));
|
||||
char *elements_index = BUFFER_OFFSET(elements_start * 3 * sizeof(int16_t));
|
||||
for (group& group : groups) {
|
||||
if (!group.array) {
|
||||
group.array.setup(shader, *buffer, vertex_index);
|
||||
} else {
|
||||
group.array.bind();
|
||||
}
|
||||
group.array.bind(shader, *buffer, vertex_index);
|
||||
glDrawElements(GL_TRIANGLES, group.elements_length * 3 - 3, GL_UNSIGNED_SHORT, elements_index);
|
||||
vertex_index += group.vertex_length * 2 * sizeof(uint16_t);
|
||||
elements_index += group.elements_length * 3 * sizeof(uint16_t);
|
||||
@@ -80,12 +76,8 @@ void FillBucket::drawElements(Shader& shader) {
|
||||
template <typename Shader>
|
||||
void FillBucket::drawVertices(Shader& shader) {
|
||||
// Draw the entire line
|
||||
if (!array) {
|
||||
char *vertex_index = BUFFER_OFFSET(vertex_start * 2 * sizeof(int16_t));
|
||||
array.setup(shader, *buffer, vertex_index);
|
||||
} else {
|
||||
array.bind();
|
||||
}
|
||||
char *vertex_index = BUFFER_OFFSET(vertex_start * 2 * sizeof(int16_t));
|
||||
array.bind(shader, *buffer, vertex_index);
|
||||
glDrawArrays(GL_LINE_STRIP, 0, length);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user