#ifndef RASTERISER_H #define RASTERISER_H #include "aliases.h" #include "camera/camera.h" #include "list/typed_list.h" #include "mem_arena.h" #include "vector/vec.h" #include "window/window.h" #define INVALID_VERTEX -1 typedef struct { vec3f_t position; f32 h; } vertex_t; typedef struct { i64 idx0; i64 idx1; i64 idx2; colour_t colour; } scene_triangle_t; MAKE_LIST_TYPE(f32); MAKE_LIST_TYPE(vec2i_t); MAKE_LIST_TYPE(vec3f_t); 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; } line_t; typedef struct { vec2i_t p0; vec2i_t p1; vec2i_t p2; f32 h0; f32 h1; f32 h2; colour_t colour; } triangle_t; typedef struct { list_vertex_t *vertices; list_scene_triangle_t *triangles; } model_t; #define NULL_MODEL ((model_t){0}) typedef struct { f32 scale; vec3f_t rotation; vec3f_t position; } transform_t; typedef struct { vec3f_t centre; f32 radius; } bounding_sphere_t; typedef struct { model_t *model; transform_t transform; } instance_t; typedef struct { vec3f_t normal; f32 distance; } clipping_plane_t; #define CLIPPING_PLANE_COUNT 5 typedef struct { u64 instance_count; instance_t *instances; camera_t *camera; const mat3x4f_t *proj_matrix; clipping_plane_t planes[CLIPPING_PLANE_COUNT]; } rasteriser_scene_t; 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); void draw_line(window_t *wnd, Arena *arena, line_t line, colour_t colour); bool is_null_model(const model_t *model); #endif // !RASTERISER_H