src/mesh.c

changeset 118
830608f7e7d9
parent 117
d1267f656a97
child 122
1b118cd3e369
--- a/src/mesh.c	Mon May 12 20:51:57 2025 +0200
+++ b/src/mesh.c	Mon May 12 21:13:24 2025 +0200
@@ -80,8 +80,25 @@
         asc_mesh_allocate_buffers(mesh, 1);
     }
 
+    unsigned required_memory = 4 * sizeof(AscMeshVertex2d);
+
     // free any previous data
-    free(mesh->vtx_data);
+    if (mesh->vtx_data && mesh->vtx_data_size < required_memory) {
+        free(mesh->vtx_data);
+        mesh->vtx_data = NULL;
+    }
+
+    // allocate memory
+    AscMeshVertex2d *data;
+    if (mesh->vtx_data == NULL) {
+        asc_dprintf("Create plane in VBO %u and VAO %u", mesh->vbo, mesh->vao);
+        mesh->vtx_data_size = required_memory;
+        data = malloc(mesh->vtx_data_size);
+        mesh->vtx_data = (float*) data;
+    } else {
+        data = (AscMeshVertex2d*) mesh->vtx_data;
+    }
+    mesh->vtx_count = 4;
 
     // default values
     args.size.x = ASC_NONZERO_OR(1.f, args.size.x);
@@ -89,30 +106,20 @@
     args.uv_scale.x = ASC_NONZERO_OR(1.f, args.uv_scale.x);
     args.uv_scale.y = ASC_NONZERO_OR(1.f, args.uv_scale.y);
 
-    asc_dprintf("Create plane in VBO %u and VAO %u", mesh->vbo, mesh->vao);
-    mesh->vtx_count = 4;
-    AscMeshVertex2d data[4] = {
-        {
-            .pos = {{0.0f, 0.0f}},
-            .uv = {{args.uv_offset.x, args.uv_offset.y}},
-        } , // bottom left
-        {
-            .pos = {{0.0f, args.size.y}},
-            .uv = {{args.uv_offset.x, args.uv_offset.y + args.uv_scale.y}},
-        }, // top left
-        {
-            .pos = {{args.size.x, 0.0f}},
-            .uv = {{args.uv_offset.x + args.uv_scale.x, args.uv_offset.y}},
-        }, // bottom right
-        {
-            .pos = {{args.size.x, args.size.y}},
-            .uv = {{args.uv_offset.x + args.uv_scale.x, args.uv_offset.y + args.uv_scale.y}},
-        } // top right
-    };
-    mesh->vtx_data = malloc(sizeof(data));
-    memcpy(mesh->vtx_data, data, sizeof(data));
+    // bottom left
+    data[0].pos = asc_vec2f_new(0.0f, 0.0f);
+    data[0].uv = asc_vec2f_new(args.uv_offset.x, args.uv_offset.y);
+    // top left
+    data[1].pos = asc_vec2f_new(0.0f, args.size.y);
+    data[1].uv = asc_vec2f_new(args.uv_offset.x, args.uv_offset.y + args.uv_scale.y);
+    // bottom right
+    data[2].pos = asc_vec2f_new(args.size.x, 0.0f);
+    data[2].uv = asc_vec2f_new(args.uv_offset.x + args.uv_scale.x, args.uv_offset.y);
+    // top right
+    data[3].pos = asc_vec2f_new(args.size.x, args.size.y);
+    data[3].uv = asc_vec2f_new(args.uv_offset.x + args.uv_scale.x, args.uv_offset.y + args.uv_scale.y);
     glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
-    glBufferData(GL_ARRAY_BUFFER, sizeof(data), mesh->vtx_data, GL_STATIC_DRAW);
+    glBufferData(GL_ARRAY_BUFFER, mesh->vtx_data_size, mesh->vtx_data, GL_STATIC_DRAW);
     // TODO: this should not be repeated for every adjustment - but it will be moved to the batch renderer anyway
     glBindVertexArray(mesh->vao);
     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, pos));

mercurial