From 946ea9c3078916c764a7b5daad02d4bcf03041f8 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 29 Jun 2024 20:04:52 +0100 Subject: [PATCH] Add model and instance data types --- include/rasteriser/rasteriser.h | 15 +++++++++++--- src/rasteriser/main.c | 35 ++++++++++++--------------------- src/rasteriser/rasteriser.c | 16 +++++++-------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/include/rasteriser/rasteriser.h b/include/rasteriser/rasteriser.h index 0257480..0029e08 100644 --- a/include/rasteriser/rasteriser.h +++ b/include/rasteriser/rasteriser.h @@ -35,9 +35,18 @@ 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); +typedef struct { + list_vec3f_t *vertices; + list_scene_triangle_t *triangles; +} model_t; + +typedef struct { + model_t *model; + vec3f_t position; +} instance_t; + +void render_instance(window_t *wnd, Arena *arena, const camera_t *camera, + vec3f_t viewport, const instance_t *instance_t); 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/main.c b/src/rasteriser/main.c index d1b84d4..15fa3fb 100644 --- a/src/rasteriser/main.c +++ b/src/rasteriser/main.c @@ -2,9 +2,7 @@ #include "list/typed_list.h" #include "mem_arena.h" #include "mem_utils.h" -#include "misc/misc_utils.h" #include "rasteriser/rasteriser.h" -#include "scene/scene.h" #include "vector/vec.h" #include "window/window.h" #include @@ -33,30 +31,19 @@ int main(void) { return EXIT_FAILURE; } - vec3f_t translation = {-1.5f, 0.0f, 7.0f}; - list_vec3f_t *vertices = list_create(vec3f_t, arena); if (!vertices) { return EXIT_FAILURE; } // Vertices - vec3f_t v0 = vec_add(vec3f_t, translation, ((vec3f_t){1, 1, 1})); - vec3f_t v1 = vec_add(vec3f_t, translation, ((vec3f_t){-1, 1, 1})); - vec3f_t v2 = vec_add(vec3f_t, translation, ((vec3f_t){-1, -1, 1})); - vec3f_t v3 = vec_add(vec3f_t, translation, ((vec3f_t){1, -1, 1})); - vec3f_t v4 = vec_add(vec3f_t, translation, ((vec3f_t){1, 1, -1})); - vec3f_t v5 = vec_add(vec3f_t, translation, ((vec3f_t){-1, 1, -1})); - vec3f_t v6 = vec_add(vec3f_t, translation, ((vec3f_t){-1, -1, -1})); - vec3f_t v7 = vec_add(vec3f_t, translation, ((vec3f_t){1, -1, -1})); - - list_append(vec3f_t, arena, vertices, v0); - list_append(vec3f_t, arena, vertices, v1); - list_append(vec3f_t, arena, vertices, v2); - list_append(vec3f_t, arena, vertices, v3); - list_append(vec3f_t, arena, vertices, v4); - list_append(vec3f_t, arena, vertices, v5); - list_append(vec3f_t, arena, vertices, v6); - list_append(vec3f_t, arena, vertices, v7); + list_append(vec3f_t, arena, vertices, ((vec3f_t){1, 1, 1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, 1, 1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, -1, 1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){1, -1, 1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){1, 1, -1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, 1, -1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, -1, -1})); + list_append(vec3f_t, arena, vertices, ((vec3f_t){1, -1, -1})); list_scene_triangle_t *triangles = list_create(scene_triangle_t, arena); if (!triangles) { @@ -88,6 +75,10 @@ int main(void) { list_append(scene_triangle_t, arena, triangles, ((scene_triangle_t){2, 7, 3, (colour_t){.colour = 0x00ffffff}})); + vec3f_t position = {-1.5f, 0.0f, 7.0f}; + model_t model = {.vertices = vertices, .triangles = triangles}; + instance_t instance = {.model = &model, .position = position}; + bool running = true; SDL_Event event = {0}; @@ -114,7 +105,7 @@ int main(void) { clear_window(&window, bg); - render_object(&window, arena, &camera, viewport, vertices, triangles); + render_instance(&window, arena, &camera, viewport, &instance); swap_buffers(&window); diff --git a/src/rasteriser/rasteriser.c b/src/rasteriser/rasteriser.c index 1688f4d..49c66c1 100644 --- a/src/rasteriser/rasteriser.c +++ b/src/rasteriser/rasteriser.c @@ -15,24 +15,24 @@ 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) { +void render_instance(window_t *wnd, Arena *arena, const camera_t *camera, + vec3f_t viewport, const instance_t *instance) { list_vec2i_t *projected = list_create_with_capacity( - vec2i_t, arena, vertices->count * sizeof(vec3f_t)); + vec2i_t, arena, instance->model->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); + for (u64 i = 0; i < instance->model->vertices->count; ++i) { + vertex = list_get(instance->model->vertices, i); + vertex = vec_add(vec3f_t, vertex, instance->position); 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); + for (u64 i = 0; i < instance->model->triangles->count; ++i) { + scene_triangle_t triangle = list_get(instance->model->triangles, i); triangle_t tri = { .p0 = list_get(projected, triangle.idx0), .p1 = list_get(projected, triangle.idx1),