Apply projection matrix last to allow for clipping

This commit is contained in:
Abdelrahman Said 2024-07-07 22:06:35 +01:00
parent b7101108a4
commit 7823e92861
2 changed files with 9 additions and 8 deletions

View File

@ -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);

View File

@ -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};