Refactor to add render types

This commit is contained in:
Abdelrahman Said 2024-07-28 20:10:59 +01:00
parent c2adf07a1d
commit 3f04b7b5b0
3 changed files with 40 additions and 20 deletions

View File

@ -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);

View File

@ -6,9 +6,18 @@
#include "utils.h"
#include <stdio.h>
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,35 +71,38 @@ 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),
};
if (type == RENDER_TYPE_WIREFRAME) {
Vertex v0, v1;
u64 x0, y0, x1, y1;
for (u64 i = 0; i < 3; ++i) {
for (u64 i = 0; i < TRIANGLE_VERTICES; ++i) {
v0 = vertices[i];
v1 = vertices[(i + 1) % 3];
v1 = vertices[(i + 1) % TRIANGLE_VERTICES];
get_image_coordinates(&v0, img, &x0, &y0);
get_image_coordinates(&v1, img, &x1, &y1);
draw_line(img, x0, y0, x1, y1, colour);
}
} else if (type == RENDER_TYPE_FILLED) {
}
}
internal void get_image_coordinates(const Vertex *vertex, const Image *img,

View File

@ -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