From 75e22b17507282bbcc1b14ba4976d27b06fee98c Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 10 Aug 2024 20:47:58 +0200 Subject: [PATCH] fix: parentIndex is relative to current bone index --- src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp | 7 +++++-- src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp index a592a73c..ea60842c 100644 --- a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp +++ b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp @@ -314,10 +314,13 @@ namespace // Other boneInfo data is filled when calculating bone bounds xmodel.boneInfo[boneIndex].collmap = -1; - if (xmodel.numRootBones < boneIndex) + if (xmodel.numRootBones <= boneIndex) { const auto nonRootIndex = boneIndex - xmodel.numRootBones; - xmodel.parentList[nonRootIndex] = static_cast(bone.parentIndex.value_or(0u)); + const auto parentBoneIndex = static_cast(bone.parentIndex.value_or(0u)); + assert(parentBoneIndex < boneIndex); + + xmodel.parentList[nonRootIndex] = static_cast(boneIndex - parentBoneIndex); auto& trans = xmodel.trans[nonRootIndex]; trans.x = bone.localOffset[0]; diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp index d160dc77..98a324ab 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp @@ -136,7 +136,7 @@ namespace if (model->partClassification[boneNum]) { if (boneNum < model->numRootBones - || model->partClassification[model->parentList[boneNum - model->numRootBones]] != model->partClassification[boneNum]) + || model->partClassification[boneNum - model->parentList[boneNum - model->numRootBones]] != model->partClassification[boneNum]) { std::cerr << std::format("Part: {:02} = {}\n", model->partClassification[boneNum], bone.name); }