From 9d6a2d71e4c8c3bb5ef8d9088a5cec985f869b9b Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Fri, 4 Jul 2025 17:27:11 -0700 Subject: Refactor scene renderer to use the LLR --- src/llr/llr.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'src/llr/llr.c') diff --git a/src/llr/llr.c b/src/llr/llr.c index 746f4b3..74cfaed 100644 --- a/src/llr/llr.c +++ b/src/llr/llr.c @@ -171,6 +171,9 @@ static void configure_state(LLR* renderer) { gfx_set_mat4_uniform(shader, "ViewProjection", &view_proj); gfx_set_mat4_uniform(shader, "MVP", &mvp); gfx_set_vec3_uniform(shader, "CameraPosition", renderer->camera_position); + gfx_set_mat4_uniform(shader, "CameraRotation", &renderer->camera_rotation); + gfx_set_float_uniform(shader, "Fovy", renderer->fovy); + gfx_set_float_uniform(shader, "Aspect", renderer->aspect); } if (renderer->lights_changed || renderer->shader_changed) { @@ -188,9 +191,11 @@ static void configure_state(LLR* renderer) { if (renderer->skeleton_changed || renderer->shader_changed) { renderer->skeleton_changed = false; - gfx_set_mat4_array_uniform( - shader, "JointMatrices", renderer->joint_matrices, - renderer->num_joints); + if (renderer->num_joints > 0) { + gfx_set_mat4_array_uniform( + shader, "JointMatrices", renderer->joint_matrices, + renderer->num_joints); + } } if (renderer->shader_changed) { @@ -211,6 +216,9 @@ bool gfx_llr_make(LLR* renderer, GfxCore* gfxcore) { goto cleanup; } gfx_llr_load_identity(renderer); + renderer->view = mat4_id(); + renderer->projection = mat4_id(); + renderer->camera_rotation = mat4_id(); return true; cleanup: @@ -278,7 +286,7 @@ void gfx_llr_set_skeleton( renderer->skeleton_changed = true; } -void gfx_llr_unset_skeleton(LLR* renderer) { +void gfx_llr_clear_skeleton(LLR* renderer) { assert(renderer); renderer->num_joints = 0; @@ -288,22 +296,22 @@ void gfx_llr_unset_skeleton(LLR* renderer) { void gfx_llr_set_camera(LLR* renderer, const Camera* camera) { assert(renderer); - const mat4 view = spatial3_inverse_transform(&camera->spatial); - // const mat4 view_proj = mat4_mul(camera->projection, view); - // gfx_llr_set_view_projection_matrix(renderer, &view_proj); - renderer->view = view; - renderer->projection = camera->projection; + renderer->camera_position = camera->spatial.p; + renderer->camera_rotation = + mat4_rotation(spatial3_transform(&camera->spatial)); + renderer->view = spatial3_inverse_transform(&camera->spatial); + renderer->projection = camera->projection; + // Assuming a perspective matrix. + renderer->fovy = (R)atan(1.0 / (mat4_at(camera->projection, 1, 1))) * 2; renderer->camera_changed = true; } -// void gfx_llr_set_view_projection_matrix( -// LLR* renderer, const mat4* view_proj) { -// assert(renderer); -// assert(renderer->shader); -// -// gfx_llr_flush(renderer); -// gfx_set_mat4_uniform(renderer->shader, "ViewProjection", view_proj); -// } +void gfx_llr_set_aspect(LLR* renderer, float aspect) { + assert(renderer); + + renderer->aspect = aspect; + renderer->camera_changed = true; +} void gfx_llr_render_geometry(LLR* renderer, const Geometry* geometry) { assert(renderer); -- cgit v1.2.3