Switch to using transformation matrices

This commit is contained in:
2024-06-30 02:40:04 +01:00
parent 9ba7a8c414
commit b81304e759
7 changed files with 282 additions and 96 deletions

View File

@@ -9,7 +9,7 @@ typedef struct {
vec3f_t rotation;
} camera_t;
vec2i_t project_point(vec3f_t point, const window_t *wnd,
const camera_t *camera, vec3f_t viewport);
mat4x4f_t inverse_camera_translation_matrix(const camera_t *camera);
mat4x4f_t inverse_camera_rotation_matrix(const camera_t *camera);
#endif // !CAMERA_H

View File

@@ -41,12 +41,18 @@ typedef struct {
} model_t;
typedef struct {
model_t *model;
f32 scale;
vec3f_t rotation;
vec3f_t position;
} transform_t;
typedef struct {
model_t *model;
transform_t transform;
} instance_t;
void render_instance(window_t *wnd, Arena *arena, const camera_t *camera,
vec3f_t viewport, const instance_t *instance_t);
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
const instance_t *instance);
void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
void draw_filled_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
void draw_shaded_triangle(window_t *wnd, Arena *arena, triangle_t triangle);

View File

@@ -39,6 +39,25 @@ typedef struct {
f32 w;
} vec4f_t;
typedef struct {
vec3f_t row0;
vec3f_t row1;
vec3f_t row2;
} mat3x3f_t;
typedef struct {
vec4f_t row0;
vec4f_t row1;
vec4f_t row2;
} mat3x4f_t;
typedef struct {
vec4f_t row0;
vec4f_t row1;
vec4f_t row2;
vec4f_t row3;
} mat4x4f_t;
#define vec_add(T, v1, v2) vec_add_##T(v1, v2)
#define vec_sub(T, v1, v2) vec_sub_##T(v1, v2)
#define vec_mul(T, v1, v2) vec_mul_##T(v1, v2)
@@ -103,4 +122,12 @@ f32 vec_dot_vec4f_t(vec4f_t v1, vec4f_t v2);
f32 vec_magnitude_vec4f_t(vec4f_t v);
vec4f_t vec_unit_vec4f_t(vec4f_t v);
mat4x4f_t get_translation_matrix(vec3f_t translation);
mat4x4f_t get_rotation_matrix(vec3f_t rotation);
mat4x4f_t get_scaling_matrix(vec3f_t scale);
mat3x3f_t get_rotation_mat3x3f(vec3f_t rotation);
vec3f_t mul_mat3x4f_by_vec4f(mat3x4f_t mat, vec4f_t vec);
mat3x4f_t mul_mat3x4f_by_mat4x4f(mat3x4f_t mat1, mat4x4f_t mat2);
mat4x4f_t mul_mat4x4f(mat4x4f_t mat1, mat4x4f_t mat2);
#endif // !VEC_H