Compare commits

...

2 Commits

2 changed files with 42 additions and 5 deletions

View File

@ -12,6 +12,7 @@
#include <string.h> #include <string.h>
#define TRIANGLE_VERTICES 3 #define TRIANGLE_VERTICES 3
#define CAMERA_DISTANCE 5.0f
#define V2(T, ELEM_T, X0, Y0, X1, Y1) \ #define V2(T, ELEM_T, X0, Y0, X1, Y1) \
((T){(ELEM_T)X1 - (ELEM_T)X0, (ELEM_T)Y1 - (ELEM_T)Y0}) ((T){(ELEM_T)X1 - (ELEM_T)X0, (ELEM_T)Y1 - (ELEM_T)Y0})
@ -62,6 +63,14 @@ struct f32x3 {
f32 z; f32 z;
}; };
typedef struct f32x4 V4f;
struct f32x4 {
f32 x;
f32 y;
f32 z;
f32 w;
};
typedef struct u64x3 V3u; typedef struct u64x3 V3u;
struct u64x3 { struct u64x3 {
u64 x; u64 x;
@ -76,8 +85,17 @@ struct f32_3x3 {
V3f row2; V3f row2;
}; };
typedef struct f32_4x4 M4x4f;
struct f32_4x4 {
V4f row0;
V4f row1;
V4f row2;
V4f row3;
};
internal void render_triangle(const Triangle *triangle, const Model *model, internal void render_triangle(const Triangle *triangle, const Model *model,
Render *render, Colour colour, RenderType type); Render *render, Colour colour, RenderType type,
ProjectionType projection);
internal void fill_triangle(Render *render, Vertex vertices[TRIANGLE_VERTICES], internal void fill_triangle(Render *render, Vertex vertices[TRIANGLE_VERTICES],
TexCoord coordinates[TRIANGLE_VERTICES], TexCoord coordinates[TRIANGLE_VERTICES],
Colour colour, f32 intensity, Image *texture); Colour colour, f32 intensity, Image *texture);
@ -94,6 +112,15 @@ internal u64 ndc_to_image_coordinate(f32 value, u64 max);
V3f g_light_dir = {0.0f, 0.0f, -1.0f}; V3f g_light_dir = {0.0f, 0.0f, -1.0f};
// clang-format off
M4x4f g_cam_matrix = {
.row0 = {1.0f, 0.0f, 0.0f, 0.0f},
.row1 = {0.0f, 1.0f, 0.0f, 0.0f},
.row2 = {0.0f, 0.0f, 1.0f, 0.0f},
.row3 = {0.0f, 0.0f, -1.0f / CAMERA_DISTANCE, 1.0f},
};
// clang-format on
Model load_obj_file(Arena *arena, const char *filename, const char *texture) { Model load_obj_file(Arena *arena, const char *filename, const char *texture) {
if (!arena) { if (!arena) {
return NULL_MODEL; return NULL_MODEL;
@ -177,7 +204,8 @@ bool init_render(Arena *arena, Render *render, u64 width, u64 height) {
} }
void render_model(const Model *model, Render *render, Colour colour, void render_model(const Model *model, Render *render, Colour colour,
RenderType type, ColourType colour_type) { RenderType type, ColourType colour_type,
ProjectionType projection) {
Triangle triangle; Triangle triangle;
for (u64 i = 0; i < model->triangles->count; ++i) { for (u64 i = 0; i < model->triangles->count; ++i) {
@ -188,12 +216,13 @@ void render_model(const Model *model, Render *render, Colour colour,
.b = rand() % UINT8_MAX, .b = rand() % UINT8_MAX,
.a = 255}; .a = 255};
} }
render_triangle(&triangle, model, render, colour, type); render_triangle(&triangle, model, render, colour, type, projection);
} }
} }
internal void render_triangle(const Triangle *triangle, const Model *model, internal void render_triangle(const Triangle *triangle, const Model *model,
Render *render, Colour colour, RenderType type) { Render *render, Colour colour, RenderType type,
ProjectionType projection) {
Image *img = &(render->img); Image *img = &(render->img);
Vertex vertices[TRIANGLE_VERTICES] = { Vertex vertices[TRIANGLE_VERTICES] = {
list_get(model->vertices, triangle->p0), list_get(model->vertices, triangle->p0),

View File

@ -47,6 +47,13 @@ typedef enum {
COUNT_COLOUR_TYPE, COUNT_COLOUR_TYPE,
} ColourType; } ColourType;
typedef enum {
PROJECTION_TYPE_ORTHOGRAPHIC,
PROJECTION_TYPE_PERSPECTIVE,
COUNT_PROJECTION_TYPE,
} ProjectionType;
MAKE_LIST_TYPE(Vertex); MAKE_LIST_TYPE(Vertex);
MAKE_LIST_TYPE(TexCoord); MAKE_LIST_TYPE(TexCoord);
MAKE_LIST_TYPE(Triangle); MAKE_LIST_TYPE(Triangle);
@ -68,6 +75,7 @@ struct render {
Model load_obj_file(Arena *arena, const char *filename, const char *texture); Model load_obj_file(Arena *arena, const char *filename, const char *texture);
bool init_render(Arena *arena, Render *render, u64 width, u64 height); bool init_render(Arena *arena, Render *render, u64 width, u64 height);
void render_model(const Model *model, Render *render, Colour colour, void render_model(const Model *model, Render *render, Colour colour,
RenderType type, ColourType colour_type); RenderType type, ColourType colour_type,
ProjectionType projection);
#endif // OBJ_H #endif // OBJ_H