Add render_object function
This commit is contained in:
parent
7c192d5edf
commit
fa5453d399
@ -2,12 +2,23 @@
|
|||||||
#define RASTERISER_H
|
#define RASTERISER_H
|
||||||
|
|
||||||
#include "aliases.h"
|
#include "aliases.h"
|
||||||
|
#include "camera/camera.h"
|
||||||
#include "list/typed_list.h"
|
#include "list/typed_list.h"
|
||||||
#include "mem_arena.h"
|
#include "mem_arena.h"
|
||||||
#include "vector/vec.h"
|
#include "vector/vec.h"
|
||||||
#include "window/window.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(f32);
|
||||||
|
MAKE_LIST_TYPE(vec2i_t);
|
||||||
|
MAKE_LIST_TYPE(vec3f_t);
|
||||||
|
MAKE_LIST_TYPE(scene_triangle_t);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
vec2i_t p0;
|
vec2i_t p0;
|
||||||
@ -24,6 +35,9 @@ typedef struct {
|
|||||||
colour_t colour;
|
colour_t colour;
|
||||||
} triangle_t;
|
} triangle_t;
|
||||||
|
|
||||||
|
void render_object(window_t *wnd, Arena *arena, const camera_t *camera,
|
||||||
|
vec3f_t viewport, const list_vec3f_t *vertices,
|
||||||
|
const list_scene_triangle_t *triangles);
|
||||||
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);
|
||||||
|
@ -15,6 +15,37 @@ internal list_float *interpolate(Arena *arena, i32 i0, f32 d0, i32 i1, f32 d1);
|
|||||||
|
|
||||||
internal inline void order_triangle_points(triangle_t *triangle);
|
internal inline void order_triangle_points(triangle_t *triangle);
|
||||||
|
|
||||||
|
void render_object(window_t *wnd, Arena *arena, const camera_t *camera,
|
||||||
|
vec3f_t viewport, const list_vec3f_t *vertices,
|
||||||
|
const list_scene_triangle_t *triangles) {
|
||||||
|
list_vec2i_t *projected = list_create_with_capacity(
|
||||||
|
vec2i_t, arena, vertices->count * sizeof(vec3f_t));
|
||||||
|
if (!projected) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3f_t vertex = {0};
|
||||||
|
for (u64 i = 0; i < vertices->count; ++i) {
|
||||||
|
vertex = list_get(vertices, i);
|
||||||
|
list_append(vec2i_t, arena, projected,
|
||||||
|
project_point(vertex, wnd, camera, viewport));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (u64 i = 0; i < triangles->count; ++i) {
|
||||||
|
scene_triangle_t triangle = list_get(triangles, i);
|
||||||
|
triangle_t tri = {
|
||||||
|
.p0 = list_get(projected, triangle.idx0),
|
||||||
|
.p1 = list_get(projected, triangle.idx1),
|
||||||
|
.p2 = list_get(projected, triangle.idx2),
|
||||||
|
.h0 = 1.0f,
|
||||||
|
.h1 = 1.0f,
|
||||||
|
.h2 = 1.0f,
|
||||||
|
.colour = triangle.colour,
|
||||||
|
};
|
||||||
|
draw_wireframe_triangle(wnd, arena, tri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle) {
|
void draw_wireframe_triangle(window_t *wnd, Arena *arena, triangle_t triangle) {
|
||||||
order_triangle_points(&triangle);
|
order_triangle_points(&triangle);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user