diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h index 36caf6b..e19036d 100644 --- a/include/rasteriser/rasteriser.h +++ b/include/rasteriser/rasteriser.h @@ -51,6 +51,14 @@ typedef struct { transform_t transform; } 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, const instance_t *instance); void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle); diff --git a/src/rasteriser/main.c b/src/rasteriser/main.c index 1e0e726..202cd7e 100644 --- a/src/rasteriser/main.c +++ b/src/rasteriser/main.c @@ -70,23 +70,25 @@ int main(void) { } model_t cube = {.vertices = vertices, .triangles = triangles}; - instance_t cube_01 = { - .model = &cube, - .transform = - { - .scale = 1.0f, - .rotation = (vec3f_t){0}, - .position = (vec3f_t){-1.5f, 0.0f, 8.0f}, - }, - }; - instance_t cube_02 = { - .model = &cube, - .transform = - { - .scale = 1.0f, - .rotation = {0}, - .position = (vec3f_t){1.7f, 1.5f, 7.0f}, - }, + instance_t instances[] = { + (instance_t){ + .model = &cube, + .transform = + { + .scale = 1.0f, + .rotation = (vec3f_t){0}, + .position = (vec3f_t){-1.5f, 0.0f, 8.0f}, + }, + }, + (instance_t){ + .model = &cube, + .transform = + { + .scale = 1.0f, + .rotation = {0}, + .position = (vec3f_t){1.7f, 1.5f, 7.0f}, + }, + }, }; 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, 0.0f, 1.0f, 0.0f}, }; - mat4x4f_t cam_inverse_rotation = {0}; - mat4x4f_t cam_inverse_translation = {0}; - mat4x4f_t cam_matrix = {0}; - mat3x4f_t proj_cam_matrix = {0}; + + rasteriser_scene_t scene = { + .instance_count = ARR_LEN(instances), + .instances = instances, + .camera = &camera, + .proj_matrix = &proj_matrix, + }; bool running = true; 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); - render_instance(&window, arena, proj_cam_matrix, &cube_01); - render_instance(&window, arena, proj_cam_matrix, &cube_02); + render_scene(&window, arena, &scene); swap_buffers(&window); diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 0914fba..4dea514 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -14,6 +14,22 @@ internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1); 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, const instance_t *instance) { list_vec2i_t *projected = list_create_with_capacity(