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(