Add wireframe and solid render types
This commit is contained in:
parent
e236cd8bbe
commit
5d61e8a616
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case RASTERISER_RENDER_WIREFRAME:
|
||||
draw_wireframe_triangle(wnd, arena, tri);
|
||||
break;
|
||||
case RASTERISER_RENDER_SOLID:
|
||||
draw_filled_triangle(wnd, arena, tri);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user