From 5d61e8a61665e084f201d5cbf3cdc4cbf0e346a4 Mon Sep 17 00:00:00 2001
From: Abdelrahman <said.abdelrahman89@gmail.com>
Date: Sat, 13 Jul 2024 22:43:00 +0100
Subject: [PATCH] Add wireframe and solid render types

---
 include/rasteriser/rasteriser.h |  8 +++++++-
 src/rasteriser/main.c           |  2 +-
 src/rasteriser/rasteriser.c     | 19 +++++++++++++------
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h
index 34d9998..44d3840 100644
--- a/include/rasteriser/rasteriser.h
+++ b/include/rasteriser/rasteriser.h
@@ -29,6 +29,11 @@ MAKE_LIST_TYPE(vec4f_t);
 MAKE_LIST_TYPE(vertex_t);
 MAKE_LIST_TYPE(scene_triangle_t);
 
+typedef enum {
+  RASTERISER_RENDER_WIREFRAME,
+  RASTERISER_RENDER_SOLID,
+} render_type_t;
+
 typedef struct {
   vec2i_t p0;
   vec2i_t p1;
@@ -80,7 +85,8 @@ typedef struct {
   clipping_plane_t planes[CLIPPING_PLANE_COUNT];
 } 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,
+                  render_type_t type);
 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);
diff --git a/src/rasteriser/main.c b/src/rasteriser/main.c
index 7b1d1e5..feb9b39 100644
--- a/src/rasteriser/main.c
+++ b/src/rasteriser/main.c
@@ -181,7 +181,7 @@ int main(void) {
 
     clear_window(&window, bg);
 
-    render_scene(&window, frame_arena, &scene);
+    render_scene(&window, frame_arena, &scene, RASTERISER_RENDER_WIREFRAME);
 
     swap_buffers(&window);
 
diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c
index 3f83e8c..f0a7b72 100644
--- a/src/rasteriser/rasteriser.c
+++ b/src/rasteriser/rasteriser.c
@@ -19,7 +19,7 @@ typedef struct {
 internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
                               Arena *arena, mat4x4f_t camera_matrix,
                               mat3x4f_t projection_matrix,
-                              const instance_t *instance);
+                              const instance_t *instance, render_type_t type);
 internal void clip_instance(Arena *arena, model_t *model,
                             const rasteriser_scene_t *scene);
 internal void clip_instance_against_plane(Arena *arena, model_t *model,
@@ -42,8 +42,8 @@ internal inline void copy_triangles(Arena *arena, list_scene_triangle_t *dst,
 internal inline f32 signed_distance(const vec3f_t *vertex,
                                     const clipping_plane_t *plane);
 
-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,
+                  render_type_t type) {
   mat4x4f_t cam_inverse_rotation =
       inverse_camera_rotation_matrix(scene->camera);
   mat4x4f_t cam_inverse_translation =
@@ -53,14 +53,14 @@ void render_scene(window_t *wnd, Arena *arena,
 
   for (u64 i = 0; i < scene->instance_count; ++i) {
     render_instance(wnd, scene, arena, cam_matrix, *(scene->proj_matrix),
-                    &(scene->instances[i]));
+                    &(scene->instances[i]), type);
   }
 }
 
 internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
                               Arena *arena, mat4x4f_t camera_matrix,
                               mat3x4f_t projection_matrix,
-                              const instance_t *instance) {
+                              const instance_t *instance, render_type_t type) {
   list_vertex_t *transformed = list_create_with_capacity(
       vertex_t, arena,
       (instance->model->vertices->count + 10) * sizeof(vertex_t));
@@ -139,7 +139,14 @@ internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
       continue;
     }
 
-    draw_wireframe_triangle(wnd, arena, tri);
+    switch (type) {
+    case RASTERISER_RENDER_WIREFRAME:
+      draw_wireframe_triangle(wnd, arena, tri);
+      break;
+    case RASTERISER_RENDER_SOLID:
+      draw_filled_triangle(wnd, arena, tri);
+      break;
+    }
   }
 }