Prep for adding z buffer
This commit is contained in:
parent
5330e2e82c
commit
bce85c5c71
14
src/main.c
14
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);
|
||||
|
||||
|
28
src/obj.c
28
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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user