summaryrefslogtreecommitdiff
path: root/src/mesh.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-12-11 22:10:52 -0500
committerFreya Murphy <freya@freyacat.org>2025-12-11 22:10:52 -0500
commite511e9c678eeb76906e75dbc92165e538d13546b (patch)
tree30b6dfde164603fa0a677baebe770f44536dfeff /src/mesh.c
parenti did a lot (diff)
downloadvoxel-e511e9c678eeb76906e75dbc92165e538d13546b.tar.gz
voxel-e511e9c678eeb76906e75dbc92165e538d13546b.tar.bz2
voxel-e511e9c678eeb76906e75dbc92165e538d13546b.zip
ambient occlusionHEADmain
Diffstat (limited to 'src/mesh.c')
-rw-r--r--src/mesh.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/mesh.c b/src/mesh.c
index 2ffe61b..2c3d040 100644
--- a/src/mesh.c
+++ b/src/mesh.c
@@ -7,6 +7,7 @@ void mesh_init(Mesh *mesh, u32 vertex_count)
glGenVertexArrays(1, &mesh->vao);
mesh->vbos_count = 0;
mesh->vertex_count = vertex_count;
+ mesh->ebo = 0;
glBindVertexArray(mesh->vao);
}
@@ -16,7 +17,7 @@ static void mesh_store(Mesh *mesh, void *data, u32 len, u32 dimensions, GLenum t
GLint index = mesh->vbos_count;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, len, data, GL_STATIC_DRAW);
+ glBufferData(GL_ARRAY_BUFFER, len * dimensions, data, GL_STATIC_DRAW);
glEnableVertexAttribArray(index);
if (type == GL_FLOAT)
glVertexAttribPointer(index, dimensions, type, GL_FALSE, 0, 0);
@@ -45,6 +46,17 @@ void mesh_store_u32(Mesh *mesh, u32 *data, u32 count, u32 dimensions)
mesh_store(mesh, data, count * sizeof(u32), dimensions, GL_UNSIGNED_INT);
}
+void mesh_store_indicies(Mesh *mesh, u16 *data, u32 count)
+{
+ GLuint ebo;
+ u32 len;
+ len = count * sizeof(u16);
+ glGenBuffers(1, &ebo);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, len, data, GL_STATIC_DRAW);
+ mesh->ebo = ebo;
+}
+
void mesh_finish(void)
{
glBindVertexArray(0);
@@ -66,18 +78,27 @@ void mesh_unbind(Mesh *mesh)
void mesh_draw(Mesh *mesh)
{
- glDrawArrays(GL_TRIANGLES, 0, mesh->vertex_count);
+ if (mesh->ebo)
+ glDrawElements(GL_TRIANGLES, mesh->vertex_count, GL_UNSIGNED_SHORT, NULL);
+ else
+ glDrawArrays(GL_TRIANGLES, 0, mesh->vertex_count);
}
void mesh_draw_instanced(Mesh *mesh, u32 count)
{
- glDrawArraysInstanced(GL_TRIANGLES, 0, mesh->vertex_count, count);
+ if (mesh->ebo)
+ glDrawElementsInstanced(GL_TRIANGLES, mesh->vertex_count, GL_UNSIGNED_SHORT, NULL,
+ count);
+ else
+ glDrawArraysInstanced(GL_TRIANGLES, 0, mesh->vertex_count, count);
}
void mesh_free(Mesh *mesh)
{
glDeleteBuffers(mesh->vbos_count, mesh->vbos);
glDeleteVertexArrays(1, &mesh->vao);
+ if (mesh->ebo)
+ glDeleteBuffers(1, &mesh->ebo);
}
void uniform_init(Uniform *uniform, u32 len)