From bd57f345ed9dbed1d81683e48199626de2ea9044 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Fri, 27 Jun 2025 10:18:39 -0700 Subject: Restructure project --- src/scene/object.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/scene/object.c (limited to 'src/scene/object.c') diff --git a/src/scene/object.c b/src/scene/object.c new file mode 100644 index 0000000..e8e3ee6 --- /dev/null +++ b/src/scene/object.c @@ -0,0 +1,83 @@ +#include "object_impl.h" + +#include + +#include "mesh_impl.h" +#include "node_impl.h" +#include "scene_memory.h" + +#include + +static aabb3 calc_object_aabb(const SceneObject* object) { + assert(object); + + bool first = true; + aabb3 box; + + mesh_link_idx ml = object->mesh_link; + while (ml.val) { + const MeshLink* mesh_link = mem_get_mesh_link(ml); + const mesh_idx mi = mesh_link->mesh; + if (mi.val) { + const Mesh* mesh = mem_get_mesh(mi); + const aabb3 mesh_box = gfx_get_geometry_aabb(mesh->geometry); + if (first) { + box = mesh_box; + first = false; + } else { + box = aabb3_sum(box, mesh_box); + } + } + ml = mesh_link->next; + } + + return box; +} + +static void add_object_mesh(SceneObject* object, Mesh* mesh) { + assert(object); + assert(mesh); + + MeshLink* link = mem_alloc_mesh_link(); + link->mesh = mem_get_mesh_index(mesh); + link->next = object->mesh_link; + object->mesh_link = mem_get_mesh_link_index(link); +} + +SceneObject* gfx_make_object(const ObjectDesc* desc) { + assert(desc); + + SceneObject* object = mem_alloc_object(); + for (size_t i = 0; i < desc->num_meshes; ++i) { + add_object_mesh(object, desc->meshes[i]); + } + object->box = calc_object_aabb(object); + return object; +} + +void gfx_destroy_object(SceneObject** object) { + assert(object); + + if (*object) { + if ((*object)->parent.val) { + gfx_del_node((*object)->parent); + } + mem_free_object(object); + } +} + +void gfx_set_object_skeleton(SceneObject* object, const Skeleton* skeleton) { + assert(object); + assert(skeleton); + object->skeleton = mem_get_skeleton_index(skeleton); +} + +const Skeleton* gfx_get_object_skeleton(const SceneObject* object) { + assert(object); + return (object->skeleton.val == 0) ? 0 : mem_get_skeleton(object->skeleton); +} + +aabb3 gfx_get_object_aabb(const SceneObject* object) { + assert(object); + return object->box; +} -- cgit v1.2.3