Add rasteriser_scene_t struct and render_scene function

This commit is contained in:
Abdelrahman Said 2024-07-07 21:58:01 +01:00
parent 39f198e342
commit b7101108a4
3 changed files with 51 additions and 28 deletions

View File

@ -51,6 +51,14 @@ typedef struct {
transform_t transform; transform_t transform;
} instance_t; } instance_t;
typedef struct {
u64 instance_count;
instance_t *instances;
camera_t *camera;
const mat3x4f_t *proj_matrix;
} 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, void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
const instance_t *instance); 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);

View File

@ -70,7 +70,8 @@ int main(void) {
} }
model_t cube = {.vertices = vertices, .triangles = triangles}; model_t cube = {.vertices = vertices, .triangles = triangles};
instance_t cube_01 = { instance_t instances[] = {
(instance_t){
.model = &cube, .model = &cube,
.transform = .transform =
{ {
@ -78,8 +79,8 @@ int main(void) {
.rotation = (vec3f_t){0}, .rotation = (vec3f_t){0},
.position = (vec3f_t){-1.5f, 0.0f, 8.0f}, .position = (vec3f_t){-1.5f, 0.0f, 8.0f},
}, },
}; },
instance_t cube_02 = { (instance_t){
.model = &cube, .model = &cube,
.transform = .transform =
{ {
@ -87,6 +88,7 @@ int main(void) {
.rotation = {0}, .rotation = {0},
.position = (vec3f_t){1.7f, 1.5f, 7.0f}, .position = (vec3f_t){1.7f, 1.5f, 7.0f},
}, },
},
}; };
mat3x4f_t proj_matrix = { mat3x4f_t proj_matrix = {
@ -94,10 +96,13 @@ int main(void) {
(vec4f_t){0.0f, viewport.z * window.height / viewport.y, 0.0f, 0.0f}, (vec4f_t){0.0f, viewport.z * window.height / viewport.y, 0.0f, 0.0f},
(vec4f_t){0.0f, 0.0f, 1.0f, 0.0f}, (vec4f_t){0.0f, 0.0f, 1.0f, 0.0f},
}; };
mat4x4f_t cam_inverse_rotation = {0};
mat4x4f_t cam_inverse_translation = {0}; rasteriser_scene_t scene = {
mat4x4f_t cam_matrix = {0}; .instance_count = ARR_LEN(instances),
mat3x4f_t proj_cam_matrix = {0}; .instances = instances,
.camera = &camera,
.proj_matrix = &proj_matrix,
};
bool running = true; bool running = true;
SDL_Event event = {0}; SDL_Event event = {0};
@ -134,15 +139,9 @@ int main(void) {
} }
} }
cam_inverse_rotation = inverse_camera_rotation_matrix(&camera);
cam_inverse_translation = inverse_camera_translation_matrix(&camera);
cam_matrix = mul_mat4x4f(cam_inverse_rotation, cam_inverse_translation);
proj_cam_matrix = mul_mat3x4f_by_mat4x4f(proj_matrix, cam_matrix);
clear_window(&window, bg); clear_window(&window, bg);
render_instance(&window, arena, proj_cam_matrix, &cube_01); render_scene(&window, arena, &scene);
render_instance(&window, arena, proj_cam_matrix, &cube_02);
swap_buffers(&window); swap_buffers(&window);

View File

@ -14,6 +14,22 @@
internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1); internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1);
internal inline void order_triangle_points(triangle_t *triangle); internal inline void order_triangle_points(triangle_t *triangle);
void render_scene(window_t *wnd, Arena *arena,
const rasteriser_scene_t *scene) {
mat4x4f_t cam_inverse_rotation =
inverse_camera_rotation_matrix(scene->camera);
mat4x4f_t cam_inverse_translation =
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]));
}
}
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat, void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
const instance_t *instance) { const instance_t *instance) {
list_vec2i_t *projected = list_create_with_capacity( list_vec2i_t *projected = list_create_with_capacity(