]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/mesh.c
You can now see other players
[dragonblocks_alpha.git] / src / client / mesh.c
1 #include <stddef.h>
2 #include <stdlib.h>
3 #include "client/gl_debug.h"
4 #include "client/mesh.h"
5
6 // upload data to GPU (only done once)
7 void mesh_upload(Mesh *mesh)
8 {
9         glGenVertexArrays(1, &mesh->vao); GL_DEBUG
10         glGenBuffers(1, &mesh->vbo); GL_DEBUG
11
12         glBindVertexArray(mesh->vao); GL_DEBUG
13         glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo); GL_DEBUG
14
15         glBufferData(GL_ARRAY_BUFFER, mesh->count * mesh->layout->size,
16                 mesh->data, GL_STATIC_DRAW); GL_DEBUG
17
18         size_t offset = 0;
19         for (GLuint i = 0; i < mesh->layout->count; i++) {
20                 VertexAttribute *attrib = &mesh->layout->attributes[i];
21
22                 glVertexAttribPointer(i, attrib->length, attrib->type, GL_FALSE,
23                         mesh->layout->size, (GLvoid *) offset); GL_DEBUG
24                 glEnableVertexAttribArray(i); GL_DEBUG
25
26                 offset += attrib->size;
27         }
28
29         glBindBuffer(GL_ARRAY_BUFFER, 0); GL_DEBUG
30         glBindVertexArray(0); GL_DEBUG
31
32         if (mesh->free_data)
33                 free(mesh->data);
34
35         mesh->data = NULL;
36 }
37
38 void mesh_render(Mesh *mesh)
39 {
40         if (mesh->data)
41                 mesh_upload(mesh);
42
43         // render
44         glBindVertexArray(mesh->vao); GL_DEBUG
45         glDrawArrays(GL_TRIANGLES, 0, mesh->count); GL_DEBUG
46 }
47
48 void mesh_destroy(Mesh *mesh)
49 {
50         if (mesh->data && mesh->free_data)
51                 free(mesh->data);
52
53         if (mesh->vao) {
54                 glDeleteVertexArrays(1, &mesh->vao); GL_DEBUG
55         }
56
57         if (mesh->vbo) {
58                 glDeleteBuffers(1, &mesh->vbo); GL_DEBUG
59         }
60
61         mesh->vao = mesh->vbo = 0;
62 }