Wed, 02 Jul 2025 23:21:17 +0200
resolve TODOs regarding input.h
a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array
81
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * Copyright 2025 Mike Becker. All rights reserved. |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * Redistribution and use in source and binary forms, with or without |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * modification, are permitted provided that the following conditions are met: |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * 1. Redistributions of source code must retain the above copyright |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * notice, this list of conditions and the following disclaimer. |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * 2. Redistributions in binary form must reproduce the above copyright |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * notice, this list of conditions and the following disclaimer in the |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * documentation and/or other materials provided with the distribution. |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * POSSIBILITY OF SUCH DAMAGE. |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | */ |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | |
106
895f92cff6b8
bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents:
95
diff
changeset
|
28 | #include "ascension/error.h" |
81
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | #include "ascension/mesh.h" |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
118
diff
changeset
|
31 | #include <cx/allocator.h> |
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
118
diff
changeset
|
32 | |
81
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
33 | #include <GL/glew.h> |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
34 | |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
35 | void asc_mesh_allocate_buffers(AscMesh *mesh, unsigned count) { |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | asc_dprintf("Allocate mesh buffers for %u meshes.", count); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
37 | GLuint buffers[count]; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
38 | GLuint arrays[count]; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
39 | glGenBuffers(count, buffers); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
40 | glGenVertexArrays(count, arrays); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
41 | for (unsigned i = 0; i < count; i++) { |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
42 | mesh[i].vbo = buffers[i]; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
43 | mesh[i].vao = arrays[i]; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
44 | } |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
45 | asc_error_catch_all_gl(); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
46 | } |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
47 | |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
48 | void asc_mesh_free_buffers(AscMesh *mesh, unsigned count) { |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
49 | if (count == 1 && mesh->vbo == 0) return; // hack to skip this function until we remove it |
81
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
50 | asc_dprintf("Free mesh buffers for %u meshes.", count); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
51 | GLuint buffers[count]; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
52 | GLuint arrays[count]; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
53 | |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
54 | for (unsigned i = 0; i < count; i++) { |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
55 | buffers[i] = mesh[i].vbo; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
56 | arrays[i] = mesh[i].vao; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
57 | mesh[i].vbo = 0; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
58 | mesh[i].vao = 0; |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
59 | } |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
60 | |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
61 | glDeleteBuffers(count, buffers); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
62 | glDeleteVertexArrays(count, arrays); |
84a546e282b7
create catch-all util for GL errors + refactors mesh creation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
63 | asc_error_catch_all_gl(); |
82
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
64 | } |
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
65 | |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
66 | void asc_mesh_draw_triangle_strip(const AscMesh *mesh) { |
82
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
67 | glBindVertexArray(mesh->vao); |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
68 | glDrawArrays(GL_TRIANGLE_STRIP, 0, mesh->vtx_count); |
82
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
69 | #ifndef NDEBUG |
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
70 | // only unbind in debug mode to detect accidental re-use of the wrong VAO |
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
71 | glBindVertexArray(0); |
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
72 | #endif |
4e1e698f4b0d
add generic mesh draw function and move sprite draw function to separate unit
Mike Becker <universe@uap-core.de>
parents:
81
diff
changeset
|
73 | } |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
74 | |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
75 | void asc_mesh_destroy(AscMesh *mesh) { |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
76 | asc_mesh_free_buffers(mesh, 1); |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
118
diff
changeset
|
77 | cxFreeDefault(mesh->vtx_data); |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
78 | } |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
79 | |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
80 | void asc_mesh_init_plane_2d(AscMesh *mesh, struct asc_mesh_init_plane_2d_args args) { |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
81 | if (mesh->vbo == 0) { |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
82 | asc_mesh_allocate_buffers(mesh, 1); |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
83 | } |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
84 | |
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
85 | unsigned required_memory = 4 * sizeof(asc_vertex2d); |
118 | 86 | |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
87 | // free any previous data |
118 | 88 | if (mesh->vtx_data && mesh->vtx_data_size < required_memory) { |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
118
diff
changeset
|
89 | cxFreeDefault(mesh->vtx_data); |
118 | 90 | mesh->vtx_data = NULL; |
91 | } | |
92 | ||
93 | // allocate memory | |
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
94 | asc_vertex2d *data; |
118 | 95 | if (mesh->vtx_data == NULL) { |
96 | asc_dprintf("Create plane in VBO %u and VAO %u", mesh->vbo, mesh->vao); | |
97 | mesh->vtx_data_size = required_memory; | |
122
1b118cd3e369
replace all stdlib malloc/free with UCX allocator
Mike Becker <universe@uap-core.de>
parents:
118
diff
changeset
|
98 | data = cxMallocDefault(mesh->vtx_data_size); |
118 | 99 | mesh->vtx_data = (float*) data; |
100 | } else { | |
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
101 | data = (asc_vertex2d*) mesh->vtx_data; |
118 | 102 | } |
103 | mesh->vtx_count = 4; | |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
104 | |
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
105 | // default values |
117
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
106 | args.size.x = ASC_NONZERO_OR(1.f, args.size.x); |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
107 | args.size.y = ASC_NONZERO_OR(1.f, args.size.y); |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
108 | args.uv_scale.x = ASC_NONZERO_OR(1.f, args.uv_scale.x); |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
116
diff
changeset
|
109 | args.uv_scale.y = ASC_NONZERO_OR(1.f, args.uv_scale.y); |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
110 | |
118 | 111 | // bottom left |
112 | data[0].pos = asc_vec2f_new(0.0f, 0.0f); | |
113 | data[0].uv = asc_vec2f_new(args.uv_offset.x, args.uv_offset.y); | |
114 | // top left | |
115 | data[1].pos = asc_vec2f_new(0.0f, args.size.y); | |
116 | data[1].uv = asc_vec2f_new(args.uv_offset.x, args.uv_offset.y + args.uv_scale.y); | |
117 | // bottom right | |
118 | data[2].pos = asc_vec2f_new(args.size.x, 0.0f); | |
119 | data[2].uv = asc_vec2f_new(args.uv_offset.x + args.uv_scale.x, args.uv_offset.y); | |
120 | // top right | |
121 | data[3].pos = asc_vec2f_new(args.size.x, args.size.y); | |
122 | data[3].uv = asc_vec2f_new(args.uv_offset.x + args.uv_scale.x, args.uv_offset.y + args.uv_scale.y); | |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
123 | glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo); |
118 | 124 | glBufferData(GL_ARRAY_BUFFER, mesh->vtx_data_size, mesh->vtx_data, GL_STATIC_DRAW); |
116
bfb2a7d62047
replace scaling with correct mesh sizes
Mike Becker <universe@uap-core.de>
parents:
115
diff
changeset
|
125 | // TODO: this should not be repeated for every adjustment - but it will be moved to the batch renderer anyway |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
126 | glBindVertexArray(mesh->vao); |
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
127 | glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(asc_vertex2d), (void*)offsetof(asc_vertex2d, pos)); |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
128 | glEnableVertexAttribArray(0); |
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
122
diff
changeset
|
129 | glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(asc_vertex2d), (void*)offsetof(asc_vertex2d, uv)); |
115
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
130 | glEnableVertexAttribArray(1); |
e5f8c99b0987
refactor rendering 1/3 - create new mesh structs
Mike Becker <universe@uap-core.de>
parents:
106
diff
changeset
|
131 | } |