Add model and instance data types
This commit is contained in:
parent
7f251e7704
commit
946ea9c307
@ -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);
|
||||
|
@ -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 <SDL2/SDL_events.h>
|
||||
@ -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);
|
||||
|
||||
|
@ -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),
|
||||
|
Loading…
Reference in New Issue
Block a user