Add rasteriser_scene_t struct and render_scene function
This commit is contained in:
parent
39f198e342
commit
b7101108a4
@ -51,6 +51,14 @@ typedef struct {
|
|||||||
transform_t transform;
|
transform_t transform;
|
||||||
} instance_t;
|
} instance_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u64 instance_count;
|
||||||
|
instance_t *instances;
|
||||||
|
camera_t *camera;
|
||||||
|
const mat3x4f_t *proj_matrix;
|
||||||
|
} rasteriser_scene_t;
|
||||||
|
|
||||||
|
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene);
|
||||||
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
|
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
|
||||||
const instance_t *instance);
|
const instance_t *instance);
|
||||||
void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
||||||
|
@ -70,23 +70,25 @@ int main(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
model_t cube = {.vertices = vertices, .triangles = triangles};
|
model_t cube = {.vertices = vertices, .triangles = triangles};
|
||||||
instance_t cube_01 = {
|
instance_t instances[] = {
|
||||||
.model = &cube,
|
(instance_t){
|
||||||
.transform =
|
.model = &cube,
|
||||||
{
|
.transform =
|
||||||
.scale = 1.0f,
|
{
|
||||||
.rotation = (vec3f_t){0},
|
.scale = 1.0f,
|
||||||
.position = (vec3f_t){-1.5f, 0.0f, 8.0f},
|
.rotation = (vec3f_t){0},
|
||||||
},
|
.position = (vec3f_t){-1.5f, 0.0f, 8.0f},
|
||||||
};
|
},
|
||||||
instance_t cube_02 = {
|
},
|
||||||
.model = &cube,
|
(instance_t){
|
||||||
.transform =
|
.model = &cube,
|
||||||
{
|
.transform =
|
||||||
.scale = 1.0f,
|
{
|
||||||
.rotation = {0},
|
.scale = 1.0f,
|
||||||
.position = (vec3f_t){1.7f, 1.5f, 7.0f},
|
.rotation = {0},
|
||||||
},
|
.position = (vec3f_t){1.7f, 1.5f, 7.0f},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
mat3x4f_t proj_matrix = {
|
mat3x4f_t proj_matrix = {
|
||||||
@ -94,10 +96,13 @@ int main(void) {
|
|||||||
(vec4f_t){0.0f, viewport.z * window.height / viewport.y, 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},
|
(vec4f_t){0.0f, 0.0f, 1.0f, 0.0f},
|
||||||
};
|
};
|
||||||
mat4x4f_t cam_inverse_rotation = {0};
|
|
||||||
mat4x4f_t cam_inverse_translation = {0};
|
rasteriser_scene_t scene = {
|
||||||
mat4x4f_t cam_matrix = {0};
|
.instance_count = ARR_LEN(instances),
|
||||||
mat3x4f_t proj_cam_matrix = {0};
|
.instances = instances,
|
||||||
|
.camera = &camera,
|
||||||
|
.proj_matrix = &proj_matrix,
|
||||||
|
};
|
||||||
|
|
||||||
bool running = true;
|
bool running = true;
|
||||||
SDL_Event event = {0};
|
SDL_Event event = {0};
|
||||||
@ -134,15 +139,9 @@ 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);
|
clear_window(&window, bg);
|
||||||
|
|
||||||
render_instance(&window, arena, proj_cam_matrix, &cube_01);
|
render_scene(&window, arena, &scene);
|
||||||
render_instance(&window, arena, proj_cam_matrix, &cube_02);
|
|
||||||
|
|
||||||
swap_buffers(&window);
|
swap_buffers(&window);
|
||||||
|
|
||||||
|
@ -14,6 +14,22 @@
|
|||||||
internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1);
|
internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1);
|
||||||
internal inline void order_triangle_points(triangle_t *triangle);
|
internal inline void order_triangle_points(triangle_t *triangle);
|
||||||
|
|
||||||
|
void render_scene(window_t *wnd, Arena *arena,
|
||||||
|
const rasteriser_scene_t *scene) {
|
||||||
|
mat4x4f_t cam_inverse_rotation =
|
||||||
|
inverse_camera_rotation_matrix(scene->camera);
|
||||||
|
mat4x4f_t cam_inverse_translation =
|
||||||
|
inverse_camera_translation_matrix(scene->camera);
|
||||||
|
mat4x4f_t cam_matrix =
|
||||||
|
mul_mat4x4f(cam_inverse_rotation, cam_inverse_translation);
|
||||||
|
mat3x4f_t proj_cam_matrix =
|
||||||
|
mul_mat3x4f_by_mat4x4f(*(scene->proj_matrix), cam_matrix);
|
||||||
|
|
||||||
|
for (u64 i = 0; i < scene->instance_count; ++i) {
|
||||||
|
render_instance(wnd, arena, proj_cam_matrix, &(scene->instances[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
|
void render_instance(window_t *wnd, Arena *arena, mat3x4f_t proj_cam_mat,
|
||||||
const instance_t *instance) {
|
const instance_t *instance) {
|
||||||
list_vec2i_t *projected = list_create_with_capacity(
|
list_vec2i_t *projected = list_create_with_capacity(
|
||||||
|
Loading…
Reference in New Issue
Block a user