From 440b292c39162284a447b34d3a692143af9fbc87 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Thu, 30 Oct 2025 17:21:22 -0700 Subject: - Replace SceneCamera with Camera. - Remove backpointer from scene types to node to decouple underlying types from the scene graph. --- src/asset/model.c | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'src/asset/model.c') diff --git a/src/asset/model.c b/src/asset/model.c index ccda27d..df116fb 100644 --- a/src/asset/model.c +++ b/src/asset/model.c @@ -1555,7 +1555,7 @@ static void remove_joint_nodes( /// and instead just loads all nodes into a single gfx Scene. static void load_nodes( const cgltf_data* data, SceneNode* root_node, SceneObject** objects, - SceneCamera** cameras, const Anima* anima, SceneNode** nodes) { + const Anima* anima, SceneNode** nodes) { // Note that with glTF 2.0, nodes do not form a DAG / scene graph but a // disjoint union of strict trees: // @@ -1570,7 +1570,6 @@ static void load_nodes( assert(data); assert(root_node); assert(objects); - assert(cameras); assert(nodes); cgltf_size next_camera = 0; @@ -1579,7 +1578,7 @@ static void load_nodes( for (cgltf_size n = 0; n < data->nodes_count; ++n) { const cgltf_node* node = &data->nodes[n]; - // Add SceneObject, SceneCamera or Lights. + // Add SceneObject, Camera or Lights. // TODO: Handle lights once they are implemented in the gfx library. assert(!nodes[n]); if (node->mesh) { @@ -1599,29 +1598,27 @@ static void load_nodes( } else if (node->camera) { assert(next_camera < data->cameras_count); - Camera camera; const cgltf_camera* cam = node->camera; // TODO: We could define a function load_cameras() the same way we load // every mesh and then remove this ad-hoc loading of cameras here, as well // as remove 'next_camera'. + Camera* camera = gfx_make_camera(); switch (cam->type) { case cgltf_camera_type_orthographic: - camera = camera_orthographic( + *camera = camera_orthographic( 0, cam->data.orthographic.xmag, 0, cam->data.orthographic.ymag, cam->data.orthographic.znear, cam->data.orthographic.zfar); break; case cgltf_camera_type_perspective: - camera = camera_perspective( + *camera = camera_perspective( cam->data.perspective.yfov, cam->data.perspective.aspect_ratio, cam->data.perspective.znear, cam->data.perspective.zfar); break; case cgltf_camera_type_invalid: break; } - - gfx_set_camera_camera(cameras[next_camera], &camera); - nodes[n] = gfx_make_camera_node(cameras[next_camera]); + nodes[n] = gfx_make_camera_node(camera); ++next_camera; } else { // TODO: implementation for missing node types. @@ -1727,7 +1724,6 @@ static Model* load_scene( Mesh** meshes = 0; AnimaDesc* anima_desc = 0; SceneObject** scene_objects = 0; - SceneCamera** scene_cameras = 0; SceneNode** scene_nodes = 0; Anima* anima = 0; SceneNode* root_node = 0; @@ -1740,8 +1736,7 @@ static Model* load_scene( geometries = calloc(primitive_count, sizeof(Geometry*)); meshes = calloc(primitive_count, sizeof(Mesh*)); scene_objects = calloc(data->meshes_count, sizeof(SceneObject*)); - scene_cameras = calloc(data->cameras_count, sizeof(SceneCamera**)); - scene_nodes = calloc(data->nodes_count, sizeof(SceneNode**)); + scene_nodes = calloc(data->nodes_count, sizeof(SceneNode*)); // A glTF scene does not necessarily have textures. Materials can be given // as constants, for example. if (data->textures_count > 0) { @@ -1750,8 +1745,7 @@ static Model* load_scene( if (!buffers || !tangent_buffers || ((data->textures_count > 0) && !load_texture_cmds) || !textures || - !materials || !geometries || !meshes || !scene_objects || - !scene_cameras || !scene_nodes) { + !materials || !geometries || !meshes || !scene_objects || !scene_nodes) { goto cleanup; } @@ -1809,7 +1803,7 @@ static Model* load_scene( assert(root_node); // The root node becomes the root of all scene nodes. - load_nodes(data, root_node, scene_objects, scene_cameras, anima, scene_nodes); + load_nodes(data, root_node, scene_objects, anima, scene_nodes); model = gfx_make_model(root_node); @@ -1887,16 +1881,6 @@ cleanup: } free(scene_objects); } - if (scene_cameras) { - if (!success) { - for (cgltf_size i = 0; i < data->cameras_count; ++i) { - if (scene_cameras[i]) { - gfx_destroy_camera(&scene_cameras[i]); - } - } - } - free(scene_cameras); - } if (scene_nodes) { if (!success) { for (cgltf_size i = 0; i < data->nodes_count; ++i) { -- cgit v1.2.3