Apply projection matrix last to allow for clipping
This commit is contained in:
parent
b7101108a4
commit
7823e92861
@ -59,8 +59,8 @@ typedef struct {
|
|||||||
} rasteriser_scene_t;
|
} rasteriser_scene_t;
|
||||||
|
|
||||||
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene);
|
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,
|
void render_instance(window_t *wnd, Arena *arena, mat4x4f_t camera_matrix,
|
||||||
const instance_t *instance);
|
mat3x4f_t projection_matrix, const instance_t *instance);
|
||||||
void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
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_filled_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
||||||
void draw_shaded_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
void draw_shaded_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
||||||
|
@ -22,16 +22,15 @@ void render_scene(window_t *wnd, Arena *arena,
|
|||||||
inverse_camera_translation_matrix(scene->camera);
|
inverse_camera_translation_matrix(scene->camera);
|
||||||
mat4x4f_t cam_matrix =
|
mat4x4f_t cam_matrix =
|
||||||
mul_mat4x4f(cam_inverse_rotation, cam_inverse_translation);
|
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) {
|
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,
|
void render_instance(window_t *wnd, Arena *arena, mat4x4f_t camera_matrix,
|
||||||
const instance_t *instance) {
|
mat3x4f_t projection_matrix, const instance_t *instance) {
|
||||||
list_vec2i_t *projected = list_create_with_capacity(
|
list_vec2i_t *projected = list_create_with_capacity(
|
||||||
vec2i_t, arena, instance->model->vertices->count * sizeof(vec3f_t));
|
vec2i_t, arena, instance->model->vertices->count * sizeof(vec3f_t));
|
||||||
if (!projected) {
|
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 tr_mat = mul_mat4x4f(t_mat, r_mat);
|
||||||
mat4x4f_t trs_mat = mul_mat4x4f(tr_mat, s_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};
|
vec3f_t vertex = {0};
|
||||||
vec2i_t point = {0};
|
vec2i_t point = {0};
|
||||||
|
Loading…
Reference in New Issue
Block a user