Add wireframe and solid render types

This commit is contained in:
Abdelrahman Said 2024-07-13 22:43:00 +01:00
parent e236cd8bbe
commit 5d61e8a616
3 changed files with 21 additions and 8 deletions

View File

@ -29,6 +29,11 @@ MAKE_LIST_TYPE(vec4f_t);
MAKE_LIST_TYPE(vertex_t);
MAKE_LIST_TYPE(scene_triangle_t);
typedef enum {
RASTERISER_RENDER_WIREFRAME,
RASTERISER_RENDER_SOLID,
} render_type_t;
typedef struct {
vec2i_t p0;
vec2i_t p1;
@ -80,7 +85,8 @@ typedef struct {
clipping_plane_t planes[CLIPPING_PLANE_COUNT];
} rasteriser_scene_t;
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene);
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene,
render_type_t type);
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

@ -181,7 +181,7 @@ int main(void) {
clear_window(&window, bg);
render_scene(&window, frame_arena, &scene);
render_scene(&window, frame_arena, &scene, RASTERISER_RENDER_WIREFRAME);
swap_buffers(&window);

View File

@ -19,7 +19,7 @@ typedef struct {
internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
Arena *arena, mat4x4f_t camera_matrix,
mat3x4f_t projection_matrix,
const instance_t *instance);
const instance_t *instance, render_type_t type);
internal void clip_instance(Arena *arena, model_t *model,
const rasteriser_scene_t *scene);
internal void clip_instance_against_plane(Arena *arena, model_t *model,
@ -42,8 +42,8 @@ internal inline void copy_triangles(Arena *arena, list_scene_triangle_t *dst,
internal inline f32 signed_distance(const vec3f_t *vertex,
const clipping_plane_t *plane);
void render_scene(window_t *wnd, Arena *arena,
const rasteriser_scene_t *scene) {
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene,
render_type_t type) {
mat4x4f_t cam_inverse_rotation =
inverse_camera_rotation_matrix(scene->camera);
mat4x4f_t cam_inverse_translation =
@ -53,14 +53,14 @@ void render_scene(window_t *wnd, Arena *arena,
for (u64 i = 0; i < scene->instance_count; ++i) {
render_instance(wnd, scene, arena, cam_matrix, *(scene->proj_matrix),
&(scene->instances[i]));
&(scene->instances[i]), type);
}
}
internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
Arena *arena, mat4x4f_t camera_matrix,
mat3x4f_t projection_matrix,
const instance_t *instance) {
const instance_t *instance, render_type_t type) {
list_vertex_t *transformed = list_create_with_capacity(
vertex_t, arena,
(instance->model->vertices->count + 10) * sizeof(vertex_t));
@ -139,7 +139,14 @@ internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
continue;
}
draw_wireframe_triangle(wnd, arena, tri);
switch (type) {
case RASTERISER_RENDER_WIREFRAME:
draw_wireframe_triangle(wnd, arena, tri);
break;
case RASTERISER_RENDER_SOLID:
draw_filled_triangle(wnd, arena, tri);
break;
}
}
}