Prep for adding z buffer

This commit is contained in:
Abdelrahman Said 2024-08-04 14:38:52 +01:00
parent 5330e2e82c
commit bce85c5c71
3 changed files with 36 additions and 15 deletions

View File

@ -10,7 +10,7 @@
enum { enum {
TINY_EXIT_SUCCESS, TINY_EXIT_SUCCESS,
TINY_EXIT_ARENA_INIT_FAILED, TINY_EXIT_ARENA_INIT_FAILED,
TINY_EXIT_IMAGE_INIT_FAILED, TINY_EXIT_RENDER_INIT_FAILED,
TINY_EXIT_MODEL_LOAD_FAILED, TINY_EXIT_MODEL_LOAD_FAILED,
}; };
@ -26,9 +26,9 @@ int main(void) {
Colour bg = {.r = 42, .g = 45, .b = 52, .a = 255}; Colour bg = {.r = 42, .g = 45, .b = 52, .a = 255};
Colour teal = {.r = 14, .g = 156, .b = 208, .a = 255}; Colour teal = {.r = 14, .g = 156, .b = 208, .a = 255};
Colour orange = {.r = 242, .g = 100, .b = 48, .a = 255}; Colour orange = {.r = 242, .g = 100, .b = 48, .a = 255};
Image img = {.width = 1200, .height = 1200}; Render render;
if (!init_image(arena, &img)) { if (!init_render(arena, &render, 1200, 1200)) {
return TINY_EXIT_IMAGE_INIT_FAILED; return TINY_EXIT_RENDER_INIT_FAILED;
} }
Model model = load_obj_file(arena, "resources/head.obj"); Model model = load_obj_file(arena, "resources/head.obj");
@ -36,9 +36,9 @@ int main(void) {
return TINY_EXIT_MODEL_LOAD_FAILED; return TINY_EXIT_MODEL_LOAD_FAILED;
} }
clear_image(&img, bg); clear_image(&(render.img), bg);
render_model(&model, &img, teal, RENDER_TYPE_SHADED, COLOUR_TYPE_FIXED); render_model(&model, &render, teal, RENDER_TYPE_SHADED, COLOUR_TYPE_FIXED);
save_image(&img, "result.pam"); save_image(&(render.img), "result.pam");
wapp_mem_arena_destroy(&arena); wapp_mem_arena_destroy(&arena);

View File

@ -69,8 +69,8 @@ struct f32_3x3 {
}; };
internal void render_triangle(const Triangle *triangle, const Model *model, internal void render_triangle(const Triangle *triangle, const Model *model,
Image *img, Colour colour, RenderType type); Render *render, Colour colour, RenderType type);
internal void fill_triangle(Image *img, Vertex vertices[TRIANGLE_VERTICES], internal void fill_triangle(Render *render, Vertex vertices[TRIANGLE_VERTICES],
Colour colour); Colour colour);
internal TriangleBBox get_triangle_bbox(const Image *img, internal TriangleBBox get_triangle_bbox(const Image *img,
Vertex vertices[TRIANGLE_VERTICES]); Vertex vertices[TRIANGLE_VERTICES]);
@ -132,7 +132,19 @@ Model load_obj_file(Arena *arena, const char *filename) {
return model; 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) { RenderType type, ColourType colour_type) {
Triangle triangle; Triangle triangle;
@ -144,12 +156,13 @@ void render_model(const Model *model, Image *img, Colour colour,
.b = rand() % UINT8_MAX, .b = rand() % UINT8_MAX,
.a = 255}; .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, 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] = { Vertex vertices[TRIANGLE_VERTICES] = {
list_get(model->vertices, triangle->p0), list_get(model->vertices, triangle->p0),
list_get(model->vertices, triangle->p1), list_get(model->vertices, triangle->p1),
@ -188,13 +201,14 @@ internal void render_triangle(const Triangle *triangle, const Model *model,
} }
if (intensity > 0.0f) { 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) { Colour colour) {
Image *img = &(render->img);
TriangleBBox bbox = get_triangle_bbox(img, vertices); TriangleBBox bbox = get_triangle_bbox(img, vertices);
u64 v0x, v0y, v1x, v1y, v2x, v2y; u64 v0x, v0y, v1x, v1y, v2x, v2y;

View File

@ -47,8 +47,15 @@ struct model {
LIST_TYPE(Triangle) * triangles; LIST_TYPE(Triangle) * triangles;
}; };
typedef struct render Render;
struct render {
Image img;
Image zbuf;
};
Model load_obj_file(Arena *arena, const char *filename); 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); RenderType type, ColourType colour_type);
#endif // OBJ_H #endif // OBJ_H