fix: loading of gltf with multiple meshes

This commit is contained in:
Jan 2025-01-23 22:25:38 +00:00
parent 94ca0ab79e
commit 826c1d2f2d
No known key found for this signature in database
GPG Key ID: 44B581F78FF5C57C

View File

@ -547,9 +547,6 @@ namespace
if (!jRoot.nodes) if (!jRoot.nodes)
return false; return false;
if (!common.m_bones.empty())
throw GltfLoadException("Only scenes with at most one skin are supported");
const auto rootNode = GetRootNodeForSkin(jRoot, skin).value_or(skin.joints[0]); const auto rootNode = GetRootNodeForSkin(jRoot, skin).value_or(skin.joints[0]);
const auto skinBoneOffset = common.m_bones.size(); const auto skinBoneOffset = common.m_bones.size();
common.m_bones.resize(skinBoneOffset + skin.joints.size()); common.m_bones.resize(skinBoneOffset + skin.joints.size());
@ -566,13 +563,27 @@ namespace
if (!jRoot.meshes) if (!jRoot.meshes)
return; return;
std::optional<unsigned> alreadyLoadedSkinIndex;
for (const auto& loadObject : m_load_objects) for (const auto& loadObject : m_load_objects)
{ {
if (loadObject.skinIndex && jRoot.skins) if (loadObject.skinIndex && jRoot.skins)
{ {
const auto& skin = jRoot.skins.value()[*loadObject.skinIndex]; if (alreadyLoadedSkinIndex)
if (!ConvertSkin(jRoot, skin, common)) {
return; if (*alreadyLoadedSkinIndex != *loadObject.skinIndex)
throw GltfLoadException("Only scenes with at most one skin are supported");
// Do not load already loaded skin
}
else
{
const auto& skin = jRoot.skins.value()[*loadObject.skinIndex];
if (!ConvertSkin(jRoot, skin, common))
return;
alreadyLoadedSkinIndex = *loadObject.skinIndex;
}
} }
const auto& mesh = jRoot.meshes.value()[loadObject.meshIndex]; const auto& mesh = jRoot.meshes.value()[loadObject.meshIndex];