From bce85c5c71a8f5159fc116be819a0e089fe8499c Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 4 Aug 2024 14:38:52 +0100 Subject: [PATCH] Prep for adding z buffer --- src/main.c | 14 +++++++------- src/obj.c | 28 +++++++++++++++++++++------- src/obj.h | 9 ++++++++- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/main.c b/src/main.c index b01779d..17c0f66 100644 --- a/src/main.c +++ b/src/main.c @@ -10,7 +10,7 @@ enum { TINY_EXIT_SUCCESS, TINY_EXIT_ARENA_INIT_FAILED, - TINY_EXIT_IMAGE_INIT_FAILED, + TINY_EXIT_RENDER_INIT_FAILED, TINY_EXIT_MODEL_LOAD_FAILED, }; @@ -26,9 +26,9 @@ int main(void) { Colour bg = {.r = 42, .g = 45, .b = 52, .a = 255}; Colour teal = {.r = 14, .g = 156, .b = 208, .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; + Render render; + if (!init_render(arena, &render, 1200, 1200)) { + return TINY_EXIT_RENDER_INIT_FAILED; } Model model = load_obj_file(arena, "resources/head.obj"); @@ -36,9 +36,9 @@ int main(void) { return TINY_EXIT_MODEL_LOAD_FAILED; } - clear_image(&img, bg); - render_model(&model, &img, teal, RENDER_TYPE_SHADED, COLOUR_TYPE_FIXED); - save_image(&img, "result.pam"); + clear_image(&(render.img), bg); + render_model(&model, &render, teal, RENDER_TYPE_SHADED, COLOUR_TYPE_FIXED); + save_image(&(render.img), "result.pam"); wapp_mem_arena_destroy(&arena); diff --git a/src/obj.c b/src/obj.c index 3386b07..246d83c 100644 --- a/src/obj.c +++ b/src/obj.c @@ -69,8 +69,8 @@ struct f32_3x3 { }; internal void render_triangle(const Triangle *triangle, const Model *model, - Image *img, Colour colour, RenderType type); -internal void fill_triangle(Image *img, Vertex vertices[TRIANGLE_VERTICES], + Render *render, Colour colour, RenderType type); +internal void fill_triangle(Render *render, Vertex vertices[TRIANGLE_VERTICES], Colour colour); internal TriangleBBox get_triangle_bbox(const Image *img, Vertex vertices[TRIANGLE_VERTICES]); @@ -132,7 +132,19 @@ Model load_obj_file(Arena *arena, const char *filename) { return model; } -void render_model(const Model *model, Image *img, Colour colour, +bool init_render(Arena *arena, Render *render, u64 width, u64 height) { + render->img = (Image){.width = width, .height = height}; + render->zbuf = (Image){.width = width, .height = height}; + + if (!init_image(arena, &(render->img)) || + !init_image(arena, &(render->zbuf))) { + return false; + } + + return true; +} + +void render_model(const Model *model, Render *render, Colour colour, RenderType type, ColourType colour_type) { Triangle triangle; @@ -144,12 +156,13 @@ void render_model(const Model *model, Image *img, Colour colour, .b = rand() % UINT8_MAX, .a = 255}; } - render_triangle(&triangle, model, img, colour, type); + render_triangle(&triangle, model, render, colour, type); } } internal void render_triangle(const Triangle *triangle, const Model *model, - Image *img, Colour colour, RenderType type) { + Render *render, Colour colour, RenderType type) { + Image *img = &(render->img); Vertex vertices[TRIANGLE_VERTICES] = { list_get(model->vertices, triangle->p0), list_get(model->vertices, triangle->p1), @@ -188,13 +201,14 @@ internal void render_triangle(const Triangle *triangle, const Model *model, } if (intensity > 0.0f) { - fill_triangle(img, vertices, colour); + fill_triangle(render, vertices, colour); } } } -internal void fill_triangle(Image *img, Vertex vertices[TRIANGLE_VERTICES], +internal void fill_triangle(Render *render, Vertex vertices[TRIANGLE_VERTICES], Colour colour) { + Image *img = &(render->img); TriangleBBox bbox = get_triangle_bbox(img, vertices); u64 v0x, v0y, v1x, v1y, v2x, v2y; diff --git a/src/obj.h b/src/obj.h index 6c70ef4..1f07fc3 100644 --- a/src/obj.h +++ b/src/obj.h @@ -47,8 +47,15 @@ struct model { LIST_TYPE(Triangle) * triangles; }; +typedef struct render Render; +struct render { + Image img; + Image zbuf; +}; + Model load_obj_file(Arena *arena, const char *filename); -void render_model(const Model *model, Image *img, Colour colour, +bool init_render(Arena *arena, Render *render, u64 width, u64 height); +void render_model(const Model *model, Render *render, Colour colour, RenderType type, ColourType colour_type); #endif // OBJ_H