From 63556848c1cffb3266712a8f2519c0436401646b Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 8 Sep 2024 13:55:50 +0200 Subject: [PATCH] fix: auto generate armature when imported gltf has none --- .../Game/T6/XModel/JsonXModelLoader.cpp | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp index b399fcb8..d3ee2d6a 100644 --- a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp +++ b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp @@ -262,6 +262,33 @@ namespace return nullptr; } + static void AutoGenerateArmature(XModelCommon& common) + { + assert(common.m_bones.empty()); + assert(common.m_bone_weight_data.weights.empty()); + assert(common.m_vertex_bone_weights.size() == common.m_vertices.size()); + + XModelBone rootBone{ + "root", + std::nullopt, + {1.0f, 1.0f, 1.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f}, + {0.0f, 0.0f, 0.0f, 1.0f}, + {0.0f, 0.0f, 0.0f, 1.0f}, + }; + common.m_bones.emplace_back(rootBone); + + XModelBoneWeight rootWeight{0, 1.0f}; + common.m_bone_weight_data.weights.emplace_back(rootWeight); + + for (auto& vertexBoneWeights : common.m_vertex_bone_weights) + { + vertexBoneWeights.weightOffset = 0u; + vertexBoneWeights.weightCount = 1u; + } + } + static void ApplyBasePose(DObjAnimMat& baseMat, const XModelBone& bone) { baseMat.trans.x = bone.globalOffset[0]; @@ -713,6 +740,9 @@ namespace return false; } + if (common->m_bones.empty()) + AutoGenerateArmature(*common); + if (lodNumber == 0u) { if (!ApplyCommonBonesToXModel(jLod, xmodel, lodNumber, *common))