aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-07-09 20:19:47 -0700
committer3gg <3gg@shellblade.net>2025-07-09 20:19:47 -0700
commit2f286e9ec9d872625f8f82bbcdcfc588913ec4a3 (patch)
treef7b06552190fa7895b0c2da4705a6e515883fd21
parent412be23697b5d3bbb4a6ac879b66dc5971bf7966 (diff)
Track active material in the LLRHEADmain
-rw-r--r--include/gfx/llr/llr.h8
-rw-r--r--src/llr/llr.c19
-rw-r--r--src/llr/llr_impl.h3
3 files changed, 29 insertions, 1 deletions
diff --git a/include/gfx/llr/llr.h b/include/gfx/llr/llr.h
index 8add1d5..098374d 100644
--- a/include/gfx/llr/llr.h
+++ b/include/gfx/llr/llr.h
@@ -7,6 +7,7 @@
7typedef struct Anima Anima; 7typedef struct Anima Anima;
8typedef struct Geometry Geometry; 8typedef struct Geometry Geometry;
9typedef struct Light Light; 9typedef struct Light Light;
10typedef struct Material Material;
10typedef struct Mesh Mesh; 11typedef struct Mesh Mesh;
11typedef struct ShaderProgram ShaderProgram; 12typedef struct ShaderProgram ShaderProgram;
12typedef struct Skeleton Skeleton; 13typedef struct Skeleton Skeleton;
@@ -33,6 +34,13 @@ void gfx_llr_set_skeleton(LLR*, const Anima*, const Skeleton*);
33/// Clear the loaded skeleton. 34/// Clear the loaded skeleton.
34void gfx_llr_clear_skeleton(LLR*); 35void gfx_llr_clear_skeleton(LLR*);
35 36
37/// Set the material.
38///
39/// The material need not be set explicitly when rendering a mesh
40/// (gfx_llr_render_mesh). This is mostly useful when using the lower-level
41/// function to render geometry (gfx_llr_render_geometry).
42void gfx_llr_set_material(LLR*, const Material*);
43
36/// Set the camera. 44/// Set the camera.
37void gfx_llr_set_camera(LLR*, const Camera*); 45void gfx_llr_set_camera(LLR*, const Camera*);
38 46
diff --git a/src/llr/llr.c b/src/llr/llr.c
index e5242e7..664c9a4 100644
--- a/src/llr/llr.c
+++ b/src/llr/llr.c
@@ -201,11 +201,20 @@ static void configure_state(LLR* renderer) {
201 } 201 }
202 } 202 }
203 203
204 if (renderer->material_changed || renderer->shader_changed) {
205 renderer->material_changed = false;
206
207 gfx_material_activate(renderer->shader, renderer->material);
208 }
209
204 if (renderer->shader_changed) { 210 if (renderer->shader_changed) {
205 renderer->shader_changed = false; 211 renderer->shader_changed = false;
206 gfx_activate_shader_program(renderer->shader); 212 gfx_activate_shader_program(renderer->shader);
207 } 213 }
208 214
215 // TODO: At present, this results in many redundant calls to
216 // glGetUniformLocation() and glUniformXyz(). Look at the trace.
217 //
209 // Must be called after activating the program. 218 // Must be called after activating the program.
210 gfx_apply_uniforms(renderer->shader); 219 gfx_apply_uniforms(renderer->shader);
211} 220}
@@ -296,6 +305,14 @@ void gfx_llr_clear_skeleton(LLR* renderer) {
296 renderer->skeleton_changed = true; 305 renderer->skeleton_changed = true;
297} 306}
298 307
308void gfx_llr_set_material(LLR* renderer, const Material* material) {
309 assert(renderer);
310 assert(material);
311
312 renderer->material = material;
313 renderer->material_changed = true;
314}
315
299void gfx_llr_set_camera(LLR* renderer, const Camera* camera) { 316void gfx_llr_set_camera(LLR* renderer, const Camera* camera) {
300 assert(renderer); 317 assert(renderer);
301 318
@@ -331,7 +348,7 @@ void gfx_llr_render_mesh(LLR* renderer, const Mesh* mesh) {
331 assert(mesh->geometry); 348 assert(mesh->geometry);
332 assert(mesh->material); 349 assert(mesh->material);
333 350
334 gfx_material_activate(renderer->shader, mesh->material); 351 gfx_llr_set_material(renderer, mesh->material);
335 gfx_llr_render_geometry(renderer, mesh->geometry); 352 gfx_llr_render_geometry(renderer, mesh->geometry);
336} 353}
337 354
diff --git a/src/llr/llr_impl.h b/src/llr/llr_impl.h
index ada2d79..3f6a68f 100644
--- a/src/llr/llr_impl.h
+++ b/src/llr/llr_impl.h
@@ -43,6 +43,7 @@ typedef struct LLR {
43 bool camera_changed : 1; // Whether the camera parameters have changed. 43 bool camera_changed : 1; // Whether the camera parameters have changed.
44 bool lights_changed : 1; // Whether the lights have changed. 44 bool lights_changed : 1; // Whether the lights have changed.
45 bool skeleton_changed : 1; // Whether the skeleton has changed. 45 bool skeleton_changed : 1; // Whether the skeleton has changed.
46 bool material_changed : 1; // Whether the material has changed.
46 bool matrix_changed : 1; // Whether the matrix stack has changed. 47 bool matrix_changed : 1; // Whether the matrix stack has changed.
47 }; 48 };
48 uint8_t changed_flags; 49 uint8_t changed_flags;
@@ -53,6 +54,8 @@ typedef struct LLR {
53 54
54 ShaderProgram* shader; // Active shader. Not owned. 55 ShaderProgram* shader; // Active shader. Not owned.
55 56
57 const Material* material; // Active material. Not owned.
58
56 vec3 camera_position; 59 vec3 camera_position;
57 mat4 camera_rotation; 60 mat4 camera_rotation;
58 mat4 view; // Camera view matrix. 61 mat4 view; // Camera view matrix.