#pragma once #include "types.h" #include "Shader.h" #include "mathlib.h" struct OrthographicRenderer { Mat4x4 projection; uint32 shader; struct { int32 position; int32 color; } attributes; struct { int32 projection; int32 model; } uniforms; void load(); void render(); void unload(); }; struct OrthographicVertex { Vector2 position; Vector4 color; }; template struct OrthographicShape { uint32 vao; uint32 vbo; OrthographicVertex vertices[N]; Mat4x4 model; void load(OrthographicRenderer* renderer); void render(OrthographicRenderer* renderer); void unload(); }; template void OrthographicShape::load(OrthographicRenderer* renderer) { useShader(renderer->shader); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, N * sizeof(OrthographicVertex), &vertices[0], GL_STATIC_DRAW); glEnableVertexAttribArray(renderer->attributes.position); glVertexAttribPointer(renderer->attributes.position, 2, GL_FLOAT, GL_FALSE, sizeof(OrthographicVertex), (GLvoid *)0); glEnableVertexAttribArray(renderer->attributes.color); glVertexAttribPointer(renderer->attributes.color, 4, GL_FLOAT, GL_FALSE, sizeof(OrthographicVertex), (GLvoid *)offsetof(OrthographicVertex, color)); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } template void OrthographicShape::render(OrthographicRenderer* renderer) { setShaderMat4(renderer->uniforms.model, model); glBindVertexArray(vao); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0); } template void OrthographicShape::unload() { glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); }