diff options
Diffstat (limited to 'src/asset/model.c')
| -rw-r--r-- | src/asset/model.c | 34 | 
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. | 
| 1556 | static void load_nodes( | 1556 | static 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) { | 
