From 7823e92861bbf11d3bcfb54ea2ee55c0f4ee81fa Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 7 Jul 2024 22:06:35 +0100 Subject: [PATCH] Apply projection matrix last to allow for clipping --- include/rasteriser/rasteriser.h | 4 ++-- src/rasteriser/rasteriser.c | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h index e19036d..eccde20 100644 --- a/include/rasteriser/rasteriser.h +++ b/include/rasteriser/rasteriser.h @@ -59,8 +59,8 @@ typedef struct { } rasteriser_scene_t; void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene); -void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat, - const instance_t *instance); +void render_instance(window_t *wnd, Arena *arena, mat4x4f_t camera_matrix, + mat3x4f_t projection_matrix, const instance_t *instance); void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle); void draw_filled_triangle(window_t *wnd, Arena *arena, triangle_t triangle); void draw_shaded_triangle(window_t *wnd, Arena *arena, triangle_t triangle); diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 4dea514..809a977 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -22,16 +22,15 @@ void render_scene(window_t *wnd, Arena *arena, inverse_camera_translation_matrix(scene->camera); mat4x4f_t cam_matrix = mul_mat4x4f(cam_inverse_rotation, cam_inverse_translation); - mat3x4f_t proj_cam_matrix = - mul_mat3x4f_by_mat4x4f(*(scene->proj_matrix), cam_matrix); for (u64 i = 0; i < scene->instance_count; ++i) { - render_instance(wnd, arena, proj_cam_matrix, &(scene->instances[i])); + render_instance(wnd, arena, cam_matrix, *(scene->proj_matrix), + &(scene->instances[i])); } } -void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat, - const instance_t *instance) { +void render_instance(window_t *wnd, Arena *arena, mat4x4f_t camera_matrix, + mat3x4f_t projection_matrix, const instance_t *instance) { list_vec2i_t *projected = list_create_with_capacity( vec2i_t, arena, instance->model->vertices->count * sizeof(vec3f_t)); if (!projected) { @@ -46,7 +45,9 @@ void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat, mat4x4f_t tr_mat = mul_mat4x4f(t_mat, r_mat); mat4x4f_t trs_mat = mul_mat4x4f(tr_mat, s_mat); - mat3x4f_t xf_proj_mat = mul_mat3x4f_by_mat4x4f(proj_cam_mat, trs_mat); + mat4x4f_t xf_cam_mat = mul_mat4x4f(camera_matrix, trs_mat); + + mat3x4f_t xf_proj_mat = mul_mat3x4f_by_mat4x4f(projection_matrix, xf_cam_mat); vec3f_t vertex = {0}; vec2i_t point = {0};