diff options
Diffstat (limited to 'src/mesh.c')
| -rw-r--r-- | src/mesh.c | 27 |
1 files changed, 24 insertions, 3 deletions
@@ -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) |