From 5e31be9bac48532ea4ddce5fb345b28e51a1a84f Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 29 Dec 2021 00:20:54 +0100 Subject: [PATCH] Finalize menu assets after loading all assets --- src/Linker/Game/IW3/ZoneCreatorIW3.cpp | 2 ++ src/Linker/Game/IW4/ZoneCreatorIW4.cpp | 2 ++ src/Linker/Game/IW5/ZoneCreatorIW5.cpp | 2 ++ src/Linker/Game/T5/ZoneCreatorT5.cpp | 2 ++ src/Linker/Game/T6/ZoneCreatorT6.cpp | 2 ++ .../AssetLoading/AssetLoadingManager.cpp | 2 +- src/ObjLoading/AssetLoading/AssetLoadingManager.h | 6 +++--- src/ObjLoading/AssetLoading/IAssetLoader.h | 5 +++++ src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp | 6 ++++++ src/ObjLoading/Game/IW3/ObjLoaderIW3.h | 5 +++-- .../Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp | 6 ++++++ .../Game/IW4/AssetLoaders/AssetLoaderMenuList.h | 1 + .../Game/IW4/Menu/MenuConversionZoneStateIW4.cpp | 2 ++ src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp | 8 +++++++- src/ObjLoading/Game/IW4/ObjLoaderIW4.h | 5 +++-- src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp | 6 ++++++ src/ObjLoading/Game/IW5/ObjLoaderIW5.h | 5 +++-- src/ObjLoading/Game/T5/ObjLoaderT5.cpp | 6 ++++++ src/ObjLoading/Game/T5/ObjLoaderT5.h | 5 +++-- src/ObjLoading/Game/T6/ObjLoaderT6.cpp | 11 +++++++++-- src/ObjLoading/Game/T6/ObjLoaderT6.h | 5 +++-- src/ObjLoading/IObjLoader.h | 1 + src/ObjLoading/ObjLoading.cpp | 14 +++++++++++++- src/ObjLoading/ObjLoading.h | 1 + 24 files changed, 92 insertions(+), 18 deletions(-) diff --git a/src/Linker/Game/IW3/ZoneCreatorIW3.cpp b/src/Linker/Game/IW3/ZoneCreatorIW3.cpp index 2cef97a3..b4356156 100644 --- a/src/Linker/Game/IW3/ZoneCreatorIW3.cpp +++ b/src/Linker/Game/IW3/ZoneCreatorIW3.cpp @@ -92,5 +92,7 @@ std::unique_ptr ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& return nullptr; } + ObjLoading::FinalizeAssetsForZone(assetLoadingContext.get()); + return zone; } diff --git a/src/Linker/Game/IW4/ZoneCreatorIW4.cpp b/src/Linker/Game/IW4/ZoneCreatorIW4.cpp index a9ba22f5..b14fe308 100644 --- a/src/Linker/Game/IW4/ZoneCreatorIW4.cpp +++ b/src/Linker/Game/IW4/ZoneCreatorIW4.cpp @@ -91,5 +91,7 @@ std::unique_ptr ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& return nullptr; } + ObjLoading::FinalizeAssetsForZone(assetLoadingContext.get()); + return zone; } diff --git a/src/Linker/Game/IW5/ZoneCreatorIW5.cpp b/src/Linker/Game/IW5/ZoneCreatorIW5.cpp index 5104ef44..62e93ac8 100644 --- a/src/Linker/Game/IW5/ZoneCreatorIW5.cpp +++ b/src/Linker/Game/IW5/ZoneCreatorIW5.cpp @@ -91,5 +91,7 @@ std::unique_ptr ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& return nullptr; } + ObjLoading::FinalizeAssetsForZone(assetLoadingContext.get()); + return zone; } diff --git a/src/Linker/Game/T5/ZoneCreatorT5.cpp b/src/Linker/Game/T5/ZoneCreatorT5.cpp index 988c439c..2826f258 100644 --- a/src/Linker/Game/T5/ZoneCreatorT5.cpp +++ b/src/Linker/Game/T5/ZoneCreatorT5.cpp @@ -92,5 +92,7 @@ std::unique_ptr ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& return nullptr; } + ObjLoading::FinalizeAssetsForZone(assetLoadingContext.get()); + return zone; } diff --git a/src/Linker/Game/T6/ZoneCreatorT6.cpp b/src/Linker/Game/T6/ZoneCreatorT6.cpp index c65d1bb2..965d6f44 100644 --- a/src/Linker/Game/T6/ZoneCreatorT6.cpp +++ b/src/Linker/Game/T6/ZoneCreatorT6.cpp @@ -148,5 +148,7 @@ std::unique_ptr ZoneCreator::CreateZoneForDefinition(ZoneCreationContext& return nullptr; } + ObjLoading::FinalizeAssetsForZone(assetLoadingContext.get()); + return zone; } diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp index a9ae7f42..9e885724 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp @@ -1,7 +1,7 @@ #include "AssetLoadingManager.h" #include -AssetLoadingManager::AssetLoadingManager(const std::unordered_map>& assetLoadersByType, AssetLoadingContext& context): +AssetLoadingManager::AssetLoadingManager(const std::map>& assetLoadersByType, AssetLoadingContext& context): m_asset_loaders_by_type(assetLoadersByType), m_context(context), m_last_dependency_loaded(nullptr) diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.h b/src/ObjLoading/AssetLoading/AssetLoadingManager.h index 3f2f931c..62a3007d 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.h +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.h @@ -1,5 +1,5 @@ #pragma once -#include +#include #include "AssetLoadingContext.h" #include "IAssetLoader.h" @@ -7,7 +7,7 @@ class AssetLoadingManager final : public IAssetLoadingManager { - const std::unordered_map>& m_asset_loaders_by_type; + const std::map>& m_asset_loaders_by_type; AssetLoadingContext& m_context; XAssetInfoGeneric* m_last_dependency_loaded; @@ -17,7 +17,7 @@ class AssetLoadingManager final : public IAssetLoadingManager XAssetInfoGeneric* AddAsset(asset_type_t assetType, const std::string& assetName, void* asset, std::vector dependencies, std::vector usedScriptStrings, Zone* zone); public: - AssetLoadingManager(const std::unordered_map>& assetLoadersByType, AssetLoadingContext& context); + AssetLoadingManager(const std::map>& assetLoadersByType, AssetLoadingContext& context); bool LoadAssetFromLoader(asset_type_t assetType, const std::string& assetName); diff --git a/src/ObjLoading/AssetLoading/IAssetLoader.h b/src/ObjLoading/AssetLoading/IAssetLoader.h index 3b9f26cf..7ecde324 100644 --- a/src/ObjLoading/AssetLoading/IAssetLoader.h +++ b/src/ObjLoading/AssetLoading/IAssetLoader.h @@ -45,4 +45,9 @@ public: { return false; } + + virtual void FinalizeAssetsForZone(AssetLoadingContext* context) const + { + // Do nothing by default + } }; diff --git a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp index 3f57c37c..8320b26e 100644 --- a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp +++ b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp @@ -178,3 +178,9 @@ bool ObjLoader::LoadAssetForZone(AssetLoadingContext* context, const asset_type_ AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, *context); return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); } + +void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext* context) const +{ + for (const auto& [type, loader] : m_asset_loaders_by_type) + loader->FinalizeAssetsForZone(context); +} \ No newline at end of file diff --git a/src/ObjLoading/Game/IW3/ObjLoaderIW3.h b/src/ObjLoading/Game/IW3/ObjLoaderIW3.h index a010049e..1e65e614 100644 --- a/src/ObjLoading/Game/IW3/ObjLoaderIW3.h +++ b/src/ObjLoading/Game/IW3/ObjLoaderIW3.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include "IObjLoader.h" @@ -12,7 +12,7 @@ namespace IW3 { class ObjLoader final : public IObjLoader { - std::unordered_map> m_asset_loaders_by_type; + std::map> m_asset_loaders_by_type; static void LoadImageFromIwi(GfxImage* image, ISearchPath* searchPath, Zone* zone); static void LoadImageFromLoadDef(GfxImage* image, Zone* zone); @@ -32,5 +32,6 @@ namespace IW3 void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone) const override; bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName) const override; + void FinalizeAssetsForZone(AssetLoadingContext* context) const override; }; } diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp index ba63a320..8095ec6d 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp @@ -5,6 +5,7 @@ #include "ObjLoading.h" #include "Game/IW4/IW4.h" +#include "Game/IW4/Menu/MenuConversionZoneStateIW4.h" #include "Game/IW4/Menu/MenuConverterIW4.h" #include "Parsing/Menu/MenuFileReader.h" #include "Pool/GlobalAssetPool.h" @@ -158,3 +159,8 @@ bool AssetLoaderMenuList::LoadFromRaw(const std::string& assetName, ISearchPath* return true; } + +void AssetLoaderMenuList::FinalizeAssetsForZone(AssetLoadingContext* context) const +{ + context->GetZoneAssetLoaderState()->FinalizeSupportingData(); +} diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.h b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.h index e9ed0cbe..258b7bf9 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.h +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.h @@ -23,5 +23,6 @@ namespace IW4 _NODISCARD void* CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) override; _NODISCARD bool CanLoadFromRaw() const override; bool LoadFromRaw(const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const override; + void FinalizeAssetsForZone(AssetLoadingContext* context) const override; }; } diff --git a/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp b/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp index 88d5ea82..178c6758 100644 --- a/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp +++ b/src/ObjLoading/Game/IW4/Menu/MenuConversionZoneStateIW4.cpp @@ -1,5 +1,7 @@ #include "MenuConversionZoneStateIW4.h" +#include + using namespace IW4; MenuConversionZoneState::MenuConversionZoneState() diff --git a/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp b/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp index b6f6e1ff..8e576100 100644 --- a/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp +++ b/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp @@ -189,4 +189,10 @@ bool ObjLoader::LoadAssetForZone(AssetLoadingContext* context, asset_type_t asse { AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, *context); return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); -} \ No newline at end of file +} + +void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext* context) const +{ + for (const auto& [type, loader] : m_asset_loaders_by_type) + loader->FinalizeAssetsForZone(context); +} diff --git a/src/ObjLoading/Game/IW4/ObjLoaderIW4.h b/src/ObjLoading/Game/IW4/ObjLoaderIW4.h index 7b504c60..5a24078a 100644 --- a/src/ObjLoading/Game/IW4/ObjLoaderIW4.h +++ b/src/ObjLoading/Game/IW4/ObjLoaderIW4.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include "IObjLoader.h" @@ -12,7 +12,7 @@ namespace IW4 { class ObjLoader final : public IObjLoader { - std::unordered_map> m_asset_loaders_by_type; + std::map> m_asset_loaders_by_type; static void LoadImageFromIwi(GfxImage* image, ISearchPath* searchPath, Zone* zone); static void LoadImageFromLoadDef(GfxImage* image, Zone* zone); @@ -32,5 +32,6 @@ namespace IW4 void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone) const override; bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName) const override; + void FinalizeAssetsForZone(AssetLoadingContext* context) const override; }; } diff --git a/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp b/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp index b35da499..804c3c4c 100644 --- a/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp +++ b/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp @@ -191,3 +191,9 @@ bool ObjLoader::LoadAssetForZone(AssetLoadingContext* context, asset_type_t asse AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, *context); return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); } + +void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext* context) const +{ + for (const auto& [type, loader] : m_asset_loaders_by_type) + loader->FinalizeAssetsForZone(context); +} diff --git a/src/ObjLoading/Game/IW5/ObjLoaderIW5.h b/src/ObjLoading/Game/IW5/ObjLoaderIW5.h index 2dbf37a3..680e5454 100644 --- a/src/ObjLoading/Game/IW5/ObjLoaderIW5.h +++ b/src/ObjLoading/Game/IW5/ObjLoaderIW5.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include "IObjLoader.h" @@ -12,7 +12,7 @@ namespace IW5 { class ObjLoader final : public IObjLoader { - std::unordered_map> m_asset_loaders_by_type; + std::map> m_asset_loaders_by_type; static void LoadImageFromIwi(GfxImage* image, ISearchPath* searchPath, Zone* zone); static void LoadImageFromLoadDef(GfxImage* image, Zone* zone); @@ -32,5 +32,6 @@ namespace IW5 void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone) const override; bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName) const override; + void FinalizeAssetsForZone(AssetLoadingContext* context) const override; }; } diff --git a/src/ObjLoading/Game/T5/ObjLoaderT5.cpp b/src/ObjLoading/Game/T5/ObjLoaderT5.cpp index 392cf517..562710a8 100644 --- a/src/ObjLoading/Game/T5/ObjLoaderT5.cpp +++ b/src/ObjLoading/Game/T5/ObjLoaderT5.cpp @@ -185,3 +185,9 @@ bool ObjLoader::LoadAssetForZone(AssetLoadingContext* context, asset_type_t asse AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, *context); return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); } + +void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext* context) const +{ + for (const auto& [type, loader] : m_asset_loaders_by_type) + loader->FinalizeAssetsForZone(context); +} \ No newline at end of file diff --git a/src/ObjLoading/Game/T5/ObjLoaderT5.h b/src/ObjLoading/Game/T5/ObjLoaderT5.h index 980d1e73..c7377dde 100644 --- a/src/ObjLoading/Game/T5/ObjLoaderT5.h +++ b/src/ObjLoading/Game/T5/ObjLoaderT5.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include "IObjLoader.h" @@ -12,7 +12,7 @@ namespace T5 { class ObjLoader final : public IObjLoader { - std::unordered_map> m_asset_loaders_by_type; + std::map> m_asset_loaders_by_type; static void LoadImageFromIwi(GfxImage* image, ISearchPath* searchPath, Zone* zone); static void LoadImageFromLoadDef(GfxImage* image, Zone* zone); @@ -32,5 +32,6 @@ namespace T5 void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone) const override; bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName) const override; + void FinalizeAssetsForZone(AssetLoadingContext* context) const override; }; } diff --git a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp index 3ede1764..13b385e7 100644 --- a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp +++ b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp @@ -145,7 +145,8 @@ namespace T6 return nullptr; } - void ObjLoader::LoadSoundBankFromLinkedInfo(ISearchPath* searchPath, const std::string& soundBankFileName, const SndRuntimeAssetBank* sndBankLinkedInfo, Zone* zone, std::set& loadedBanksForZone, std::stack& dependenciesToLoad) + void ObjLoader::LoadSoundBankFromLinkedInfo(ISearchPath* searchPath, const std::string& soundBankFileName, const SndRuntimeAssetBank* sndBankLinkedInfo, Zone* zone, + std::set& loadedBanksForZone, std::stack& dependenciesToLoad) { if (loadedBanksForZone.find(soundBankFileName) == loadedBanksForZone.end()) { @@ -183,7 +184,7 @@ namespace T6 LoadSoundBankFromLinkedInfo(searchPath, soundBankFileName, &sndBank->loadAssetBank, zone, loadedBanksForZone, dependenciesToLoad); } - while(!dependenciesToLoad.empty()) + while (!dependenciesToLoad.empty()) { auto dependencyFileName = dependenciesToLoad.top(); dependenciesToLoad.pop(); @@ -454,4 +455,10 @@ namespace T6 AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, *context); return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); } + + void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext* context) const + { + for (const auto& [type, loader] : m_asset_loaders_by_type) + loader->FinalizeAssetsForZone(context); + } } diff --git a/src/ObjLoading/Game/T6/ObjLoaderT6.h b/src/ObjLoading/Game/T6/ObjLoaderT6.h index 92e21948..73c73eed 100644 --- a/src/ObjLoading/Game/T6/ObjLoaderT6.h +++ b/src/ObjLoading/Game/T6/ObjLoaderT6.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -19,7 +19,7 @@ namespace T6 static const int IPAK_READ_HASH; static const int GLOBAL_HASH; - std::unordered_map> m_asset_loaders_by_type; + std::map> m_asset_loaders_by_type; static bool VerifySoundBankChecksum(const SoundBank* soundBank, const SndRuntimeAssetBank& sndRuntimeAssetBank); static SoundBank* LoadSoundBankForZone(ISearchPath* searchPath, const std::string& soundBankFileName, Zone* zone); @@ -48,5 +48,6 @@ namespace T6 void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone) const override; bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName) const override; + void FinalizeAssetsForZone(AssetLoadingContext* context) const override; }; } diff --git a/src/ObjLoading/IObjLoader.h b/src/ObjLoading/IObjLoader.h index 171c6b4f..d38a26e8 100644 --- a/src/ObjLoading/IObjLoader.h +++ b/src/ObjLoading/IObjLoader.h @@ -37,4 +37,5 @@ public: virtual void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone) const = 0; virtual bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName) const = 0; + virtual void FinalizeAssetsForZone(AssetLoadingContext* context) const = 0; }; \ No newline at end of file diff --git a/src/ObjLoading/ObjLoading.cpp b/src/ObjLoading/ObjLoading.cpp index eae6aa11..25c86747 100644 --- a/src/ObjLoading/ObjLoading.cpp +++ b/src/ObjLoading/ObjLoading.cpp @@ -68,7 +68,7 @@ void ObjLoading::LoadIWDsInSearchPath(ISearchPath* searchPath) if (file->is_open()) { auto iwd = std::make_unique(path, std::move(file)); - + if (iwd->Initialize()) { IWD::Repository.AddContainer(std::move(iwd), searchPath); @@ -106,3 +106,15 @@ bool ObjLoading::LoadAssetForZone(AssetLoadingContext* context, const asset_type return false; } + +void ObjLoading::FinalizeAssetsForZone(AssetLoadingContext* context) +{ + for (const auto* loader : OBJ_LOADERS) + { + if (loader->SupportsZone(context->m_zone)) + { + loader->FinalizeAssetsForZone(context); + return; + } + } +} diff --git a/src/ObjLoading/ObjLoading.h b/src/ObjLoading/ObjLoading.h index c66b716e..663014c3 100644 --- a/src/ObjLoading/ObjLoading.h +++ b/src/ObjLoading/ObjLoading.h @@ -55,4 +55,5 @@ public: static void LoadObjDataForZone(ISearchPath* searchPath, Zone* zone); static bool LoadAssetForZone(AssetLoadingContext* context, asset_type_t assetType, const std::string& assetName); + static void FinalizeAssetsForZone(AssetLoadingContext* context); };