cg-from-scratch/include/rasteriser/rasteriser.h

80 lines
1.7 KiB
C

#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"
typedef struct {
u64 idx0;
u64 idx1;
u64 idx2;
colour_t colour;
} scene_triangle_t;
MAKE_LIST_TYPE(f32);
MAKE_LIST_TYPE(vec2i_t);
MAKE_LIST_TYPE(vec3f_t);
MAKE_LIST_TYPE(scene_triangle_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_vec3f_t *vertices;
list_scene_triangle_t *triangles;
} model_t;
typedef struct {
f32 scale;
vec3f_t rotation;
vec3f_t position;
} transform_t;
typedef struct {
model_t *model;
transform_t transform;
} instance_t;
typedef struct {
vec3f_t normal;
f32 distance;
} clipping_plane_t;
typedef struct {
u64 instance_count;
instance_t *instances;
camera_t *camera;
const mat3x4f_t *proj_matrix;
clipping_plane_t near;
clipping_plane_t left;
clipping_plane_t right;
clipping_plane_t bottom;
clipping_plane_t top;
} rasteriser_scene_t;
void render_scene(window_t *wnd, Arena *arena, const rasteriser_scene_t *scene);
void render_instance(window_t *wnd, Arena *arena, mat4x4f_t camera_matrix,
mat3x4f_t projection_matrix, const instance_t *instance);
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);
#endif // !RASTERISER_H