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 {
|
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);
|
||||||
|
|
||||||
|
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,
|
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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user