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