From 3f04b7b5b0719e783158070c0f700527a1eb473d Mon Sep 17 00:00:00 2001
From: Abdelrahman <said.abdelrahman89@gmail.com>
Date: Sun, 28 Jul 2024 20:10:59 +0100
Subject: [PATCH] Refactor to add render types

---
 src/main.c |  4 ++--
 src/obj.c  | 46 +++++++++++++++++++++++++++++-----------------
 src/obj.h  | 10 +++++++++-
 3 files changed, 40 insertions(+), 20 deletions(-)

diff --git a/src/main.c b/src/main.c
index 992f465..7997046 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,7 +21,7 @@ int main(void) {
   }
 
   Colour bg = {.r = 42, .g = 45, .b = 52, .a = 255};
-  Colour wireframe = {.r = 242, .g = 100, .b = 48, .a = 255};
+  Colour orange = {.r = 242, .g = 100, .b = 48, .a = 255};
   Image img = {.width = 1200, .height = 1200};
   if (!init_image(arena, &img)) {
     return TINY_EXIT_IMAGE_INIT_FAILED;
@@ -33,7 +33,7 @@ int main(void) {
   }
 
   clear_image(&img, bg);
-  render_wireframe_model(&model, &img, wireframe);
+  render_model(&model, &img, orange, RENDER_TYPE_WIREFRAME);
   save_image(&img, "result.pam");
 
   wapp_mem_arena_destroy(&arena);
diff --git a/src/obj.c b/src/obj.c
index 8b7c92c..21b4276 100644
--- a/src/obj.c
+++ b/src/obj.c
@@ -6,9 +6,18 @@
 #include "utils.h"
 #include <stdio.h>
 
-internal void render_wireframe_triangle(const Triangle *triangle,
-                                        const Model *model, Image *img,
-                                        Colour colour);
+#define TRIANGLE_VERTICES 3
+
+typedef struct triangle_bbox TriangleBBox;
+struct triangle_bbox {
+  u64 x0;
+  u64 y0;
+  u64 x1;
+  u64 y1;
+};
+
+internal void render_triangle(const Triangle *triangle, const Model *model,
+                              Image *img, Colour colour, RenderType type);
 internal void get_image_coordinates(const Vertex *vertex, const Image *img,
                                     u64 *x, u64 *y);
 internal u64 ndc_to_image_coordinate(f32 value, u64 max);
@@ -62,34 +71,37 @@ Model load_obj_file(Arena *arena, const char *filename) {
   return model;
 }
 
-void render_wireframe_model(const Model *model, Image *img, Colour colour) {
+void render_model(const Model *model, Image *img, Colour colour,
+                  RenderType type) {
   Triangle triangle;
 
   for (u64 i = 0; i < model->triangles->count; ++i) {
     triangle = list_get(model->triangles, i);
-    render_wireframe_triangle(&triangle, model, img, colour);
+    render_triangle(&triangle, model, img, colour, type);
   }
 }
 
-internal void render_wireframe_triangle(const Triangle *triangle,
-                                        const Model *model, Image *img,
-                                        Colour colour) {
-  Vertex vertices[3] = {
+internal void render_triangle(const Triangle *triangle, const Model *model,
+                              Image *img, Colour colour, RenderType type) {
+  Vertex vertices[TRIANGLE_VERTICES] = {
       list_get(model->vertices, triangle->p0),
       list_get(model->vertices, triangle->p1),
       list_get(model->vertices, triangle->p2),
   };
 
-  Vertex v0, v1;
-  u64 x0, y0, x1, y1;
-  for (u64 i = 0; i < 3; ++i) {
-    v0 = vertices[i];
-    v1 = vertices[(i + 1) % 3];
+  if (type == RENDER_TYPE_WIREFRAME) {
+    Vertex v0, v1;
+    u64 x0, y0, x1, y1;
+    for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) {
+      v0 = vertices[i];
+      v1 = vertices[(i + 1) % TRIANGLE_VERTICES];
 
-    get_image_coordinates(&v0, img, &x0, &y0);
-    get_image_coordinates(&v1, img, &x1, &y1);
+      get_image_coordinates(&v0, img, &x0, &y0);
+      get_image_coordinates(&v1, img, &x1, &y1);
 
-    draw_line(img, x0, y0, x1, y1, colour);
+      draw_line(img, x0, y0, x1, y1, colour);
+    }
+  } else if (type == RENDER_TYPE_FILLED) {
   }
 }
 
diff --git a/src/obj.h b/src/obj.h
index 80035f2..2638e09 100644
--- a/src/obj.h
+++ b/src/obj.h
@@ -23,6 +23,13 @@ struct triangle {
   u64 p2;
 };
 
+typedef enum {
+  RENDER_TYPE_WIREFRAME,
+  RENDER_TYPE_FILLED,
+
+  COUNT_RENDER_TYPES,
+} RenderType;
+
 MAKE_LIST_TYPE(Vertex);
 MAKE_LIST_TYPE(Triangle);
 
@@ -33,6 +40,7 @@ struct model {
 };
 
 Model load_obj_file(Arena *arena, const char *filename);
-void render_wireframe_model(const Model *model, Image *img, Colour colour);
+void render_model(const Model *model, Image *img, Colour colour,
+                  RenderType type);
 
 #endif // OBJ_H