#include #include "mesh.h" void mesh_init(Mesh *mesh, int vertex_count) { glGenVertexArrays(1, &mesh->vao); mesh->vbos_count = 0; mesh->vertex_count = vertex_count; glBindVertexArray(mesh->vao); } static void mesh_store(Mesh *mesh, void *data, int len, int dimensions, GLenum type) { GLuint vbo; GLint index = mesh->vbos_count; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, len, data, GL_STATIC_DRAW); glEnableVertexAttribArray(index); if (type == GL_FLOAT) glVertexAttribPointer(index, dimensions, type, GL_FALSE, 0, 0); else glVertexAttribIPointer(index, dimensions, type, 0, 0); mesh->vbos[mesh->vbos_count++] = vbo; } void mesh_storef(Mesh *mesh, float *data, int count, int dimensions) { mesh_store(mesh, data, count * sizeof(float), dimensions, GL_FLOAT); } void mesh_storei(Mesh *mesh, int *data, int count, int dimensions) { mesh_store(mesh, data, count * sizeof(int), dimensions, GL_INT); } void mesh_storeu(Mesh *mesh, unsigned int *data, int count, int dimensions) { mesh_store(mesh, data, count * sizeof(unsigned int), dimensions, GL_UNSIGNED_INT); } void mesh_storeb(Mesh *mesh, unsigned char *data, int count, int dimensions) { mesh_store(mesh, data, count * sizeof(unsigned char), dimensions, GL_UNSIGNED_BYTE); } void mesh_finish(void) { glBindVertexArray(0); } void mesh_bind(Mesh *mesh) { glBindVertexArray(mesh->vao); for (int i = 0; i < mesh->vbos_count; i++) glEnableVertexAttribArray(i); } void mesh_unbind(Mesh *mesh) { for (int i = 0; i < mesh->vbos_count; i++) glDisableVertexAttribArray(i); glBindVertexArray(0); } void mesh_draw(Mesh *mesh) { glDrawArrays(GL_TRIANGLES, 0, mesh->vertex_count); } void mesh_draw_instanced(Mesh *mesh, int count) { glDrawArraysInstanced(GL_TRIANGLES, 0, mesh->vertex_count, count); } void mesh_free(Mesh *mesh) { glDeleteBuffers(mesh->vbos_count, mesh->vbos); glDeleteVertexArrays(1, &mesh->vao); } void uniform_init(Uniform *uniform, void *data, int len) { glGenBuffers(1, &uniform->id); glBindBuffer(GL_UNIFORM_BUFFER, uniform->id); glBufferData(GL_UNIFORM_BUFFER, len, data, GL_STATIC_DRAW); glBindBuffer(GL_UNIFORM_BUFFER, 0); } void uniform_free(Uniform *uniform) { glDeleteBuffers(1, &uniform->id); }