diff --git a/src/main.c b/src/main.c index 992f465..7997046 100644 --- a/src/main.c +++ b/src/main.c @@ -21,7 +21,7 @@ int main(void) { } Colour bg = {.r = 42, .g = 45, .b = 52, .a = 255}; - Colour wireframe = {.r = 242, .g = 100, .b = 48, .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; @@ -33,7 +33,7 @@ int main(void) { } clear_image(&img, bg); - render_wireframe_model(&model, &img, wireframe); + render_model(&model, &img, orange, RENDER_TYPE_WIREFRAME); save_image(&img, "result.pam"); wapp_mem_arena_destroy(&arena); diff --git a/src/obj.c b/src/obj.c index 8b7c92c..21b4276 100644 --- a/src/obj.c +++ b/src/obj.c @@ -6,9 +6,18 @@ #include "utils.h" #include -internal void render_wireframe_triangle(const Triangle *triangle, - const Model *model, Image *img, - Colour colour); +#define TRIANGLE_VERTICES 3 + +typedef struct triangle_bbox TriangleBBox; +struct triangle_bbox { + u64 x0; + u64 y0; + u64 x1; + u64 y1; +}; + +internal void render_triangle(const Triangle *triangle, const Model *model, + Image *img, Colour colour, RenderType type); internal void get_image_coordinates(const Vertex *vertex, const Image *img, u64 *x, u64 *y); internal u64 ndc_to_image_coordinate(f32 value, u64 max); @@ -62,34 +71,37 @@ Model load_obj_file(Arena *arena, const char *filename) { return model; } -void render_wireframe_model(const Model *model, Image *img, Colour colour) { +void render_model(const Model *model, Image *img, Colour colour, + RenderType type) { Triangle triangle; for (u64 i = 0; i < model->triangles->count; ++i) { triangle = list_get(model->triangles, i); - render_wireframe_triangle(&triangle, model, img, colour); + render_triangle(&triangle, model, img, colour, type); } } -internal void render_wireframe_triangle(const Triangle *triangle, - const Model *model, Image *img, - Colour colour) { - Vertex vertices[3] = { +internal void render_triangle(const Triangle *triangle, const Model *model, + Image *img, Colour colour, RenderType type) { + Vertex vertices[TRIANGLE_VERTICES] = { list_get(model->vertices, triangle->p0), list_get(model->vertices, triangle->p1), list_get(model->vertices, triangle->p2), }; - Vertex v0, v1; - u64 x0, y0, x1, y1; - for (u64 i = 0; i < 3; ++i) { - v0 = vertices[i]; - v1 = vertices[(i + 1) % 3]; + if (type == RENDER_TYPE_WIREFRAME) { + Vertex v0, v1; + u64 x0, y0, x1, y1; + for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) { + v0 = vertices[i]; + v1 = vertices[(i + 1) % TRIANGLE_VERTICES]; - get_image_coordinates(&v0, img, &x0, &y0); - get_image_coordinates(&v1, img, &x1, &y1); + get_image_coordinates(&v0, img, &x0, &y0); + get_image_coordinates(&v1, img, &x1, &y1); - draw_line(img, x0, y0, x1, y1, colour); + draw_line(img, x0, y0, x1, y1, colour); + } + } else if (type == RENDER_TYPE_FILLED) { } } diff --git a/src/obj.h b/src/obj.h index 80035f2..2638e09 100644 --- a/src/obj.h +++ b/src/obj.h @@ -23,6 +23,13 @@ struct triangle { u64 p2; }; +typedef enum { + RENDER_TYPE_WIREFRAME, + RENDER_TYPE_FILLED, + + COUNT_RENDER_TYPES, +} RenderType; + MAKE_LIST_TYPE(Vertex); MAKE_LIST_TYPE(Triangle); @@ -33,6 +40,7 @@ struct model { }; Model load_obj_file(Arena *arena, const char *filename); -void render_wireframe_model(const Model *model, Image *img, Colour colour); +void render_model(const Model *model, Image *img, Colour colour, + RenderType type); #endif // OBJ_H