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(vertex_t);
|
||||||
MAKE_LIST_TYPE(scene_triangle_t);
|
MAKE_LIST_TYPE(scene_triangle_t);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
RASTERISER_RENDER_WIREFRAME,
|
||||||
|
RASTERISER_RENDER_SOLID,
|
||||||
|
} render_type_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vec2i_t p0;
|
vec2i_t p0;
|
||||||
vec2i_t p1;
|
vec2i_t p1;
|
||||||
@ -80,7 +85,8 @@ typedef struct {
|
|||||||
clipping_plane_t planes[CLIPPING_PLANE_COUNT];
|
clipping_plane_t planes[CLIPPING_PLANE_COUNT];
|
||||||
} rasteriser_scene_t;
|
} 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_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
||||||
void draw_filled_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);
|
void draw_shaded_triangle(window_t *wnd, Arena *arena, triangle_t triangle);
|
||||||
|
@ -181,7 +181,7 @@ int main(void) {
|
|||||||
|
|
||||||
clear_window(&window, bg);
|
clear_window(&window, bg);
|
||||||
|
|
||||||
render_scene(&window, frame_arena, &scene);
|
render_scene(&window, frame_arena, &scene, RASTERISER_RENDER_WIREFRAME);
|
||||||
|
|
||||||
swap_buffers(&window);
|
swap_buffers(&window);
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ typedef struct {
|
|||||||
internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
|
internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
|
||||||
Arena *arena, mat4x4f_t camera_matrix,
|
Arena *arena, mat4x4f_t camera_matrix,
|
||||||
mat3x4f_t projection_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,
|
internal void clip_instance(Arena *arena, model_t *model,
|
||||||
const rasteriser_scene_t *scene);
|
const rasteriser_scene_t *scene);
|
||||||
internal void clip_instance_against_plane(Arena *arena, model_t *model,
|
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,
|
internal inline f32 signed_distance(const vec3f_t *vertex,
|
||||||
const clipping_plane_t *plane);
|
const clipping_plane_t *plane);
|
||||||
|
|
||||||
void render_scene(window_t *wnd, Arena *arena,
|
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene,
|
||||||
const rasteriser_scene_t *scene) {
|
render_type_t type) {
|
||||||
mat4x4f_t cam_inverse_rotation =
|
mat4x4f_t cam_inverse_rotation =
|
||||||
inverse_camera_rotation_matrix(scene->camera);
|
inverse_camera_rotation_matrix(scene->camera);
|
||||||
mat4x4f_t cam_inverse_translation =
|
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) {
|
for (u64 i = 0; i < scene->instance_count; ++i) {
|
||||||
render_instance(wnd, scene, arena, cam_matrix, *(scene->proj_matrix),
|
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,
|
internal void render_instance(window_t *wnd, const rasteriser_scene_t *scene,
|
||||||
Arena *arena, mat4x4f_t camera_matrix,
|
Arena *arena, mat4x4f_t camera_matrix,
|
||||||
mat3x4f_t projection_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(
|
list_vertex_t *transformed = list_create_with_capacity(
|
||||||
vertex_t, arena,
|
vertex_t, arena,
|
||||||
(instance->model->vertices->count + 10) * sizeof(vertex_t));
|
(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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case RASTERISER_RENDER_WIREFRAME:
|
||||||
draw_wireframe_triangle(wnd, arena, tri);
|
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