5 Mesh *mesh_create(Vertex *vertices, GLsizei count)
7 Mesh *mesh = malloc(sizeof(Mesh));
8 mesh->pos = (v3f) {0.0f, 0.0f, 0.0f};
9 mesh->rot = (v3f) {0.0f, 0.0f, 0.0f};
10 mesh->scale = (v3f) {1.0f, 1.0f, 1.0f};
16 mesh->vertices = vertices;
21 #pragma GCC diagnostic push
22 #pragma GCC diagnostic ignored "-Wpedantic"
24 void mesh_transform(Mesh *mesh)
26 mat4x4_translate(mesh->transform, mesh->pos.x, mesh->pos.y, mesh->pos.z);
27 mat4x4_rotate(mesh->transform, mesh->transform, mesh->rot.x, mesh->rot.y, mesh->rot.z, mesh->angle);
28 mat4x4_scale_aniso(mesh->transform, mesh->transform, mesh->scale.x, mesh->scale.y, mesh->scale.z);
31 #pragma GCC diagnostic pop
33 void mesh_delete(Mesh *mesh)
38 glDeleteVertexArrays(1, &mesh->VAO);
40 glDeleteBuffers(1, &mesh->VAO);
44 static void mesh_configure(Mesh *mesh)
46 glGenVertexArrays(1, &mesh->VAO);
47 glGenBuffers(1, &mesh->VBO);
49 glBindVertexArray(mesh->VAO);
50 glBindBuffer(GL_ARRAY_BUFFER, mesh->VBO);
52 glBufferData(GL_ARRAY_BUFFER, mesh->count * sizeof(Vertex), mesh->vertices, GL_STATIC_DRAW);
54 glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(Vertex), (GLvoid *) offsetof(Vertex, x));
55 glEnableVertexAttribArray(0);
56 glVertexAttribPointer(1, 3, GL_FLOAT, false, sizeof(Vertex), (GLvoid *) offsetof(Vertex, r));
57 glEnableVertexAttribArray(1);
59 glBindBuffer(GL_ARRAY_BUFFER, 0);
63 mesh->vertices = NULL;
66 void mesh_render(Mesh *mesh, ShaderProgram *prog)
71 glUniformMatrix4fv(prog->loc_model, 1, GL_FALSE, mesh->transform[0]);
73 glBindVertexArray(mesh->VAO);
74 glDrawArrays(GL_TRIANGLES, 0, mesh->count);