diff -r d1267f656a97 -r 830608f7e7d9 src/mesh.c --- 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));