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); }