diff --git a/src/Common/Game/T5/T5_Assets.h b/src/Common/Game/T5/T5_Assets.h index e2ef4741..4c6de811 100644 --- a/src/Common/Game/T5/T5_Assets.h +++ b/src/Common/Game/T5/T5_Assets.h @@ -672,7 +672,7 @@ namespace T5 uint16_t* boneNames; char* parentList; XModelQuat* quats; - vec4_t* trans; + float* trans; char* partClassification; DObjAnimMat* baseMat; XSurface* surfs; diff --git a/src/Common/Game/T6/T6_Assets.h b/src/Common/Game/T6/T6_Assets.h index 624217dc..99cea761 100644 --- a/src/Common/Game/T6/T6_Assets.h +++ b/src/Common/Game/T6/T6_Assets.h @@ -616,7 +616,7 @@ namespace T6 ScriptString* boneNames; unsigned char* parentList; XModelQuat* quats; - vec4_t* trans; + float* trans; unsigned char* partClassification; DObjAnimMat* baseMat; XSurface* surfs; diff --git a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp index 503e5621..9415787f 100644 --- a/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp +++ b/src/ObjLoading/Game/T6/XModel/JsonXModelLoader.cpp @@ -314,7 +314,9 @@ namespace if (xmodel.numBones > xmodel.numRootBones) { xmodel.parentList = m_memory.Alloc(xmodel.numBones - xmodel.numRootBones); - xmodel.trans = m_memory.Alloc(xmodel.numBones - xmodel.numRootBones); + + // For some reason Treyarch games allocate for a vec4 here. it is treated as a vec3 though? + xmodel.trans = m_memory.Alloc((xmodel.numBones - xmodel.numRootBones) * 4u); xmodel.quats = m_memory.Alloc(xmodel.numBones - xmodel.numRootBones); } else @@ -344,10 +346,10 @@ namespace xmodel.parentList[nonRootIndex] = static_cast(boneIndex - parentBoneIndex); - auto& trans = xmodel.trans[nonRootIndex]; - trans.x = bone.localOffset[0]; - trans.y = bone.localOffset[1]; - trans.z = bone.localOffset[2]; + auto* trans = &xmodel.trans[nonRootIndex * 3]; + trans[0] = bone.localOffset[0]; + trans[1] = bone.localOffset[1]; + trans[2] = bone.localOffset[2]; auto& quats = xmodel.quats[nonRootIndex]; quats.v[0] = QuatInt16::ToInt16(bone.localRotation.x); diff --git a/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp index b9102858..b7d80214 100644 --- a/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/T5/AssetDumpers/AssetDumperXModel.cpp @@ -139,10 +139,10 @@ namespace } else { - const auto& trans = model->trans[boneNum - model->numRootBones]; - bone.localOffset[0] = trans.x; - bone.localOffset[1] = trans.y; - bone.localOffset[2] = trans.z; + const auto* trans = &model->trans[(boneNum - model->numRootBones) * 3]; + bone.localOffset[0] = trans[0]; + bone.localOffset[1] = trans[1]; + bone.localOffset[2] = trans[2]; const auto& quat = model->quats[boneNum - model->numRootBones]; bone.localRotation = { diff --git a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp index 7c0f0df1..9a030b9b 100644 --- a/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp +++ b/src/ObjWriting/Game/T6/AssetDumpers/AssetDumperXModel.cpp @@ -153,10 +153,10 @@ namespace } else { - const auto& trans = model->trans[boneNum - model->numRootBones]; - bone.localOffset[0] = trans.x; - bone.localOffset[1] = trans.y; - bone.localOffset[2] = trans.z; + const auto* trans = &model->trans[(boneNum - model->numRootBones) * 3]; + bone.localOffset[0] = trans[0]; + bone.localOffset[1] = trans[1]; + bone.localOffset[2] = trans[2]; const auto& quat = model->quats[boneNum - model->numRootBones]; bone.localRotation = { diff --git a/src/ZoneCode/Game/T5/XAssets/XModel.txt b/src/ZoneCode/Game/T5/XAssets/XModel.txt index 4541f1f7..b555fad6 100644 --- a/src/ZoneCode/Game/T5/XAssets/XModel.txt +++ b/src/ZoneCode/Game/T5/XAssets/XModel.txt @@ -13,7 +13,8 @@ set count parentList numBones - numRootBones; set reusable quats; set count quats numBones - numRootBones; set reusable trans; -set count trans numBones - numRootBones; +// This is actually the count but it looks like a bug? It is used like a vec3, but it takes as much memory as vec4 +set count trans (numBones - numRootBones) * 4; set reusable partClassification; set count partClassification numBones; set reusable baseMat; diff --git a/src/ZoneCode/Game/T6/XAssets/XModel.txt b/src/ZoneCode/Game/T6/XAssets/XModel.txt index 13bf0712..62cd446a 100644 --- a/src/ZoneCode/Game/T6/XAssets/XModel.txt +++ b/src/ZoneCode/Game/T6/XAssets/XModel.txt @@ -13,7 +13,8 @@ set count parentList numBones - numRootBones; set reusable quats; set count quats numBones - numRootBones; set reusable trans; -set count trans numBones - numRootBones; +// This is actually the count but it looks like a bug? It is used like a vec3, but it takes as much memory as vec4 +set count trans (numBones - numRootBones) * 4; set reusable partClassification; set count partClassification numBones; set reusable baseMat;