Image type uses V4f and add U8Image type

This commit is contained in:
Abdelrahman Said 2024-09-14 02:46:07 +01:00
parent 66ca20ee5b
commit 88e9d3550a
5 changed files with 21 additions and 11 deletions

View File

@ -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 dx = absolute((i64)x1 - (i64)x0);
u64 dy = absolute((i64)y1 - (i64)y0); u64 dy = absolute((i64)y1 - (i64)y0);
f32 t = 0.0f; 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); write_p7_image(img->width, img->height, (u8 *)(img->buf), filename);
} }

View File

@ -3,6 +3,7 @@
#include "aliases.h" #include "aliases.h"
#include "mem_arena.h" #include "mem_arena.h"
#include "vec.h"
#include <stdbool.h> #include <stdbool.h>
#define BUF_TYPE(TYPE, NAME) \ #define BUF_TYPE(TYPE, NAME) \
@ -23,7 +24,8 @@ struct colour {
}; };
BUF_TYPE(void, Buffer); BUF_TYPE(void, Buffer);
BUF_TYPE(Colour, Image); BUF_TYPE(V4f, Image);
BUF_TYPE(Colour, U8Image);
BUF_TYPE(f32, Depth); BUF_TYPE(f32, Depth);
#define init_buffer(ARENA, BUF) (_init_buffer(ARENA, (Buffer *)BUF, BUF_SIZE(BUF))) #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); 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 _set_pixel(Buffer *buffer, u64 x, u64 y, void *value, u64 base_size);
void _clear_buffer(Buffer *buffer, 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 draw_line(U8Image *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);
#endif // IMG_H #endif // IMG_H

View File

@ -98,11 +98,11 @@ internal i32 tinyrenderer(Arena *arena, TinyArgs args) {
load_shaders(viewport(0, 0, IMAGE_DIMENSION, IMAGE_DIMENSION)); 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); 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; return TINY_EXIT_SUCCESS;
} }

View File

@ -31,6 +31,11 @@ bool init_render(Arena *arena, Render *render, u64 width, u64 height) {
return false; return false;
} }
render->output = (U8Image){.width = width, .height = height};
if (!init_buffer(arena, &(render->output))) {
return false;
}
render->depth = (Depth){.width = width, .height = height}; render->depth = (Depth){.width = width, .height = height};
if (!init_buffer(arena, &(render->depth))) { if (!init_buffer(arena, &(render->depth))) {
return false; 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], internal void fill_triangle(Render *render, ShaderID shader, VertexData vertices[TRIANGLE_VERTICES],
Colour colour, const Model *model, RenderType type) { Colour colour, const Model *model, RenderType type) {
Image *img = &(render->img); Image *img = &(render->img);
Depth *depth = &(render->depth); U8Image *out = &(render->output);
Depth *depth = &(render->depth);
V2f vp_verts[TRIANGLE_VERTICES] = {0}; V2f vp_verts[TRIANGLE_VERTICES] = {0};
for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) { 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(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);
} }
} }
} }

View File

@ -25,6 +25,7 @@ typedef enum {
typedef struct render Render; typedef struct render Render;
struct render { struct render {
Image img; Image img;
U8Image output;
Depth depth; Depth depth;
}; };