diff --git a/src/img/img.c b/src/img/img.c index 51a63f1..670b0fc 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(Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour) { +void draw_line(U8Image *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(Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour) { } } -void save_image(const Image *img, const char *filename) { +void save_image(const U8Image *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 8bf2d48..46bba9f 100644 --- a/src/img/img.h +++ b/src/img/img.h @@ -3,6 +3,7 @@ #include "aliases.h" #include "mem_arena.h" +#include "vec.h" #include #define BUF_TYPE(TYPE, NAME) \ @@ -23,7 +24,8 @@ struct colour { }; BUF_TYPE(void, Buffer); -BUF_TYPE(Colour, Image); +BUF_TYPE(V4f, Image); +BUF_TYPE(Colour, U8Image); BUF_TYPE(f32, Depth); #define init_buffer(ARENA, BUF) (_init_buffer(ARENA, (Buffer *)BUF, BUF_SIZE(BUF))) @@ -35,7 +37,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(Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour); -void save_image(const Image *img, const char *filename); +void draw_line(U8Image *img, u64 x0, u64 y0, u64 x1, u64 y1, Colour colour); +void save_image(const U8Image *img, const char *filename); #endif // IMG_H diff --git a/src/main.c b/src/main.c index 730bdfa..19693fa 100644 --- a/src/main.c +++ b/src/main.c @@ -98,11 +98,11 @@ internal i32 tinyrenderer(Arena *arena, TinyArgs args) { load_shaders(viewport(0, 0, IMAGE_DIMENSION, IMAGE_DIMENSION)); - clear_buffer(&(render.img), &bg); + clear_buffer(&(render.output), &bg); - // render_model(&obj, &render, depth, RENDER_TYPE_SHADED, main_colour); + // render_model(&obj, &shadow, depth, RENDER_TYPE_SHADED, main_colour); render_model(&obj, &render, perspective_diffuse, RENDER_TYPE_SHADED, main_colour); - save_image(&(render.img), "result.pam"); + save_image(&(render.output), "result.pam"); return TINY_EXIT_SUCCESS; } diff --git a/src/model/render.c b/src/model/render.c index 8b019c1..c66172e 100644 --- a/src/model/render.c +++ b/src/model/render.c @@ -31,6 +31,11 @@ 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; @@ -79,8 +84,9 @@ 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); - Depth *depth = &(render->depth); + Image *img = &(render->img); + U8Image *out = &(render->output); + Depth *depth = &(render->depth); V2f vp_verts[TRIANGLE_VERTICES] = {0}; for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) { @@ -131,7 +137,8 @@ internal void fill_triangle(Render *render, ShaderID shader, VertexData vertices }; set_pixel(depth, x, y, &z); - set_pixel(img, x, y, &output_colour); + set_pixel(img, x, y, &result.colour); + set_pixel(out, x, y, &output_colour); } } } diff --git a/src/model/render.h b/src/model/render.h index 478bd8a..ac67f45 100644 --- a/src/model/render.h +++ b/src/model/render.h @@ -25,6 +25,7 @@ typedef enum { typedef struct render Render; struct render { Image img; + U8Image output; Depth depth; };