From 8d4e7e33d2f50034c5cf0a72d42163be674e9312 Mon Sep 17 00:00:00 2001 From: RektInator <7003455+RektInator@users.noreply.github.com> Date: Thu, 3 Dec 2020 14:30:14 +0100 Subject: [PATCH] fix XAE3 delta quats --- src/IW4/Structs.hpp | 6 +++--- src/IW5/Assets/XAnimParts.cpp | 30 ++++++++++++++++++++---------- src/IW5/Structs.hpp | 10 +++++----- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/IW4/Structs.hpp b/src/IW4/Structs.hpp index 32a556b..4a9c896 100644 --- a/src/IW4/Structs.hpp +++ b/src/IW4/Structs.hpp @@ -2072,6 +2072,7 @@ namespace ZoneTool __declspec(align(2)) XAnimPartTransData u; }; +#pragma pack(push, 4) struct XAnimDeltaPartQuatDataFrames2 { __int16(*frames)[2]; @@ -2099,13 +2100,13 @@ namespace ZoneTool union XAnimDeltaPartQuatData { XAnimDeltaPartQuatDataFrames frames; - __int16 frame0[2]; + __int16 frame0[4]; }; struct XAnimDeltaPartQuat { unsigned __int16 size; - __declspec(align(4)) XAnimDeltaPartQuatData u; + XAnimDeltaPartQuatData u; }; struct XAnimDeltaPart @@ -2115,7 +2116,6 @@ namespace ZoneTool XAnimDeltaPartQuat* quat; }; -#pragma pack(push, 4) struct XAnimNotifyInfo { short name; diff --git a/src/IW5/Assets/XAnimParts.cpp b/src/IW5/Assets/XAnimParts.cpp index 52c9dd7..fa6d355 100644 --- a/src/IW5/Assets/XAnimParts.cpp +++ b/src/IW5/Assets/XAnimParts.cpp @@ -184,11 +184,21 @@ namespace ZoneTool if (asset->delta->quat2) { asset->delta->quat2 = reader.read_raw(); + + if (asset->delta->quat2->size && asset->delta->quat2->u.frames.frames) + { + asset->delta->quat2->u.frames.frames = reader.read_raw(); + } } if (asset->delta->quat) { asset->delta->quat = reader.read_raw(); + + if (asset->delta->quat->size && asset->delta->quat->u.frames.frames) + { + asset->delta->quat->u.frames.frames = reader.read_raw(); + } } } @@ -580,11 +590,6 @@ namespace ZoneTool { extra_size += asset->delta->quat2->size + 1; } - - if (asset->delta->quat2->u.frames.frames) - { - extra_size += (asset->delta->quat2->size * 4) + 4; - } } else { @@ -593,6 +598,11 @@ namespace ZoneTool } dump.dump_raw(asset->delta->quat2, sizeof(XAnimDeltaPartQuat2) + extra_size); + + if (asset->delta->quat2->size && asset->delta->quat2->u.frames.frames) + { + dump.dump_raw(asset->delta->quat2->u.frames.frames, (asset->delta->quat2->size * 4) + 4); + } } if (asset->delta->quat) @@ -609,11 +619,6 @@ namespace ZoneTool { extra_size += asset->delta->quat->size + 1; } - - if (asset->delta->quat->u.frames.frames) - { - extra_size += (asset->delta->quat->size * 8) + 8; - } } else { @@ -622,6 +627,11 @@ namespace ZoneTool } dump.dump_raw(asset->delta->quat, sizeof(XAnimDeltaPartQuat) + extra_size); + + if (asset->delta->quat->size && asset->delta->quat->u.frames.frames) + { + dump.dump_raw(asset->delta->quat->u.frames.frames, (asset->delta->quat->size * 8) + 8); + } } } diff --git a/src/IW5/Structs.hpp b/src/IW5/Structs.hpp index c26b42f..ea493db 100644 --- a/src/IW5/Structs.hpp +++ b/src/IW5/Structs.hpp @@ -1347,6 +1347,7 @@ namespace ZoneTool __declspec(align(2)) XAnimPartTransData u; }; +#pragma pack(push, 4) struct XAnimDeltaPartQuatDataFrames2 { __int16(*frames)[2]; @@ -1368,21 +1369,21 @@ namespace ZoneTool struct XAnimDeltaPartQuatDataFrames { __int16(*frames)[4]; - XAnimDynamicIndices indices; + XAnimIndices indices; }; union XAnimDeltaPartQuatData { XAnimDeltaPartQuatDataFrames frames; - __int16 frame0[2]; + __int16 frame0[4]; }; struct XAnimDeltaPartQuat { unsigned __int16 size; - __declspec(align(4)) XAnimDeltaPartQuatData u; + XAnimDeltaPartQuatData u; }; - + struct XAnimDeltaPart { XAnimPartTrans* trans; @@ -1390,7 +1391,6 @@ namespace ZoneTool XAnimDeltaPartQuat* quat; }; -#pragma pack(push, 4) struct XAnimNotifyInfo { short name;