summaryrefslogtreecommitdiff
path: root/src/mesh.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesh.c')
-rw-r--r--src/mesh.c78
1 files changed, 78 insertions, 0 deletions
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 <GL/glew.h>
+
+#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);
+}