aboutsummaryrefslogtreecommitdiff
path: root/src/asset/model.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/asset/model.c')
-rw-r--r--src/asset/model.c34
1 files changed, 9 insertions, 25 deletions
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(
1555/// and instead just loads all nodes into a single gfx Scene. 1555/// and instead just loads all nodes into a single gfx Scene.
1556static void load_nodes( 1556static void load_nodes(
1557 const cgltf_data* data, SceneNode* root_node, SceneObject** objects, 1557 const cgltf_data* data, SceneNode* root_node, SceneObject** objects,
1558 SceneCamera** cameras, const Anima* anima, SceneNode** nodes) { 1558 const Anima* anima, SceneNode** nodes) {
1559 // Note that with glTF 2.0, nodes do not form a DAG / scene graph but a 1559 // Note that with glTF 2.0, nodes do not form a DAG / scene graph but a
1560 // disjoint union of strict trees: 1560 // disjoint union of strict trees:
1561 // 1561 //
@@ -1570,7 +1570,6 @@ static void load_nodes(
1570 assert(data); 1570 assert(data);
1571 assert(root_node); 1571 assert(root_node);
1572 assert(objects); 1572 assert(objects);
1573 assert(cameras);
1574 assert(nodes); 1573 assert(nodes);
1575 1574
1576 cgltf_size next_camera = 0; 1575 cgltf_size next_camera = 0;
@@ -1579,7 +1578,7 @@ static void load_nodes(
1579 for (cgltf_size n = 0; n < data->nodes_count; ++n) { 1578 for (cgltf_size n = 0; n < data->nodes_count; ++n) {
1580 const cgltf_node* node = &data->nodes[n]; 1579 const cgltf_node* node = &data->nodes[n];
1581 1580
1582 // Add SceneObject, SceneCamera or Lights. 1581 // Add SceneObject, Camera or Lights.
1583 // TODO: Handle lights once they are implemented in the gfx library. 1582 // TODO: Handle lights once they are implemented in the gfx library.
1584 assert(!nodes[n]); 1583 assert(!nodes[n]);
1585 if (node->mesh) { 1584 if (node->mesh) {
@@ -1599,29 +1598,27 @@ static void load_nodes(
1599 } else if (node->camera) { 1598 } else if (node->camera) {
1600 assert(next_camera < data->cameras_count); 1599 assert(next_camera < data->cameras_count);
1601 1600
1602 Camera camera;
1603 const cgltf_camera* cam = node->camera; 1601 const cgltf_camera* cam = node->camera;
1604 1602
1605 // TODO: We could define a function load_cameras() the same way we load 1603 // TODO: We could define a function load_cameras() the same way we load
1606 // every mesh and then remove this ad-hoc loading of cameras here, as well 1604 // every mesh and then remove this ad-hoc loading of cameras here, as well
1607 // as remove 'next_camera'. 1605 // as remove 'next_camera'.
1606 Camera* camera = gfx_make_camera();
1608 switch (cam->type) { 1607 switch (cam->type) {
1609 case cgltf_camera_type_orthographic: 1608 case cgltf_camera_type_orthographic:
1610 camera = camera_orthographic( 1609 *camera = camera_orthographic(
1611 0, cam->data.orthographic.xmag, 0, cam->data.orthographic.ymag, 1610 0, cam->data.orthographic.xmag, 0, cam->data.orthographic.ymag,
1612 cam->data.orthographic.znear, cam->data.orthographic.zfar); 1611 cam->data.orthographic.znear, cam->data.orthographic.zfar);
1613 break; 1612 break;
1614 case cgltf_camera_type_perspective: 1613 case cgltf_camera_type_perspective:
1615 camera = camera_perspective( 1614 *camera = camera_perspective(
1616 cam->data.perspective.yfov, cam->data.perspective.aspect_ratio, 1615 cam->data.perspective.yfov, cam->data.perspective.aspect_ratio,
1617 cam->data.perspective.znear, cam->data.perspective.zfar); 1616 cam->data.perspective.znear, cam->data.perspective.zfar);
1618 break; 1617 break;
1619 case cgltf_camera_type_invalid: 1618 case cgltf_camera_type_invalid:
1620 break; 1619 break;
1621 } 1620 }
1622 1621 nodes[n] = gfx_make_camera_node(camera);
1623 gfx_set_camera_camera(cameras[next_camera], &camera);
1624 nodes[n] = gfx_make_camera_node(cameras[next_camera]);
1625 ++next_camera; 1622 ++next_camera;
1626 } else { 1623 } else {
1627 // TODO: implementation for missing node types. 1624 // TODO: implementation for missing node types.
@@ -1727,7 +1724,6 @@ static Model* load_scene(
1727 Mesh** meshes = 0; 1724 Mesh** meshes = 0;
1728 AnimaDesc* anima_desc = 0; 1725 AnimaDesc* anima_desc = 0;
1729 SceneObject** scene_objects = 0; 1726 SceneObject** scene_objects = 0;
1730 SceneCamera** scene_cameras = 0;
1731 SceneNode** scene_nodes = 0; 1727 SceneNode** scene_nodes = 0;
1732 Anima* anima = 0; 1728 Anima* anima = 0;
1733 SceneNode* root_node = 0; 1729 SceneNode* root_node = 0;
@@ -1740,8 +1736,7 @@ static Model* load_scene(
1740 geometries = calloc(primitive_count, sizeof(Geometry*)); 1736 geometries = calloc(primitive_count, sizeof(Geometry*));
1741 meshes = calloc(primitive_count, sizeof(Mesh*)); 1737 meshes = calloc(primitive_count, sizeof(Mesh*));
1742 scene_objects = calloc(data->meshes_count, sizeof(SceneObject*)); 1738 scene_objects = calloc(data->meshes_count, sizeof(SceneObject*));
1743 scene_cameras = calloc(data->cameras_count, sizeof(SceneCamera**)); 1739 scene_nodes = calloc(data->nodes_count, sizeof(SceneNode*));
1744 scene_nodes = calloc(data->nodes_count, sizeof(SceneNode**));
1745 // A glTF scene does not necessarily have textures. Materials can be given 1740 // A glTF scene does not necessarily have textures. Materials can be given
1746 // as constants, for example. 1741 // as constants, for example.
1747 if (data->textures_count > 0) { 1742 if (data->textures_count > 0) {
@@ -1750,8 +1745,7 @@ static Model* load_scene(
1750 1745
1751 if (!buffers || !tangent_buffers || 1746 if (!buffers || !tangent_buffers ||
1752 ((data->textures_count > 0) && !load_texture_cmds) || !textures || 1747 ((data->textures_count > 0) && !load_texture_cmds) || !textures ||
1753 !materials || !geometries || !meshes || !scene_objects || 1748 !materials || !geometries || !meshes || !scene_objects || !scene_nodes) {
1754 !scene_cameras || !scene_nodes) {
1755 goto cleanup; 1749 goto cleanup;
1756 } 1750 }
1757 1751
@@ -1809,7 +1803,7 @@ static Model* load_scene(
1809 assert(root_node); 1803 assert(root_node);
1810 1804
1811 // The root node becomes the root of all scene nodes. 1805 // The root node becomes the root of all scene nodes.
1812 load_nodes(data, root_node, scene_objects, scene_cameras, anima, scene_nodes); 1806 load_nodes(data, root_node, scene_objects, anima, scene_nodes);
1813 1807
1814 model = gfx_make_model(root_node); 1808 model = gfx_make_model(root_node);
1815 1809
@@ -1887,16 +1881,6 @@ cleanup:
1887 } 1881 }
1888 free(scene_objects); 1882 free(scene_objects);
1889 } 1883 }
1890 if (scene_cameras) {
1891 if (!success) {
1892 for (cgltf_size i = 0; i < data->cameras_count; ++i) {
1893 if (scene_cameras[i]) {
1894 gfx_destroy_camera(&scene_cameras[i]);
1895 }
1896 }
1897 }
1898 free(scene_cameras);
1899 }
1900 if (scene_nodes) { 1884 if (scene_nodes) {
1901 if (!success) { 1885 if (!success) {
1902 for (cgltf_size i = 0; i < data->nodes_count; ++i) { 1886 for (cgltf_size i = 0; i < data->nodes_count; ++i) {