From 2f286e9ec9d872625f8f82bbcdcfc588913ec4a3 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Wed, 9 Jul 2025 20:19:47 -0700 Subject: Track active material in the LLR --- src/llr/llr.c | 19 ++++++++++++++++++- src/llr/llr_impl.h | 3 +++ 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'src') 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) { } } + if (renderer->material_changed || renderer->shader_changed) { + renderer->material_changed = false; + + gfx_material_activate(renderer->shader, renderer->material); + } + if (renderer->shader_changed) { renderer->shader_changed = false; gfx_activate_shader_program(renderer->shader); } + // TODO: At present, this results in many redundant calls to + // glGetUniformLocation() and glUniformXyz(). Look at the trace. + // // Must be called after activating the program. gfx_apply_uniforms(renderer->shader); } @@ -296,6 +305,14 @@ void gfx_llr_clear_skeleton(LLR* renderer) { renderer->skeleton_changed = true; } +void gfx_llr_set_material(LLR* renderer, const Material* material) { + assert(renderer); + assert(material); + + renderer->material = material; + renderer->material_changed = true; +} + void gfx_llr_set_camera(LLR* renderer, const Camera* camera) { assert(renderer); @@ -331,7 +348,7 @@ void gfx_llr_render_mesh(LLR* renderer, const Mesh* mesh) { assert(mesh->geometry); assert(mesh->material); - gfx_material_activate(renderer->shader, mesh->material); + gfx_llr_set_material(renderer, mesh->material); gfx_llr_render_geometry(renderer, mesh->geometry); } 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 { bool camera_changed : 1; // Whether the camera parameters have changed. bool lights_changed : 1; // Whether the lights have changed. bool skeleton_changed : 1; // Whether the skeleton has changed. + bool material_changed : 1; // Whether the material has changed. bool matrix_changed : 1; // Whether the matrix stack has changed. }; uint8_t changed_flags; @@ -53,6 +54,8 @@ typedef struct LLR { ShaderProgram* shader; // Active shader. Not owned. + const Material* material; // Active material. Not owned. + vec3 camera_position; mat4 camera_rotation; mat4 view; // Camera view matrix. -- cgit v1.2.3