diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h index 34d9998..44d3840 100644 --- a/include/rasteriser/rasteriser.h +++ b/include/rasteriser/rasteriser.h @@ -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); diff --git a/src/rasteriser/main.c b/src/rasteriser/main.c index 7b1d1e5..feb9b39 100644 --- a/src/rasteriser/main.c +++ b/src/rasteriser/main.c @@ -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); diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 3f83e8c..f0a7b72 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -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; + } } }