Switch to using transformation matrices
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
#include "list/typed_list.h"
|
||||
#include "mem_arena.h"
|
||||
#include "mem_utils.h"
|
||||
#include "misc/misc_utils.h"
|
||||
#include "rasteriser/rasteriser.h"
|
||||
#include "vector/vec.h"
|
||||
#include "window/window.h"
|
||||
@@ -36,50 +37,67 @@ int main(void) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
// Vertices
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){1, 1, 1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, 1, 1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, -1, 1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){1, -1, 1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){1, 1, -1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, 1, -1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, -1, -1}));
|
||||
list_append(vec3f_t, arena, vertices, ((vec3f_t){1, -1, -1}));
|
||||
vec3f_t verts[] = {
|
||||
(vec3f_t){1, 1, 1}, (vec3f_t){-1, 1, 1}, (vec3f_t){-1, -1, 1},
|
||||
(vec3f_t){1, -1, 1}, (vec3f_t){1, 1, -1}, (vec3f_t){-1, 1, -1},
|
||||
(vec3f_t){-1, -1, -1}, (vec3f_t){1, -1, -1},
|
||||
};
|
||||
for (u64 i = 0; i < ARR_LEN(verts); ++i) {
|
||||
list_append(vec3f_t, arena, vertices, verts[i]);
|
||||
}
|
||||
|
||||
list_scene_triangle_t *triangles = list_create(scene_triangle_t, arena);
|
||||
if (!triangles) {
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
// Triangles
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){0, 1, 2, (colour_t){.colour = 0xff0000ff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){0, 2, 3, (colour_t){.colour = 0xff0000ff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){4, 0, 3, (colour_t){.colour = 0x00ff00ff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){4, 3, 7, (colour_t){.colour = 0x00ff00ff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){5, 4, 7, (colour_t){.colour = 0x0000ffff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){5, 7, 6, (colour_t){.colour = 0x0000ffff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){1, 5, 6, (colour_t){.colour = 0xffff00ff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){1, 6, 2, (colour_t){.colour = 0xffff00ff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){4, 5, 1, (colour_t){.colour = 0xff00ffff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){4, 1, 0, (colour_t){.colour = 0xff00ffff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){2, 6, 7, (colour_t){.colour = 0x00ffffff}}));
|
||||
list_append(scene_triangle_t, arena, triangles,
|
||||
((scene_triangle_t){2, 7, 3, (colour_t){.colour = 0x00ffffff}}));
|
||||
scene_triangle_t tris[] = {
|
||||
(scene_triangle_t){0, 1, 2, (colour_t){.colour = 0xff0000ff}},
|
||||
(scene_triangle_t){0, 2, 3, (colour_t){.colour = 0xff0000ff}},
|
||||
(scene_triangle_t){4, 0, 3, (colour_t){.colour = 0x00ff00ff}},
|
||||
(scene_triangle_t){4, 3, 7, (colour_t){.colour = 0x00ff00ff}},
|
||||
(scene_triangle_t){5, 4, 7, (colour_t){.colour = 0x0000ffff}},
|
||||
(scene_triangle_t){5, 7, 6, (colour_t){.colour = 0x0000ffff}},
|
||||
(scene_triangle_t){1, 5, 6, (colour_t){.colour = 0xffff00ff}},
|
||||
(scene_triangle_t){1, 6, 2, (colour_t){.colour = 0xffff00ff}},
|
||||
(scene_triangle_t){4, 5, 1, (colour_t){.colour = 0xff00ffff}},
|
||||
(scene_triangle_t){4, 1, 0, (colour_t){.colour = 0xff00ffff}},
|
||||
(scene_triangle_t){2, 6, 7, (colour_t){.colour = 0x00ffffff}},
|
||||
(scene_triangle_t){2, 7, 3, (colour_t){.colour = 0x00ffffff}},
|
||||
};
|
||||
for (u64 i = 0; i < ARR_LEN(tris); ++i) {
|
||||
list_append(scene_triangle_t, arena, triangles, tris[i]);
|
||||
}
|
||||
|
||||
model_t cube = {.vertices = vertices, .triangles = triangles};
|
||||
instance_t cube_01 = {.model = &cube,
|
||||
.position = (vec3f_t){-1.5f, 0.0f, 8.0f}};
|
||||
instance_t cube_02 = {.model = &cube,
|
||||
.position = (vec3f_t){1.7f, 1.5f, 7.0f}};
|
||||
instance_t cube_01 = {
|
||||
.model = &cube,
|
||||
.transform =
|
||||
{
|
||||
.scale = 1.0f,
|
||||
.rotation = (vec3f_t){0},
|
||||
.position = (vec3f_t){-1.5f, 0.0f, 8.0f},
|
||||
},
|
||||
};
|
||||
instance_t cube_02 = {
|
||||
.model = &cube,
|
||||
.transform =
|
||||
{
|
||||
.scale = 1.0f,
|
||||
.rotation = {0},
|
||||
.position = (vec3f_t){1.7f, 1.5f, 7.0f},
|
||||
},
|
||||
};
|
||||
|
||||
mat3x4f_t proj_matrix = {
|
||||
(vec4f_t){viewport.z * window.width / viewport.x, 0.0f, 0.0f, 0.0f},
|
||||
(vec4f_t){0.0f, viewport.z * window.height / viewport.y, 0.0f, 0.0f},
|
||||
(vec4f_t){0.0f, 0.0f, 1.0f, 0.0f},
|
||||
};
|
||||
mat4x4f_t cam_inverse_rotation = {0};
|
||||
mat4x4f_t cam_inverse_translation = {0};
|
||||
mat4x4f_t cam_matrix = {0};
|
||||
mat3x4f_t proj_cam_matrix = {0};
|
||||
|
||||
bool running = true;
|
||||
SDL_Event event = {0};
|
||||
@@ -105,10 +123,15 @@ int main(void) {
|
||||
}
|
||||
}
|
||||
|
||||
cam_inverse_rotation = inverse_camera_rotation_matrix(&camera);
|
||||
cam_inverse_translation = inverse_camera_translation_matrix(&camera);
|
||||
cam_matrix = mul_mat4x4f(cam_inverse_rotation, cam_inverse_translation);
|
||||
proj_cam_matrix = mul_mat3x4f_by_mat4x4f(proj_matrix, cam_matrix);
|
||||
|
||||
clear_window(&window, bg);
|
||||
|
||||
render_instance(&window, arena, &camera, viewport, &cube_01);
|
||||
render_instance(&window, arena, &camera, viewport, &cube_02);
|
||||
render_instance(&window, arena, proj_cam_matrix, &cube_01);
|
||||
render_instance(&window, arena, proj_cam_matrix, &cube_02);
|
||||
|
||||
swap_buffers(&window);
|
||||
|
||||
|
||||
@@ -12,23 +12,34 @@
|
||||
#include <sys/mman.h>
|
||||
|
||||
internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1);
|
||||
|
||||
internal inline void order_triangle_points(triangle_t *triangle);
|
||||
|
||||
void render_instance(window_t *wnd, Arena *arena, const camera_t *camera,
|
||||
vec3f_t viewport, const instance_t *instance) {
|
||||
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
|
||||
const instance_t *instance) {
|
||||
list_vec2i_t *projected = list_create_with_capacity(
|
||||
vec2i_t, arena, instance->model->vertices->count * sizeof(vec3f_t));
|
||||
if (!projected) {
|
||||
return;
|
||||
}
|
||||
|
||||
mat4x4f_t t_mat = get_translation_matrix(instance->transform.position);
|
||||
mat4x4f_t r_mat = get_rotation_matrix(instance->transform.rotation);
|
||||
mat4x4f_t s_mat = get_scaling_matrix((vec3f_t){instance->transform.scale,
|
||||
instance->transform.scale,
|
||||
instance->transform.scale});
|
||||
mat4x4f_t tr_mat = mul_mat4x4f(t_mat, r_mat);
|
||||
mat4x4f_t trs_mat = mul_mat4x4f(tr_mat, s_mat);
|
||||
|
||||
mat3x4f_t xf_proj_mat = mul_mat3x4f_by_mat4x4f(proj_cam_mat, trs_mat);
|
||||
|
||||
vec3f_t vertex = {0};
|
||||
vec2i_t point = {0};
|
||||
for (u64 i = 0; i < instance->model->vertices->count; ++i) {
|
||||
vertex = list_get(instance->model->vertices, i);
|
||||
vertex = vec_add(vec3f_t, vertex, instance->position);
|
||||
list_append(vec2i_t, arena, projected,
|
||||
project_point(vertex, wnd, camera, viewport));
|
||||
vertex = mul_mat3x4f_by_vec4f(
|
||||
xf_proj_mat, (vec4f_t){vertex.x, vertex.y, vertex.z, 1.0f});
|
||||
point = (vec2i_t){(i32)(vertex.x / vertex.z), (i32)(vertex.y / vertex.z)};
|
||||
list_append(vec2i_t, arena, projected, point);
|
||||
}
|
||||
|
||||
for (u64 i = 0; i < instance->model->triangles->count; ++i) {
|
||||
|
||||
Reference in New Issue
Block a user