97 lines
1.9 KiB
C
97 lines
1.9 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"
|
|
|
|
#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
|