src/mesh.c

changeset 115
e5f8c99b0987
parent 106
895f92cff6b8
child 116
bfb2a7d62047
equal deleted inserted replaced
114:5b91bbab1ac0 115:e5f8c99b0987
42 } 42 }
43 asc_error_catch_all_gl(); 43 asc_error_catch_all_gl();
44 } 44 }
45 45
46 void asc_mesh_free_buffers(AscMesh *mesh, unsigned count) { 46 void asc_mesh_free_buffers(AscMesh *mesh, unsigned count) {
47 if (count == 1 && mesh->vbo == 0) return; // hack to skip this function until we remove it
47 asc_dprintf("Free mesh buffers for %u meshes.", count); 48 asc_dprintf("Free mesh buffers for %u meshes.", count);
48 GLuint buffers[count]; 49 GLuint buffers[count];
49 GLuint arrays[count]; 50 GLuint arrays[count];
50 51
51 for (unsigned i = 0; i < count; i++) { 52 for (unsigned i = 0; i < count; i++) {
58 glDeleteBuffers(count, buffers); 59 glDeleteBuffers(count, buffers);
59 glDeleteVertexArrays(count, arrays); 60 glDeleteVertexArrays(count, arrays);
60 asc_error_catch_all_gl(); 61 asc_error_catch_all_gl();
61 } 62 }
62 63
63 void asc_mesh_draw_triangle_strip(AscMesh *mesh) { 64 void asc_mesh_draw_triangle_strip(const AscMesh *mesh) {
64 glBindVertexArray(mesh->vao); 65 glBindVertexArray(mesh->vao);
65 glDrawArrays(GL_TRIANGLE_STRIP, 0, mesh->vertices); 66 glDrawArrays(GL_TRIANGLE_STRIP, 0, mesh->vtx_count);
66 #ifndef NDEBUG 67 #ifndef NDEBUG
67 // only unbind in debug mode to detect accidental re-use of the wrong VAO 68 // only unbind in debug mode to detect accidental re-use of the wrong VAO
68 glBindVertexArray(0); 69 glBindVertexArray(0);
69 #endif 70 #endif
70 } 71 }
72
73 void asc_mesh_destroy(AscMesh *mesh) {
74 asc_mesh_free_buffers(mesh, 1);
75 free(mesh->vtx_data);
76 }
77
78 void asc_mesh_plane_2d(AscMesh *mesh) {
79 if (mesh->vbo == 0) {
80 asc_mesh_allocate_buffers(mesh, 1);
81 }
82 free(mesh->vtx_data);
83 asc_dprintf("Create plane in VBO %u and VAO %u", mesh->vbo, mesh->vao);
84 mesh->vtx_count = 4;
85 AscMeshVertex2d data[4] = {
86 {
87 .pos = {{0.0f, 0.0f}},
88 .uv = {{0.0f, 0.0f}},
89 } , // bottom left
90 {
91 .pos = {{0.0f, 1.0f}},
92 .uv = {{0.0f, 1.0f}},
93 }, // top left
94 {
95 .pos = {{1.0f, 0.0f}},
96 .uv = {{1.0f, 0.0f}},
97 }, // bottom right
98 {
99 .pos = {{1.0f, 1.0f}},
100 .uv = {{1.0f, 1.0f}},
101 } // top right
102 };
103 mesh->vtx_data = malloc(sizeof(data));
104 memcpy(mesh->vtx_data, data, sizeof(data));
105 glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
106 glBufferData(GL_ARRAY_BUFFER, sizeof(data), mesh->vtx_data, GL_STATIC_DRAW);
107 glBindVertexArray(mesh->vao);
108 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, pos));
109 glEnableVertexAttribArray(0);
110 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, uv));
111 glEnableVertexAttribArray(1);
112 }

mercurial