]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/client/mesh.c
5d42f8c868e7a72729fec1078d3404575febb268
[dragonblocks_alpha.git] / src / client / mesh.c
1 #include <stdlib.h>
2 #include <stddef.h>
3 #include "client/mesh.h"
4
5 Mesh *mesh_create()
6 {
7         Mesh *mesh = malloc(sizeof(Mesh));
8         mesh->VAO = mesh->VBO = 0;
9         mesh->free_textures = false;
10         mesh->free_vertices = false;
11
12         return mesh;
13 }
14
15 void mesh_delete(Mesh *mesh)
16 {
17         if (mesh->textures && mesh->free_textures)
18                 free(mesh->textures);
19
20         if (mesh->vertices && mesh->free_vertices)
21                 free(mesh->vertices);
22
23         if (mesh->VAO)
24                 glDeleteVertexArrays(1, &mesh->VAO);
25
26         if (mesh->VBO)
27                 glDeleteBuffers(1, &mesh->VAO);
28
29         free(mesh);
30 }
31
32 void mesh_configure(Mesh *mesh)
33 {
34         glGenVertexArrays(1, &mesh->VAO);
35         glGenBuffers(1, &mesh->VBO);
36
37         glBindVertexArray(mesh->VAO);
38         glBindBuffer(GL_ARRAY_BUFFER, mesh->VBO);
39
40         glBufferData(GL_ARRAY_BUFFER, mesh->vertices_count * mesh->layout->size, mesh->vertices, GL_STATIC_DRAW);
41
42         vertex_layout_configure(mesh->layout);
43
44         glBindBuffer(GL_ARRAY_BUFFER, 0);
45         glBindVertexArray(0);
46
47         if (mesh->free_vertices)
48                 free(mesh->vertices);
49
50         mesh->vertices = NULL;
51 }
52
53 void mesh_render(Mesh *mesh)
54 {
55         if (mesh->vertices)
56                 mesh_configure(mesh);
57
58         for (GLuint i = 0; i < mesh->textures_count; i++)
59                 glBindTextureUnit(i, mesh->textures[i]);
60
61         glBindVertexArray(mesh->VAO);
62         glDrawArrays(GL_TRIANGLES, 0, mesh->vertices_count);
63 }