Refactor to add render types
This commit is contained in:
parent
c2adf07a1d
commit
3f04b7b5b0
@ -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);
|
||||
|
46
src/obj.c
46
src/obj.c
@ -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,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) {
|
||||
}
|
||||
}
|
||||
|
||||
|
10
src/obj.h
10
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
|
||||
|
Loading…
Reference in New Issue
Block a user