Image type uses V4f and add U8Image type
This commit is contained in:
		| @@ -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); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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; | ||||||
| @@ -80,6 +85,7 @@ 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); | ||||||
|  |   U8Image *out   = &(render->output); | ||||||
|   Depth   *depth = &(render->depth); |   Depth   *depth = &(render->depth); | ||||||
|  |  | ||||||
|   V2f vp_verts[TRIANGLE_VERTICES] = {0}; |   V2f vp_verts[TRIANGLE_VERTICES] = {0}; | ||||||
| @@ -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); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user