From ba2f810f0752bdecf8253b34bd245c7939f23534 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Thu, 4 Dec 2025 13:16:21 -0500 Subject: initial chunk rendering --- src/mesh.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/mesh.c (limited to 'src/mesh.c') diff --git a/src/mesh.c b/src/mesh.c new file mode 100644 index 0000000..6b2951b --- /dev/null +++ b/src/mesh.c @@ -0,0 +1,78 @@ +#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 data_len, int dimensions, GLenum type) +{ + GLuint vbo; + GLint index = mesh->vbos_count; + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, data_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 data_len, int dimensions) +{ + mesh_store(mesh, data, data_len * sizeof(float), dimensions, GL_FLOAT); +} + +void mesh_storei(Mesh *mesh, int *data, int data_len, int dimensions) +{ + mesh_store(mesh, data, data_len * sizeof(int), dimensions, GL_INT); +} + +void mesh_storeu(Mesh *mesh, unsigned int *data, int data_len, int dimensions) +{ + mesh_store(mesh, data, data_len * sizeof(unsigned int), dimensions, + GL_UNSIGNED_INT); +} + +void mesh_storeb(Mesh *mesh, unsigned char *data, int data_len, int dimensions) +{ + mesh_store(mesh, data, data_len * 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_free(Mesh *mesh) +{ + glDeleteBuffers(mesh->vbos_count, mesh->vbos); + glDeleteVertexArrays(1, &mesh->vao); +} -- cgit v1.2.3-freya