From 6a1962b65ac6d7f0e16bf508d71215298f8cf7c5 Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 10 May 2024 22:57:22 +0200 Subject: [PATCH] chore: export separate root node for gltf --- src/ObjWriting/XModel/Gltf/GltfWriter.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp index 4a63bc43..8644d852 100644 --- a/src/ObjWriting/XModel/Gltf/GltfWriter.cpp +++ b/src/ObjWriting/XModel/Gltf/GltfWriter.cpp @@ -37,8 +37,9 @@ namespace std::vector bufferData; CreateJsonAsset(gltf.asset); - CreateMeshNode(gltf, xmodel); CreateSkeletonNodes(gltf, xmodel); + CreateMeshNode(gltf, xmodel); + CreateRootNode(gltf, xmodel); CreateMaterials(gltf, xmodel); CreateSkin(gltf, xmodel); CreateBufferViews(gltf, xmodel); @@ -85,6 +86,23 @@ namespace gltf.nodes->emplace_back(std::move(meshNode)); } + void CreateRootNode(JsonRoot& gltf, const XModelCommon& xmodel) + { + JsonNode rootNode; + + if (!gltf.nodes.has_value()) + gltf.nodes.emplace(); + + rootNode.children.emplace(); + rootNode.children->push_back(m_mesh_node); + + if (!xmodel.m_bones.empty()) + rootNode.children->push_back(m_first_bone_node); + + m_root_node = gltf.nodes->size(); + gltf.nodes->emplace_back(std::move(rootNode)); + } + void CreateMesh(JsonRoot& gltf, const XModelCommon& xmodel) { if (!gltf.meshes.has_value()) @@ -250,7 +268,7 @@ namespace JsonScene scene; // Only add skin if the model has bones - scene.nodes.emplace_back(m_mesh_node); + scene.nodes.emplace_back(m_root_node); if (!gltf.scenes.has_value()) gltf.scenes.emplace(); @@ -516,6 +534,7 @@ namespace } unsigned m_mesh_node = 0u; + unsigned m_root_node = 0u; unsigned m_first_bone_node = 0u; unsigned m_position_accessor = 0u; unsigned m_normal_accessor = 0u;