Add model and instance data types

This commit is contained in:
Abdelrahman Said 2024-06-29 20:04:52 +01:00
parent 7f251e7704
commit 946ea9c307
3 changed files with 33 additions and 33 deletions

View File

@ -35,9 +35,18 @@ typedef struct {
colour_t colour; colour_t colour;
} triangle_t; } triangle_t;
void render_object(window_t *wnd, Arena *arena, const camera_t *camera, typedef struct {
vec3f_t viewport, const list_vec3f_t *vertices, list_vec3f_t *vertices;
const list_scene_triangle_t *triangles); 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_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);

View File

@ -2,9 +2,7 @@
#include "list/typed_list.h" #include "list/typed_list.h"
#include "mem_arena.h" #include "mem_arena.h"
#include "mem_utils.h" #include "mem_utils.h"
#include "misc/misc_utils.h"
#include "rasteriser/rasteriser.h" #include "rasteriser/rasteriser.h"
#include "scene/scene.h"
#include "vector/vec.h" #include "vector/vec.h"
#include "window/window.h" #include "window/window.h"
#include <SDL2/SDL_events.h> #include <SDL2/SDL_events.h>
@ -33,30 +31,19 @@ int main(void) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
vec3f_t translation = {-1.5f, 0.0f, 7.0f};
list_vec3f_t *vertices = list_create(vec3f_t, arena); list_vec3f_t *vertices = list_create(vec3f_t, arena);
if (!vertices) { if (!vertices) {
return EXIT_FAILURE; return EXIT_FAILURE;
} }
// Vertices // Vertices
vec3f_t v0 = vec_add(vec3f_t, translation, ((vec3f_t){1, 1, 1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){1, 1, 1}));
vec3f_t v1 = vec_add(vec3f_t, translation, ((vec3f_t){-1, 1, 1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, 1, 1}));
vec3f_t v2 = vec_add(vec3f_t, translation, ((vec3f_t){-1, -1, 1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, -1, 1}));
vec3f_t v3 = vec_add(vec3f_t, translation, ((vec3f_t){1, -1, 1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){1, -1, 1}));
vec3f_t v4 = vec_add(vec3f_t, translation, ((vec3f_t){1, 1, -1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){1, 1, -1}));
vec3f_t v5 = vec_add(vec3f_t, translation, ((vec3f_t){-1, 1, -1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, 1, -1}));
vec3f_t v6 = vec_add(vec3f_t, translation, ((vec3f_t){-1, -1, -1})); list_append(vec3f_t, arena, vertices, ((vec3f_t){-1, -1, -1}));
vec3f_t v7 = vec_add(vec3f_t, translation, ((vec3f_t){1, -1, -1})); list_append(vec3f_t, arena, vertices, ((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_scene_triangle_t *triangles = list_create(scene_triangle_t, arena); list_scene_triangle_t *triangles = list_create(scene_triangle_t, arena);
if (!triangles) { if (!triangles) {
@ -88,6 +75,10 @@ int main(void) {
list_append(scene_triangle_t, arena, triangles, list_append(scene_triangle_t, arena, triangles,
((scene_triangle_t){2, 7, 3, (colour_t){.colour = 0x00ffffff}})); ((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; bool running = true;
SDL_Event event = {0}; SDL_Event event = {0};
@ -114,7 +105,7 @@ int main(void) {
clear_window(&window, bg); clear_window(&window, bg);
render_object(&window, arena, &camera, viewport, vertices, triangles); render_instance(&window, arena, &camera, viewport, &instance);
swap_buffers(&window); swap_buffers(&window);

View File

@ -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); internal inline void order_triangle_points(triangle_t *triangle);
void render_object(window_t *wnd, Arena *arena, const camera_t *camera, void render_instance(window_t *wnd, Arena *arena, const camera_t *camera,
vec3f_t viewport, const list_vec3f_t *vertices, vec3f_t viewport, const instance_t *instance) {
const list_scene_triangle_t *triangles) {
list_vec2i_t *projected = list_create_with_capacity( 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) { if (!projected) {
return; return;
} }
vec3f_t vertex = {0}; vec3f_t vertex = {0};
for (u64 i = 0; i < vertices->count; ++i) { for (u64 i = 0; i < instance->model->vertices->count; ++i) {
vertex = list_get(vertices, i); vertex = list_get(instance->model->vertices, i);
vertex = vec_add(vec3f_t, vertex, instance->position);
list_append(vec2i_t, arena, projected, list_append(vec2i_t, arena, projected,
project_point(vertex, wnd, camera, viewport)); project_point(vertex, wnd, camera, viewport));
} }
for (u64 i = 0; i < triangles->count; ++i) { for (u64 i = 0; i < instance->model->triangles->count; ++i) {
scene_triangle_t triangle = list_get(triangles, i); scene_triangle_t triangle = list_get(instance->model->triangles, i);
triangle_t tri = { triangle_t tri = {
.p0 = list_get(projected, triangle.idx0), .p0 = list_get(projected, triangle.idx0),
.p1 = list_get(projected, triangle.idx1), .p1 = list_get(projected, triangle.idx1),