| 78 void asc_mesh_init_plane_2d(AscMesh *mesh, struct asc_mesh_init_plane_2d_args args) { |
78 void asc_mesh_init_plane_2d(AscMesh *mesh, struct asc_mesh_init_plane_2d_args args) { |
| 79 if (mesh->vbo == 0) { |
79 if (mesh->vbo == 0) { |
| 80 asc_mesh_allocate_buffers(mesh, 1); |
80 asc_mesh_allocate_buffers(mesh, 1); |
| 81 } |
81 } |
| 82 |
82 |
| |
83 unsigned required_memory = 4 * sizeof(AscMeshVertex2d); |
| |
84 |
| 83 // free any previous data |
85 // free any previous data |
| 84 free(mesh->vtx_data); |
86 if (mesh->vtx_data && mesh->vtx_data_size < required_memory) { |
| |
87 free(mesh->vtx_data); |
| |
88 mesh->vtx_data = NULL; |
| |
89 } |
| |
90 |
| |
91 // allocate memory |
| |
92 AscMeshVertex2d *data; |
| |
93 if (mesh->vtx_data == NULL) { |
| |
94 asc_dprintf("Create plane in VBO %u and VAO %u", mesh->vbo, mesh->vao); |
| |
95 mesh->vtx_data_size = required_memory; |
| |
96 data = malloc(mesh->vtx_data_size); |
| |
97 mesh->vtx_data = (float*) data; |
| |
98 } else { |
| |
99 data = (AscMeshVertex2d*) mesh->vtx_data; |
| |
100 } |
| |
101 mesh->vtx_count = 4; |
| 85 |
102 |
| 86 // default values |
103 // default values |
| 87 args.size.x = ASC_NONZERO_OR(1.f, args.size.x); |
104 args.size.x = ASC_NONZERO_OR(1.f, args.size.x); |
| 88 args.size.y = ASC_NONZERO_OR(1.f, args.size.y); |
105 args.size.y = ASC_NONZERO_OR(1.f, args.size.y); |
| 89 args.uv_scale.x = ASC_NONZERO_OR(1.f, args.uv_scale.x); |
106 args.uv_scale.x = ASC_NONZERO_OR(1.f, args.uv_scale.x); |
| 90 args.uv_scale.y = ASC_NONZERO_OR(1.f, args.uv_scale.y); |
107 args.uv_scale.y = ASC_NONZERO_OR(1.f, args.uv_scale.y); |
| 91 |
108 |
| 92 asc_dprintf("Create plane in VBO %u and VAO %u", mesh->vbo, mesh->vao); |
109 // bottom left |
| 93 mesh->vtx_count = 4; |
110 data[0].pos = asc_vec2f_new(0.0f, 0.0f); |
| 94 AscMeshVertex2d data[4] = { |
111 data[0].uv = asc_vec2f_new(args.uv_offset.x, args.uv_offset.y); |
| 95 { |
112 // top left |
| 96 .pos = {{0.0f, 0.0f}}, |
113 data[1].pos = asc_vec2f_new(0.0f, args.size.y); |
| 97 .uv = {{args.uv_offset.x, args.uv_offset.y}}, |
114 data[1].uv = asc_vec2f_new(args.uv_offset.x, args.uv_offset.y + args.uv_scale.y); |
| 98 } , // bottom left |
115 // bottom right |
| 99 { |
116 data[2].pos = asc_vec2f_new(args.size.x, 0.0f); |
| 100 .pos = {{0.0f, args.size.y}}, |
117 data[2].uv = asc_vec2f_new(args.uv_offset.x + args.uv_scale.x, args.uv_offset.y); |
| 101 .uv = {{args.uv_offset.x, args.uv_offset.y + args.uv_scale.y}}, |
118 // top right |
| 102 }, // top left |
119 data[3].pos = asc_vec2f_new(args.size.x, args.size.y); |
| 103 { |
120 data[3].uv = asc_vec2f_new(args.uv_offset.x + args.uv_scale.x, args.uv_offset.y + args.uv_scale.y); |
| 104 .pos = {{args.size.x, 0.0f}}, |
|
| 105 .uv = {{args.uv_offset.x + args.uv_scale.x, args.uv_offset.y}}, |
|
| 106 }, // bottom right |
|
| 107 { |
|
| 108 .pos = {{args.size.x, args.size.y}}, |
|
| 109 .uv = {{args.uv_offset.x + args.uv_scale.x, args.uv_offset.y + args.uv_scale.y}}, |
|
| 110 } // top right |
|
| 111 }; |
|
| 112 mesh->vtx_data = malloc(sizeof(data)); |
|
| 113 memcpy(mesh->vtx_data, data, sizeof(data)); |
|
| 114 glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo); |
121 glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo); |
| 115 glBufferData(GL_ARRAY_BUFFER, sizeof(data), mesh->vtx_data, GL_STATIC_DRAW); |
122 glBufferData(GL_ARRAY_BUFFER, mesh->vtx_data_size, mesh->vtx_data, GL_STATIC_DRAW); |
| 116 // TODO: this should not be repeated for every adjustment - but it will be moved to the batch renderer anyway |
123 // TODO: this should not be repeated for every adjustment - but it will be moved to the batch renderer anyway |
| 117 glBindVertexArray(mesh->vao); |
124 glBindVertexArray(mesh->vao); |
| 118 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, pos)); |
125 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, pos)); |
| 119 glEnableVertexAttribArray(0); |
126 glEnableVertexAttribArray(0); |
| 120 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, uv)); |
127 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(AscMeshVertex2d), (void*)offsetof(AscMeshVertex2d, uv)); |