diff options
Diffstat (limited to 'src/llr')
| -rw-r--r-- | src/llr/llr.c | 19 | ||||
| -rw-r--r-- | src/llr/llr_impl.h | 3 |
2 files changed, 21 insertions, 1 deletions
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 | ||
| 308 | void 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 | |||
| 299 | void gfx_llr_set_camera(LLR* renderer, const Camera* camera) { | 316 | void 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. |
