From fa5453d3993dd5daaf3e6152881658e5fbdc36f7 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 29 Jun 2024 19:28:41 +0100 Subject: [PATCH] Add render_object function --- include/rasteriser/rasteriser.h | 14 ++++++++++++++ src/rasteriser/rasteriser.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h index 94ec488..0257480 100644 --- a/include/rasteriser/rasteriser.h +++ b/include/rasteriser/rasteriser.h @@ -2,12 +2,23 @@ #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; @@ -24,6 +35,9 @@ typedef struct { colour_t colour; } 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_filled_triangle(window_t *wnd, Arena *arena, triangle_t triangle); void draw_shaded_triangle(window_t *wnd, Arena *arena, triangle_t triangle); diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 6080142..1688f4d 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -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); +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) { order_triangle_points(&triangle);