From b5d50120ad44353afcf2c3f2220c3561e4fe6fdd Mon Sep 17 00:00:00 2001 From: mo Date: Sat, 27 Jun 2026 13:16:50 +0100 Subject: [PATCH] feat: T4 xanim binary dumping and loading (#854) --- docs/SupportedAssetTypes.md | 2 +- src/Common/Game/T4/T4_Assets.h | 4 ++-- src/ObjLoading/Game/T4/ObjLoaderT4.cpp | 2 ++ src/ObjLoading/XAnim/XAnimLoader.cpp.template | 4 +++- src/ObjLoading/XAnim/XAnimLoader.h.template | 2 +- src/ObjWriting/Game/T4/ObjWriterT4.cpp | 2 ++ src/ObjWriting/XAnim/XAnimDumper.cpp.template | 6 ++++-- src/ObjWriting/XAnim/XAnimDumper.h.template | 2 +- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/SupportedAssetTypes.md b/docs/SupportedAssetTypes.md index 73a570c0..06c26e51 100644 --- a/docs/SupportedAssetTypes.md +++ b/docs/SupportedAssetTypes.md @@ -129,7 +129,7 @@ The following section specify which assets are supported to be dumped to disk (u | PhysPreset | ❌ | ❌ | | | PhysConstraints | ❌ | ❌ | | | DestructibleDef | ❌ | ❌ | | -| XAnimParts | ❌ | ❌ | | +| XAnimParts | ✅ | ✅ | | | XModel | ✅ | ❌ | Model data can be exported to `XMODEL_EXPORT/XMODEL_BIN`, `OBJ`, `GLB/GLTF`. | | Material | ❌ | ❌ | | | MaterialTechniqueSet | ❌ | ❌ | | diff --git a/src/Common/Game/T4/T4_Assets.h b/src/Common/Game/T4/T4_Assets.h index 820bcd57..21e75c91 100644 --- a/src/Common/Game/T4/T4_Assets.h +++ b/src/Common/Game/T4/T4_Assets.h @@ -236,8 +236,8 @@ namespace T4 struct XAnimPartTransFrames { - float mins[3]; - float size[3]; + vec3_t mins; + vec3_t size; XAnimDynamicFrames frames; XAnimDynamicIndicesTrans indices; }; diff --git a/src/ObjLoading/Game/T4/ObjLoaderT4.cpp b/src/ObjLoading/Game/T4/ObjLoaderT4.cpp index 5eb38700..080fdf68 100644 --- a/src/ObjLoading/Game/T4/ObjLoaderT4.cpp +++ b/src/ObjLoading/Game/T4/ObjLoaderT4.cpp @@ -3,6 +3,7 @@ #include "Asset/GlobalAssetPoolsLoader.h" #include "Game/T4/AssetMarkerT4.h" #include "Game/T4/T4.h" +#include "Game/T4/XAnim/XAnimLoaderT4.h" #include "Localize/AssetLoaderLocalizeT4.h" using namespace T4; @@ -85,6 +86,7 @@ namespace { auto& memory = zone.Memory(); + collection.AddAssetCreator(xanim::CreateLoaderT4(memory, searchPath, zone)); collection.AddAssetCreator(localize::CreateLoaderT4(memory, searchPath, zone)); } } // namespace diff --git a/src/ObjLoading/XAnim/XAnimLoader.cpp.template b/src/ObjLoading/XAnim/XAnimLoader.cpp.template index 315bf917..e074f4b8 100644 --- a/src/ObjLoading/XAnim/XAnimLoader.cpp.template +++ b/src/ObjLoading/XAnim/XAnimLoader.cpp.template @@ -1,4 +1,4 @@ -#options GAME(IW3, IW4, IW5, T5, T6) +#options GAME(IW3, IW4, IW5, T4, T5, T6) #filename "Game/" + GAME + "/XAnim/XAnimLoader" + GAME + ".cpp" @@ -12,6 +12,8 @@ #elif GAME == "IW5" #define FEATURE_IW5 #define HAS_DELTA_QUAT_3D +#elif GAME == "T4" +#define FEATURE_T4 #elif GAME == "T5" #define FEATURE_T5 #elif GAME == "T6" diff --git a/src/ObjLoading/XAnim/XAnimLoader.h.template b/src/ObjLoading/XAnim/XAnimLoader.h.template index 0d4073a7..abc4c51c 100644 --- a/src/ObjLoading/XAnim/XAnimLoader.h.template +++ b/src/ObjLoading/XAnim/XAnimLoader.h.template @@ -1,4 +1,4 @@ -#options GAME(IW3, IW4, IW5, T5, T6) +#options GAME(IW3, IW4, IW5, T4, T5, T6) #filename "Game/" + GAME + "/XAnim/XAnimLoader" + GAME + ".h" diff --git a/src/ObjWriting/Game/T4/ObjWriterT4.cpp b/src/ObjWriting/Game/T4/ObjWriterT4.cpp index b73f3a5e..50f72e2b 100644 --- a/src/ObjWriting/Game/T4/ObjWriterT4.cpp +++ b/src/ObjWriting/Game/T4/ObjWriterT4.cpp @@ -1,6 +1,7 @@ #include "ObjWriterT4.h" #include "Game/T4/Image/ImageDumperT4.h" +#include "Game/T4/XAnim/XAnimDumperT4.h" #include "Game/T4/XModel/XModelDumperT4.h" #include "Localize/LocalizeDumperT4.h" #include "RawFile/RawFileDumperT4.h" @@ -10,6 +11,7 @@ using namespace T4; void ObjWriter::RegisterAssetDumpers(AssetDumpingContext& context) { + RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); RegisterAssetDumper(std::make_unique()); diff --git a/src/ObjWriting/XAnim/XAnimDumper.cpp.template b/src/ObjWriting/XAnim/XAnimDumper.cpp.template index f6f2cd55..b9aaf92e 100644 --- a/src/ObjWriting/XAnim/XAnimDumper.cpp.template +++ b/src/ObjWriting/XAnim/XAnimDumper.cpp.template @@ -1,4 +1,4 @@ -#options GAME(IW3, IW4, IW5, T5, T6) +#options GAME(IW3, IW4, IW5, T4, T5, T6) #filename "Game/" + GAME + "/XAnim/XAnimDumper" + GAME + ".cpp" @@ -12,6 +12,8 @@ #elif GAME == "IW5" #define FEATURE_IW5 #define HAS_DELTA_QUAT_3D +#elif GAME == "T4" +#define FEATURE_T4 #elif GAME == "T5" #define FEATURE_T5 #elif GAME == "T6" @@ -346,7 +348,7 @@ namespace xanim WriteCompiledXAnim( *assetFile, commonParts, -#if defined(FEATURE_IW3) +#if defined(FEATURE_IW3) || defined(FEATURE_T4) CompiledXAnimVersion::VERSION_17 #elif defined(FEATURE_IW4) || defined(FEATURE_IW5) // Make sure we dump as many anims as possible in an IW3 modtools compatible way diff --git a/src/ObjWriting/XAnim/XAnimDumper.h.template b/src/ObjWriting/XAnim/XAnimDumper.h.template index 40fb47dd..39c19dd5 100644 --- a/src/ObjWriting/XAnim/XAnimDumper.h.template +++ b/src/ObjWriting/XAnim/XAnimDumper.h.template @@ -1,4 +1,4 @@ -#options GAME(IW3, IW4, IW5, T5, T6) +#options GAME(IW3, IW4, IW5, T4, T5, T6) #filename "Game/" + GAME + "/XAnim/XAnimDumper" + GAME + ".h"