From 56fbde696f25fda0ad871cd389d9e8cd3a49c083 Mon Sep 17 00:00:00 2001
From: Abdelrahman <said.abdelrahman89@gmail.com>
Date: Sat, 14 Sep 2024 02:58:48 +0100
Subject: [PATCH] Remove U8Image and start implementing shadow render pass

---
 src/img/img.c             |  4 ++--
 src/img/img.h             |  8 +++-----
 src/main.c                | 14 ++++++++------
 src/model/render.c        |  9 +--------
 src/model/render.h        |  1 -
 src/shader/depth_shader.c |  1 -
 6 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/src/img/img.c b/src/img/img.c
index 670b0fc..51a63f1 100644
--- a/src/img/img.c
+++ b/src/img/img.c
@@ -47,7 +47,7 @@ void _clear_buffer(Buffer *buffer, void *value, u64 base_size) {
   }
 }
 
-void draw_line(U8Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour) {
+void draw_line(Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour) {
   u64 dx = absolute((i64)x1 - (i64)x0);
   u64 dy = absolute((i64)y1 - (i64)y0);
   f32 t = 0.0f;
@@ -79,7 +79,7 @@ void draw_line(U8Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour) {
   }
 }
 
-void save_image(const U8Image *img, const char *filename) {
+void save_image(const Image *img, const char *filename) {
   write_p7_image(img->width, img->height, (u8 *)(img->buf), filename);
 }
 
diff --git a/src/img/img.h b/src/img/img.h
index 46bba9f..8bf2d48 100644
--- a/src/img/img.h
+++ b/src/img/img.h
@@ -3,7 +3,6 @@
 
 #include "aliases.h"
 #include "mem_arena.h"
-#include "vec.h"
 #include <stdbool.h>
 
 #define BUF_TYPE(TYPE, NAME)                                                   \
@@ -24,8 +23,7 @@ struct colour {
 };
 
 BUF_TYPE(void, Buffer);
-BUF_TYPE(V4f, Image);
-BUF_TYPE(Colour, U8Image);
+BUF_TYPE(Colour, Image);
 BUF_TYPE(f32, Depth);
 
 #define init_buffer(ARENA, BUF)       (_init_buffer(ARENA, (Buffer *)BUF, BUF_SIZE(BUF)))
@@ -37,7 +35,7 @@ bool _init_buffer(Arena *arena, Buffer *buffer, u64 base_size);
 u8 *_get_pixel(Buffer *buffer, u64 x, u64 y, u64 base_size);
 void _set_pixel(Buffer *buffer, u64 x, u64 y, void *value, u64 base_size);
 void _clear_buffer(Buffer *buffer, void *value, u64 base_size);
-void draw_line(U8Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour);
-void save_image(const U8Image *img, const char *filename);
+void draw_line(Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour);
+void save_image(const Image *img, const char *filename);
 
 #endif // IMG_H
diff --git a/src/main.c b/src/main.c
index 19693fa..ed60d86 100644
--- a/src/main.c
+++ b/src/main.c
@@ -83,8 +83,9 @@ internal i32 tinyrenderer(Arena *arena, TinyArgs args) {
   Colour bg          = {.r = 42, .g = 45,  .b = 52,  .a = 255};
   Colour main_colour = {.r = 14, .g = 156, .b = 208, .a = 255};
 
-  Render render;
-  if (!init_render(arena, &render, IMAGE_DIMENSION, IMAGE_DIMENSION)) {
+  Render shadowbuffer, framebuffer;
+  if (!init_render(arena, &shadowbuffer, IMAGE_DIMENSION, IMAGE_DIMENSION) ||
+      !init_render(arena, &framebuffer, IMAGE_DIMENSION, IMAGE_DIMENSION)) {
     return TINY_EXIT_RENDER_INIT_FAILED;
   }
 
@@ -98,11 +99,12 @@ internal i32 tinyrenderer(Arena *arena, TinyArgs args) {
 
   load_shaders(viewport(0, 0, IMAGE_DIMENSION, IMAGE_DIMENSION));
 
-  clear_buffer(&(render.output), &bg);
+  clear_buffer(&(framebuffer.img), &bg);
 
-  // render_model(&obj, &shadow, depth, RENDER_TYPE_SHADED, main_colour);
-  render_model(&obj, &render, perspective_diffuse, RENDER_TYPE_SHADED, main_colour);
-  save_image(&(render.output), "result.pam");
+  render_model(&obj, &shadowbuffer, depth, RENDER_TYPE_SHADED, main_colour);
+  render_model(&obj, &framebuffer, perspective_diffuse, RENDER_TYPE_SHADED, main_colour);
+
+  save_image(&(framebuffer.img), "result.pam");
 
   return TINY_EXIT_SUCCESS;
 }
diff --git a/src/model/render.c b/src/model/render.c
index c66172e..d8a78d6 100644
--- a/src/model/render.c
+++ b/src/model/render.c
@@ -31,11 +31,6 @@ bool init_render(Arena *arena, Render *render, u64 width, u64 height) {
     return false;
   }
 
-  render->output = (U8Image){.width = width, .height = height};
-  if (!init_buffer(arena, &(render->output))) {
-    return false;
-  }
-
   render->depth = (Depth){.width = width, .height = height};
   if (!init_buffer(arena, &(render->depth))) {
     return false;
@@ -85,7 +80,6 @@ internal void render_triangle(const Triangle *triangle, const Model *model, Shad
 internal void fill_triangle(Render *render, ShaderID shader, VertexData vertices[TRIANGLE_VERTICES],
                             Colour colour, const Model *model, RenderType type) {
   Image   *img   = &(render->img);
-  U8Image *out   = &(render->output);
   Depth   *depth = &(render->depth);
 
   V2f vp_verts[TRIANGLE_VERTICES] = {0};
@@ -137,8 +131,7 @@ internal void fill_triangle(Render *render, ShaderID shader, VertexData vertices
       };
 
       set_pixel(depth, x, y, &z);
-      set_pixel(img, x, y, &result.colour);
-      set_pixel(out, x, y, &output_colour);
+      set_pixel(img, x, y, &output_colour);
     }
   }
 }
diff --git a/src/model/render.h b/src/model/render.h
index ac67f45..478bd8a 100644
--- a/src/model/render.h
+++ b/src/model/render.h
@@ -25,7 +25,6 @@ typedef enum {
 typedef struct render Render;
 struct render {
   Image img;
-  U8Image output;
   Depth depth;
 };
 
diff --git a/src/shader/depth_shader.c b/src/shader/depth_shader.c
index 19a02cc..1facff6 100644
--- a/src/shader/depth_shader.c
+++ b/src/shader/depth_shader.c
@@ -1,5 +1,4 @@
 #include "depth_shader.h"
-#include "constants.h"
 #include "shader.h"
 
 VertexData depth_shader_vertex(void *shader, const VertexData *vert, u8 index, const Model *model) {