From c524cb007ade64f595675e3a6bf81abf579fde46 Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 23 Dec 2024 22:55:58 +0100 Subject: [PATCH] chore: implement obj loading skeleton with localize asset --- src/Linker/ZoneCreation/ZoneCreator.cpp | 2 +- src/ObjLoading/Asset/AssetCreationContext.cpp | 2 +- src/ObjLoading/Asset/AssetCreationContext.h | 9 +- .../Asset/AssetCreatorCollection.cpp | 6 +- src/ObjLoading/Asset/AssetCreatorCollection.h | 2 +- src/ObjLoading/Asset/GlobalAssetPoolsLoader.h | 46 +++ src/ObjLoading/Asset/IAssetCreator.cpp | 5 + src/ObjLoading/Asset/IAssetCreator.h | 1 + src/ObjLoading/Asset/IDefaultAssetCreator.h | 17 +- .../IW3/AssetLoaders/AssetLoaderGfxImage.h | 17 -- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 36 --- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 19 -- .../IW3/AssetLoaders/AssetLoaderRawFile.cpp | 44 --- .../IW3/AssetLoaders/AssetLoaderRawFile.h | 17 -- .../AssetLoaderImageIW3.cpp} | 36 +-- .../Game/IW3/Image/AssetLoaderImageIW3.h | 21 ++ .../Game/IW3/Image/DefaultCreatorImageIW3.cpp | 16 ++ .../Game/IW3/Image/DefaultCreatorImageIW3.h | 18 ++ .../IW3/Localize/AssetLoaderLocalizeIW3.cpp | 23 ++ .../IW3/Localize/AssetLoaderLocalizeIW3.h | 23 ++ src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp | 170 +++++++---- src/ObjLoading/Game/IW3/ObjLoaderIW3.h | 16 +- .../IW3/RawFile/AssetLoaderRawFileIW3.cpp | 35 +++ .../Game/IW3/RawFile/AssetLoaderRawFileIW3.h | 21 ++ .../IW3/RawFile/DefaultCreatorRawFileIW3.cpp | 16 ++ .../IW3/RawFile/DefaultCreatorRawFileIW3.h | 18 ++ .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 36 --- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 19 -- .../IW4/Localize/AssetLoaderLocalizeIW4.cpp | 23 ++ .../IW4/Localize/AssetLoaderLocalizeIW4.h | 25 ++ src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp | 243 +++++++++------- src/ObjLoading/Game/IW4/ObjLoaderIW4.h | 17 +- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 36 --- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 19 -- .../IW5/Localize/AssetLoaderLocalizeIW5.cpp | 23 ++ .../IW5/Localize/AssetLoaderLocalizeIW5.h | 25 ++ src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp | 258 +++++++++-------- src/ObjLoading/Game/IW5/ObjLoaderIW5.h | 16 +- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 36 --- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 19 -- .../T5/Localize/AssetLoaderLocalizeT5.cpp | 23 ++ .../Game/T5/Localize/AssetLoaderLocalizeT5.h | 25 ++ src/ObjLoading/Game/T5/ObjLoaderT5.cpp | 194 ++++++++----- src/ObjLoading/Game/T5/ObjLoaderT5.h | 16 +- .../AssetLoaders/AssetLoaderLocalizeEntry.cpp | 36 --- .../AssetLoaders/AssetLoaderLocalizeEntry.h | 18 -- .../T6/Localize/AssetLoaderLocalizeT6.cpp | 23 ++ .../Game/T6/Localize/AssetLoaderLocalizeT6.h | 25 ++ src/ObjLoading/Game/T6/ObjLoaderT6.cpp | 267 ++++++++++-------- src/ObjLoading/Game/T6/ObjLoaderT6.h | 10 +- src/ObjLoading/IObjLoader.h | 5 +- .../Localize/CommonLocalizeLoader.cpp | 52 ++++ .../Localize/CommonLocalizeLoader.h | 32 +++ .../Localize/LocalizeCommonAssetLoader.cpp | 42 --- .../Localize/LocalizeCommonAssetLoader.h | 22 -- .../Localize/LocalizeReadingZoneState.cpp | 11 - .../ILocalizeFileDuplicationChecker.h} | 12 +- .../Localize/Parsing/LocalizeFileParser.cpp | 4 +- .../Localize/Parsing/LocalizeFileParser.h | 2 +- .../Parsing/LocalizeFileParserState.cpp | 4 +- .../Parsing/LocalizeFileParserState.h | 8 +- .../Localize/Parsing/LocalizeFileReader.cpp | 6 +- .../Localize/Parsing/LocalizeFileReader.h | 6 +- .../SequenceLocalizeFileLanguageValue.cpp | 2 +- 64 files changed, 1238 insertions(+), 1038 deletions(-) create mode 100644 src/ObjLoading/Asset/GlobalAssetPoolsLoader.h delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.h delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.cpp delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.h delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.cpp delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.h rename src/ObjLoading/Game/IW3/{AssetLoaders/AssetLoaderGfxImage.cpp => Image/AssetLoaderImageIW3.cpp} (75%) create mode 100644 src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.h create mode 100644 src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp create mode 100644 src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.h create mode 100644 src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.cpp create mode 100644 src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.h create mode 100644 src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.cpp create mode 100644 src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.h create mode 100644 src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp create mode 100644 src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.h delete mode 100644 src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp delete mode 100644 src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h create mode 100644 src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.cpp create mode 100644 src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.h delete mode 100644 src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp delete mode 100644 src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h create mode 100644 src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.cpp create mode 100644 src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.h delete mode 100644 src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp delete mode 100644 src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h create mode 100644 src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.cpp create mode 100644 src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.h delete mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp delete mode 100644 src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.h create mode 100644 src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.cpp create mode 100644 src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.h create mode 100644 src/ObjLoading/Localize/CommonLocalizeLoader.cpp create mode 100644 src/ObjLoading/Localize/CommonLocalizeLoader.h delete mode 100644 src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp delete mode 100644 src/ObjLoading/Localize/LocalizeCommonAssetLoader.h delete mode 100644 src/ObjLoading/Localize/LocalizeReadingZoneState.cpp rename src/ObjLoading/Localize/{LocalizeReadingZoneState.h => Parsing/ILocalizeFileDuplicationChecker.h} (51%) diff --git a/src/Linker/ZoneCreation/ZoneCreator.cpp b/src/Linker/ZoneCreation/ZoneCreator.cpp index 8535829a..a7f6422d 100644 --- a/src/Linker/ZoneCreation/ZoneCreator.cpp +++ b/src/Linker/ZoneCreation/ZoneCreator.cpp @@ -58,7 +58,7 @@ namespace zone_creator AssetCreatorCollection creatorCollection(*zone); objCompiler->ConfigureCreatorCollection(creatorCollection, *zone, *context.m_definition); - objLoader->ConfigureCreatorCollection(creatorCollection); + objLoader->ConfigureCreatorCollection(creatorCollection, *zone, *context.m_asset_search_path); AssetCreationContext creationContext(zone.get(), &creatorCollection, &ignoredAssetLookup); diff --git a/src/ObjLoading/Asset/AssetCreationContext.cpp b/src/ObjLoading/Asset/AssetCreationContext.cpp index 58159f12..2e71bdca 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.cpp +++ b/src/ObjLoading/Asset/AssetCreationContext.cpp @@ -79,7 +79,7 @@ XAssetInfoGeneric* AssetCreationContext::AddAssetGeneric(GenericAssetRegistratio return addedAsset; } -XAssetInfoGeneric* AssetCreationContext::LoadDefaultAssetDependency(const asset_type_t assetType, const std::string& assetName) const +XAssetInfoGeneric* AssetCreationContext::LoadDefaultAssetDependency(const asset_type_t assetType, const std::string& assetName) { const auto result = m_creators->CreateDefaultAsset(assetType, assetName, *this); if (result.HasTakenAction() && !result.HasFailed()) diff --git a/src/ObjLoading/Asset/AssetCreationContext.h b/src/ObjLoading/Asset/AssetCreationContext.h index 1e837494..f4e8d117 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.h +++ b/src/ObjLoading/Asset/AssetCreationContext.h @@ -39,6 +39,13 @@ public: return static_cast*>(AddAssetGeneric(std::move(registration))); } + template XAssetInfo* AddAsset(std::string assetName, typename AssetType::Type* asset) + { + static_assert(std::is_base_of_v); + + return static_cast*>(AddAssetGeneric(AssetRegistration(std::move(assetName), asset))); + } + XAssetInfoGeneric* AddAssetGeneric(GenericAssetRegistration registration) const; template XAssetInfo* LoadDependency(const std::string& assetName) @@ -76,7 +83,7 @@ public: } private: - [[nodiscard]] XAssetInfoGeneric* LoadDefaultAssetDependency(asset_type_t assetType, const std::string& assetName) const; + [[nodiscard]] XAssetInfoGeneric* LoadDefaultAssetDependency(asset_type_t assetType, const std::string& assetName); Zone* m_zone; const AssetCreatorCollection* m_creators; diff --git a/src/ObjLoading/Asset/AssetCreatorCollection.cpp b/src/ObjLoading/Asset/AssetCreatorCollection.cpp index eb7c180f..cdea92c8 100644 --- a/src/ObjLoading/Asset/AssetCreatorCollection.cpp +++ b/src/ObjLoading/Asset/AssetCreatorCollection.cpp @@ -44,15 +44,13 @@ AssetCreationResult AssetCreatorCollection::CreateAsset(const asset_type_t asset return AssetCreationResult::NoAction(); } -AssetCreationResult - AssetCreatorCollection::CreateDefaultAsset(const asset_type_t assetType, const std::string& assetName, const AssetCreationContext& context) const +AssetCreationResult AssetCreatorCollection::CreateDefaultAsset(const asset_type_t assetType, const std::string& assetName, AssetCreationContext& context) const { assert(assetType >= 0 && static_cast(assetType) < m_default_asset_creators_by_type.size()); if (assetType >= 0 && static_cast(assetType) < m_default_asset_creators_by_type.size() && m_default_asset_creators_by_type[assetType]) { - auto defaultAsset = m_default_asset_creators_by_type[assetType]->CreateDefaultAsset(assetName); - return AssetCreationResult::Success(context.AddAssetGeneric(std::move(defaultAsset))); + return m_default_asset_creators_by_type[assetType]->CreateDefaultAsset(assetName, context); } return AssetCreationResult::NoAction(); diff --git a/src/ObjLoading/Asset/AssetCreatorCollection.h b/src/ObjLoading/Asset/AssetCreatorCollection.h index 89604ab7..206b203d 100644 --- a/src/ObjLoading/Asset/AssetCreatorCollection.h +++ b/src/ObjLoading/Asset/AssetCreatorCollection.h @@ -22,7 +22,7 @@ public: void AddDefaultAssetCreator(std::unique_ptr defaultAssetCreator); AssetCreationResult CreateAsset(asset_type_t assetType, const std::string& assetName, AssetCreationContext& context) const; - AssetCreationResult CreateDefaultAsset(asset_type_t assetType, const std::string& assetName, const AssetCreationContext& context) const; + AssetCreationResult CreateDefaultAsset(asset_type_t assetType, const std::string& assetName, AssetCreationContext& context) const; void FinalizeZone(AssetCreationContext& context) const; private: diff --git a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h new file mode 100644 index 00000000..b7a8b69b --- /dev/null +++ b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h @@ -0,0 +1,46 @@ +#pragma once +#include "Asset/IAssetCreator.h" +#include "Pool/GlobalAssetPool.h" + +template class GlobalAssetPoolsLoader : public AssetCreator +{ +public: + static_assert(std::is_base_of_v); + + GlobalAssetPoolsLoader(Zone& zone) + : m_zone(zone) + { + } + + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override + { + auto* existingAsset = GlobalAssetPool::GetAssetByName(assetName); + + if (!existingAsset) + return AssetCreationResult::Failure(); + + AssetRegistration registration(assetName, existingAsset->Asset()); + + for (const auto* dependency : existingAsset->m_dependencies) + { + auto* newDependency = context.LoadDependencyGeneric(dependency->m_type, dependency->m_name); + if (newDependency) + registration.AddDependency(newDependency); + else + return AssetCreationResult::Failure(); + } + + for (const auto& indirectAssetReference : existingAsset->m_indirect_asset_references) + registration.AddIndirectAssetReference(context.LoadIndirectAssetReferenceGeneric(indirectAssetReference.m_type, indirectAssetReference.m_name)); + + // Make sure any used script string is available in the created zone + // The replacement of the scr_string_t values will be done upon writing + for (const auto scrString : existingAsset->m_used_script_strings) + m_zone.m_script_strings.AddOrGetScriptString(existingAsset->m_zone->m_script_strings.CValue(scrString)); + + return AssetCreationResult::Success(context.AddAsset(std::move(registration))); + } + +private: + Zone& m_zone; +}; diff --git a/src/ObjLoading/Asset/IAssetCreator.cpp b/src/ObjLoading/Asset/IAssetCreator.cpp index b2482ea1..abaa88e5 100644 --- a/src/ObjLoading/Asset/IAssetCreator.cpp +++ b/src/ObjLoading/Asset/IAssetCreator.cpp @@ -15,6 +15,11 @@ AssetCreationResult AssetCreationResult::NoAction() return AssetCreationResult(false, nullptr); } +bool AssetCreationResult::HasBeenSuccessful() const +{ + return m_taken_action && m_asset_info != nullptr; +} + bool AssetCreationResult::HasTakenAction() const { return m_taken_action; diff --git a/src/ObjLoading/Asset/IAssetCreator.h b/src/ObjLoading/Asset/IAssetCreator.h index 2d6c3736..9f7232e9 100644 --- a/src/ObjLoading/Asset/IAssetCreator.h +++ b/src/ObjLoading/Asset/IAssetCreator.h @@ -17,6 +17,7 @@ public: static AssetCreationResult Failure(); static AssetCreationResult NoAction(); + [[nodiscard]] bool HasBeenSuccessful() const; [[nodiscard]] bool HasTakenAction() const; [[nodiscard]] bool HasFailed() const; [[nodiscard]] XAssetInfoGeneric* GetAssetInfo() const; diff --git a/src/ObjLoading/Asset/IDefaultAssetCreator.h b/src/ObjLoading/Asset/IDefaultAssetCreator.h index 01d49778..5820eb38 100644 --- a/src/ObjLoading/Asset/IDefaultAssetCreator.h +++ b/src/ObjLoading/Asset/IDefaultAssetCreator.h @@ -1,16 +1,15 @@ #pragma once #include "AssetCreationContext.h" -#include "AssetRegistration.h" #include "Game/IAsset.h" -#include "Utils/MemoryManager.h" +#include "IAssetCreator.h" #include "Zone/ZoneTypes.h" #include #include -class GenericAssetRegistration; -template class AssetRegistration; +class AssetCreationResult; +class AssetCreationContext; class IDefaultAssetCreator { @@ -23,7 +22,7 @@ public: IDefaultAssetCreator& operator=(IDefaultAssetCreator&& other) noexcept = default; [[nodiscard]] virtual asset_type_t GetHandlingAssetType() const = 0; - virtual GenericAssetRegistration CreateDefaultAsset(const std::string& assetName) const = 0; + virtual AssetCreationResult CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const = 0; }; template class DefaultAssetCreator : public IDefaultAssetCreator @@ -35,12 +34,4 @@ public: { return AssetType::EnumEntry; } - - GenericAssetRegistration CreateDefaultAsset(const std::string& assetName) const override - { - return CreateDefaultAssetInternal(assetName); - } - -protected: - virtual AssetRegistration CreateDefaultAssetInternal(const std::string& assetName) const = 0; }; diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.h b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.h deleted file mode 100644 index d7f4be3c..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/IW3/IW3.h" -#include "SearchPath/ISearchPath.h" - -namespace IW3 -{ - class AssetLoaderGfxImage final : public BasicAssetLoader - { - public: - _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; - }; -} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.cpp deleted file mode 100644 index b71c5cf5..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "AssetLoaderLocalizeEntry.h" - -#include "Localize/LocalizeCommonAssetLoader.h" - -using namespace IW3; - -XAssetInfoGeneric* AssetLoaderLocalizeEntry::LoadFromGlobalAssetPools(const std::string& assetName) const -{ - return nullptr; -} - -void* AssetLoaderLocalizeEntry::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - return nullptr; -} - -bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderLocalizeEntry::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const -{ - const LocalizeCommonAssetLoader commonLoader( - [memory, manager](const CommonLocalizeEntry& entry) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(entry.m_key.c_str()); - localizeEntry->value = memory->Dup(entry.m_value.c_str()); - - manager->AddAsset(entry.m_key, localizeEntry); - }); - - return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); -} diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.h deleted file mode 100644 index 3174989d..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderLocalizeEntry.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/IW3/IW3.h" -#include "SearchPath/ISearchPath.h" - -namespace IW3 -{ - class AssetLoaderLocalizeEntry final : public BasicAssetLoader - { - public: - _NODISCARD XAssetInfoGeneric* LoadFromGlobalAssetPools(const std::string& assetName) const override; - _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; - }; -} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.cpp b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.cpp deleted file mode 100644 index c865c06e..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "AssetLoaderRawFile.h" - -#include "Game/IW3/IW3.h" -#include "Pool/GlobalAssetPool.h" - -#include - -using namespace IW3; - -void* AssetLoaderRawFile::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - auto* rawFile = memory->Create(); - memset(rawFile, 0, sizeof(RawFile)); - rawFile->name = memory->Dup(assetName.c_str()); - return rawFile; -} - -bool AssetLoaderRawFile::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderRawFile::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const -{ - const auto file = searchPath->Open(assetName); - if (!file.IsOpen()) - return false; - - auto* rawFile = memory->Create(); - rawFile->name = memory->Dup(assetName.c_str()); - rawFile->len = static_cast(file.m_length); - - auto* fileBuffer = memory->Alloc(static_cast(file.m_length + 1)); - file.m_stream->read(fileBuffer, file.m_length); - if (file.m_stream->gcount() != file.m_length) - return false; - fileBuffer[rawFile->len] = '\0'; - - rawFile->buffer = fileBuffer; - manager->AddAsset(assetName, rawFile); - - return true; -} diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.h b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.h deleted file mode 100644 index 41d1e295..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderRawFile.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/IW3/IW3.h" -#include "SearchPath/ISearchPath.h" - -namespace IW3 -{ - class AssetLoaderRawFile final : public BasicAssetLoader - { - public: - _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; - }; -} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.cpp b/src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.cpp similarity index 75% rename from src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.cpp rename to src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.cpp index 7daaf720..187e2684 100644 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderGfxImage.cpp +++ b/src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.cpp @@ -1,4 +1,4 @@ -#include "AssetLoaderGfxImage.h" +#include "AssetLoaderImageIW3.h" #include "Game/IW3/IW3.h" #include "Image/DdsLoader.h" @@ -12,43 +12,35 @@ using namespace IW3; -void* AssetLoaderGfxImage::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) +AssetLoaderImage::AssetLoaderImage(MemoryManager& memory, ISearchPath& searchPath) + : m_memory(memory), + m_search_path(searchPath) { - auto* image = memory->Create(); - memset(image, 0, sizeof(GfxImage)); - image->name = memory->Dup(assetName.c_str()); - return image; } -bool AssetLoaderGfxImage::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderGfxImage::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const +AssetCreationResult AssetLoaderImage::CreateAsset(const std::string& assetName, AssetCreationContext& context) { // Do not load any GfxImages from raw for now that are not loaded // TODO: Load iwis and add streaming info to asset if (assetName.empty() || assetName[0] != '*') - return false; + return AssetCreationResult::NoAction(); std::string safeAssetName = assetName; std::ranges::replace(safeAssetName, '*', '_'); - const auto file = searchPath->Open(std::format("images/{}.dds", safeAssetName)); + const auto file = m_search_path.Open(std::format("images/{}.dds", safeAssetName)); if (!file.IsOpen()) - return false; + return AssetCreationResult::NoAction(); const auto texture = dds::LoadDds(*file.m_stream); if (!texture) { std::cerr << std::format("Failed to load dds file for image asset \"{}\"\n", assetName); - return false; + return AssetCreationResult::Failure(); } - auto* image = memory->Create(); - image->name = memory->Dup(assetName.c_str()); + auto* image = m_memory.Alloc(); + image->name = m_memory.Dup(assetName.c_str()); image->picmip.platform[0] = 0; image->picmip.platform[1] = 0; image->noPicmip = !texture->HasMipMaps(); @@ -88,7 +80,7 @@ bool AssetLoaderGfxImage::LoadFromRaw( for (auto mipLevel = 0; mipLevel < mipCount; mipLevel++) dataSize += texture->GetSizeOfMipLevel(mipLevel) * faceCount; - auto* loadDef = static_cast(zone->GetMemory()->AllocRaw(offsetof(GfxImageLoadDef, data) + dataSize)); + auto* loadDef = static_cast(m_memory.AllocRaw(offsetof(GfxImageLoadDef, data) + dataSize)); image->texture.loadDef = loadDef; loadDef->levelCount = static_cast(mipCount); loadDef->flags = 0; @@ -116,7 +108,5 @@ bool AssetLoaderGfxImage::LoadFromRaw( } } - manager->AddAsset(assetName, image); - - return true; + return AssetCreationResult::Success(context.AddAsset(assetName, image)); } diff --git a/src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.h b/src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.h new file mode 100644 index 00000000..3947214b --- /dev/null +++ b/src/ObjLoading/Game/IW3/Image/AssetLoaderImageIW3.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Asset/IAssetCreator.h" +#include "Game/IW3/IW3.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" + +namespace IW3 +{ + class AssetLoaderImage final : public AssetCreator + { + public: + AssetLoaderImage(MemoryManager& memory, ISearchPath& searchPath); + + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + ISearchPath& m_search_path; + }; +} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp b/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp new file mode 100644 index 00000000..4e3ed4cc --- /dev/null +++ b/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp @@ -0,0 +1,16 @@ +#include "DefaultCreatorImageIW3.h" + +using namespace IW3; + +DefaultCreatorImage::DefaultCreatorImage(MemoryManager& memory) + : m_memory(memory) +{ +} + +AssetCreationResult DefaultCreatorImage::CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(assetName.c_str()); + + return AssetCreationResult::Success(context.AddAsset(assetName, asset)); +} diff --git a/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.h b/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.h new file mode 100644 index 00000000..5b7aa7e1 --- /dev/null +++ b/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Asset/IDefaultAssetCreator.h" +#include "Game/IW3/IW3.h" +#include "Utils/MemoryManager.h" + +namespace IW3 +{ + class DefaultCreatorImage : public DefaultAssetCreator + { + public: + explicit DefaultCreatorImage(MemoryManager& memory); + AssetCreationResult CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const override; + + private: + MemoryManager& m_memory; + }; +} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.cpp b/src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.cpp new file mode 100644 index 00000000..69b9c071 --- /dev/null +++ b/src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.cpp @@ -0,0 +1,23 @@ +#include "AssetLoaderLocalizeIW3.h" + +using namespace IW3; + +AssetLoaderLocalize::AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone) + : CommonLocalizeLoader(searchPath, zone), + m_memory(memory) +{ +} + +AssetCreationResult AssetLoaderLocalize::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + return CreateLocalizeAsset(assetName, context); +} + +AssetCreationResult AssetLoaderLocalize::CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(localizeEntry.m_key.c_str()); + asset->value = m_memory.Dup(localizeEntry.m_value.c_str()); + + return AssetCreationResult::Success(context.AddAsset(localizeEntry.m_key, asset)); +} diff --git a/src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.h b/src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.h new file mode 100644 index 00000000..d730961b --- /dev/null +++ b/src/ObjLoading/Game/IW3/Localize/AssetLoaderLocalizeIW3.h @@ -0,0 +1,23 @@ +#pragma once + +#include "Asset/IAssetCreator.h" +#include "Game/IW3/IW3.h" +#include "Localize/CommonLocalizeLoader.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" + +namespace IW3 +{ + class AssetLoaderLocalize final : public AssetCreator, public CommonLocalizeLoader + { + public: + AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone); + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + protected: + AssetCreationResult CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + }; +} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp index 76c08a2d..4df8a0c6 100644 --- a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp +++ b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp @@ -1,77 +1,123 @@ #include "ObjLoaderIW3.h" -#include "AssetLoaders/AssetLoaderGfxImage.h" -#include "AssetLoaders/AssetLoaderLocalizeEntry.h" -#include "AssetLoaders/AssetLoaderRawFile.h" -#include "AssetLoading/AssetLoadingManager.h" +#include "Asset/GlobalAssetPoolsLoader.h" #include "Game/IW3/GameIW3.h" +#include "Game/IW3/IW3.h" +#include "Image/AssetLoaderImageIW3.h" +#include "Image/DefaultCreatorImageIW3.h" +#include "Localize/AssetLoaderLocalizeIW3.h" #include "ObjLoading.h" +#include + using namespace IW3; -ObjLoader::ObjLoader() -{ -#define REGISTER_ASSET_LOADER(t) \ - { \ - auto l = std::make_unique(); \ - m_asset_loaders_by_type[l->GetHandlingAssetType()] = std::move(l); \ - } - - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(AssetLoaderGfxImage) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(AssetLoaderLocalizeEntry) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(AssetLoaderRawFile) - REGISTER_ASSET_LOADER(BasicAssetLoader) - -#undef REGISTER_ASSET_LOADER -} - -bool ObjLoader::IsMpZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "mp_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_mp") == 0; -} - -bool ObjLoader::IsZmZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "zm_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_zm") == 0; -} - void ObjLoader::LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const {} void ObjLoader::UnloadContainersOfZone(Zone& zone) const {} -void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection) const {} - -bool ObjLoader::LoadAssetForZone(AssetLoadingContext& context, const asset_type_t assetType, const std::string& assetName) const +namespace { - AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, context); - return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); -} + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone) + { + auto& memory = *zone.GetMemory(); -void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext& context) const + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + } + + void ConfigureGlobalAssetPoolsLoaders(AssetCreatorCollection& collection, Zone& zone) + { + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + } + + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) + { + auto& memory = *zone.GetMemory(); + + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + collection.AddAssetCreator(std::make_unique(memory, searchPath)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + collection.AddAssetCreator(std::make_unique(memory, searchPath, zone)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + } +} // namespace + +void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const { - for (const auto& [type, loader] : m_asset_loaders_by_type) - loader->FinalizeAssetsForZone(context); + ConfigureDefaultCreators(collection, zone, searchPath); + ConfigureGlobalAssetPoolsLoaders(collection, zone); } diff --git a/src/ObjLoading/Game/IW3/ObjLoaderIW3.h b/src/ObjLoading/Game/IW3/ObjLoaderIW3.h index 887bd07c..35d83adb 100644 --- a/src/ObjLoading/Game/IW3/ObjLoaderIW3.h +++ b/src/ObjLoading/Game/IW3/ObjLoaderIW3.h @@ -1,30 +1,16 @@ #pragma once -#include "AssetLoading/IAssetLoader.h" #include "IObjLoader.h" #include "SearchPath/ISearchPath.h" -#include -#include - namespace IW3 { class ObjLoader final : public IObjLoader { - std::unordered_map> m_asset_loaders_by_type; - - static bool IsMpZone(const Zone& zone); - static bool IsZmZone(const Zone& zone); - public: - ObjLoader(); - void LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const override; void UnloadContainersOfZone(Zone& zone) const override; - void ConfigureCreatorCollection(AssetCreatorCollection& collection) const override; - - bool LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const override; - void FinalizeAssetsForZone(AssetLoadingContext& context) const override; + void ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const override; }; } // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.cpp b/src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.cpp new file mode 100644 index 00000000..b0f50f5f --- /dev/null +++ b/src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.cpp @@ -0,0 +1,35 @@ +#include "AssetLoaderRawFileIW3.h" + +#include "Game/IW3/IW3.h" +#include "Pool/GlobalAssetPool.h" + +#include + +using namespace IW3; + +AssetLoaderRawFile::AssetLoaderRawFile(MemoryManager& memory, ISearchPath& searchPath) + : m_memory(memory), + m_search_path(searchPath) +{ +} + +AssetCreationResult AssetLoaderRawFile::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + const auto file = m_search_path.Open(assetName); + if (!file.IsOpen()) + return AssetCreationResult::NoAction(); + + auto* rawFile = m_memory.Alloc(); + rawFile->name = m_memory.Dup(assetName.c_str()); + rawFile->len = static_cast(file.m_length); + + auto* fileBuffer = m_memory.Alloc(static_cast(file.m_length + 1)); + file.m_stream->read(fileBuffer, file.m_length); + if (file.m_stream->gcount() != file.m_length) + return AssetCreationResult::Failure(); + fileBuffer[rawFile->len] = '\0'; + + rawFile->buffer = fileBuffer; + + return AssetCreationResult::Success(context.AddAsset(assetName, rawFile)); +} diff --git a/src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.h b/src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.h new file mode 100644 index 00000000..dbb1bd22 --- /dev/null +++ b/src/ObjLoading/Game/IW3/RawFile/AssetLoaderRawFileIW3.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Asset/IAssetCreator.h" +#include "Game/IW3/IW3.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" + +namespace IW3 +{ + class AssetLoaderRawFile final : public AssetCreator + { + public: + AssetLoaderRawFile(MemoryManager& memory, ISearchPath& searchPath); + + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + ISearchPath& m_search_path; + }; +} // namespace IW3 diff --git a/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp b/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp new file mode 100644 index 00000000..0553a792 --- /dev/null +++ b/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp @@ -0,0 +1,16 @@ +#include "DefaultCreatorRawFileIW3.h" + +using namespace IW3; + +DefaultCreatorRawFile::DefaultCreatorRawFile(MemoryManager& memory) + : m_memory(memory) +{ +} + +AssetCreationResult DefaultCreatorRawFile::CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(assetName.c_str()); + + return AssetCreationResult::Success(context.AddAsset(assetName, asset)); +} diff --git a/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.h b/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.h new file mode 100644 index 00000000..229538f7 --- /dev/null +++ b/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Asset/IDefaultAssetCreator.h" +#include "Game/IW3/IW3.h" +#include "Utils/MemoryManager.h" + +namespace IW3 +{ + class DefaultCreatorRawFile : public DefaultAssetCreator + { + public: + explicit DefaultCreatorRawFile(MemoryManager& memory); + AssetCreationResult CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const override; + + private: + MemoryManager& m_memory; + }; +} // namespace IW3 diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp deleted file mode 100644 index 6d4f596e..00000000 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "AssetLoaderLocalizeEntry.h" - -#include "Localize/LocalizeCommonAssetLoader.h" - -using namespace IW4; - -XAssetInfoGeneric* AssetLoaderLocalizeEntry::LoadFromGlobalAssetPools(const std::string& assetName) const -{ - return nullptr; -} - -void* AssetLoaderLocalizeEntry::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - return nullptr; -} - -bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderLocalizeEntry::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const -{ - const LocalizeCommonAssetLoader commonLoader( - [memory, manager](const CommonLocalizeEntry& entry) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(entry.m_key.c_str()); - localizeEntry->value = memory->Dup(entry.m_value.c_str()); - - manager->AddAsset(entry.m_key, localizeEntry); - }); - - return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); -} diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h deleted file mode 100644 index b6964d7e..00000000 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderLocalizeEntry.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/IW4/IW4.h" -#include "SearchPath/ISearchPath.h" - -namespace IW4 -{ - class AssetLoaderLocalizeEntry final : public BasicAssetLoader - { - public: - _NODISCARD XAssetInfoGeneric* LoadFromGlobalAssetPools(const std::string& assetName) const override; - _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; - }; -} // namespace IW4 diff --git a/src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.cpp b/src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.cpp new file mode 100644 index 00000000..f96e65ee --- /dev/null +++ b/src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.cpp @@ -0,0 +1,23 @@ +#include "AssetLoaderLocalizeIW4.h" + +using namespace IW4; + +AssetLoaderLocalize::AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone) + : CommonLocalizeLoader(searchPath, zone), + m_memory(memory) +{ +} + +AssetCreationResult AssetLoaderLocalize::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + return CreateLocalizeAsset(assetName, context); +} + +AssetCreationResult AssetLoaderLocalize::CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(localizeEntry.m_key.c_str()); + asset->value = m_memory.Dup(localizeEntry.m_value.c_str()); + + return AssetCreationResult::Success(context.AddAsset(localizeEntry.m_key, asset)); +} diff --git a/src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.h b/src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.h new file mode 100644 index 00000000..4be1da32 --- /dev/null +++ b/src/ObjLoading/Game/IW4/Localize/AssetLoaderLocalizeIW4.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Asset/AssetCreationContext.h" +#include "Asset/IAssetCreator.h" +#include "Game/IW4/IW4.h" +#include "Localize/CommonLocalizeLoader.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" +#include "Zone/Zone.h" + +namespace IW4 +{ + class AssetLoaderLocalize final : public AssetCreator, public CommonLocalizeLoader + { + public: + AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone); + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + protected: + AssetCreationResult CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + }; +} // namespace IW4 diff --git a/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp b/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp index 80b06fef..f1fbeb61 100644 --- a/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp +++ b/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp @@ -1,121 +1,150 @@ #include "ObjLoaderIW4.h" -#include "AssetLoaders/AssetLoaderAddonMapEnts.h" -#include "AssetLoaders/AssetLoaderClipMap.h" -#include "AssetLoaders/AssetLoaderComWorld.h" -#include "AssetLoaders/AssetLoaderFont.h" -#include "AssetLoaders/AssetLoaderFx.h" -#include "AssetLoaders/AssetLoaderFxImpactTable.h" -#include "AssetLoaders/AssetLoaderFxWorld.h" -#include "AssetLoaders/AssetLoaderGameWorldMp.h" -#include "AssetLoaders/AssetLoaderGameWorldSp.h" -#include "AssetLoaders/AssetLoaderGfxImage.h" -#include "AssetLoaders/AssetLoaderGfxLightDef.h" -#include "AssetLoaders/AssetLoaderGfxWorld.h" -#include "AssetLoaders/AssetLoaderLeaderboard.h" -#include "AssetLoaders/AssetLoaderLoadedSound.h" -#include "AssetLoaders/AssetLoaderLocalizeEntry.h" -#include "AssetLoaders/AssetLoaderMapEnts.h" -#include "AssetLoaders/AssetLoaderMaterial.h" -#include "AssetLoaders/AssetLoaderMenuDef.h" -#include "AssetLoaders/AssetLoaderMenuList.h" -#include "AssetLoaders/AssetLoaderPhysCollmap.h" -#include "AssetLoaders/AssetLoaderPhysPreset.h" -#include "AssetLoaders/AssetLoaderPixelShader.h" -#include "AssetLoaders/AssetLoaderRawFile.h" -#include "AssetLoaders/AssetLoaderSndCurve.h" -#include "AssetLoaders/AssetLoaderSoundAliasList.h" -#include "AssetLoaders/AssetLoaderStringTable.h" -#include "AssetLoaders/AssetLoaderStructuredDataDefSet.h" -#include "AssetLoaders/AssetLoaderTechniqueSet.h" -#include "AssetLoaders/AssetLoaderTracer.h" -#include "AssetLoaders/AssetLoaderVehicle.h" -#include "AssetLoaders/AssetLoaderVertexDecl.h" -#include "AssetLoaders/AssetLoaderVertexShader.h" -#include "AssetLoaders/AssetLoaderWeapon.h" -#include "AssetLoaders/AssetLoaderXAnim.h" -#include "AssetLoaders/AssetLoaderXModel.h" -#include "AssetLoaders/AssetLoaderXModelSurfs.h" -#include "AssetLoading/AssetLoadingManager.h" +#include "Asset/GlobalAssetPoolsLoader.h" #include "Game/IW4/GameIW4.h" -#include "Image/IwiLoader.h" -#include "ObjContainer/IPak/IPak.h" +#include "Game/IW4/IW4.h" +#include "Localize/AssetLoaderLocalizeIW4.h" +#include "ObjLoading.h" + +#include using namespace IW4; -ObjLoader::ObjLoader() -{ -#define REGISTER_ASSET_LOADER(t) \ - { \ - auto l = std::make_unique(); \ - m_asset_loaders_by_type[l->GetHandlingAssetType()] = std::move(l); \ - } - - REGISTER_ASSET_LOADER(AssetLoaderPhysPreset) - REGISTER_ASSET_LOADER(AssetLoaderPhysCollmap) - REGISTER_ASSET_LOADER(AssetLoaderXAnim) - REGISTER_ASSET_LOADER(AssetLoaderXModelSurfs) - REGISTER_ASSET_LOADER(AssetLoaderXModel) - REGISTER_ASSET_LOADER(AssetLoaderMaterial) - REGISTER_ASSET_LOADER(AssetLoaderPixelShader) - REGISTER_ASSET_LOADER(AssetLoaderVertexShader) - REGISTER_ASSET_LOADER(AssetLoaderVertexDecl) - REGISTER_ASSET_LOADER(AssetLoaderTechniqueSet) - REGISTER_ASSET_LOADER(AssetLoaderGfxImage) - REGISTER_ASSET_LOADER(AssetLoaderSoundAliasList) - REGISTER_ASSET_LOADER(AssetLoaderSndCurve) - REGISTER_ASSET_LOADER(AssetLoaderLoadedSound) - REGISTER_ASSET_LOADER(AssetLoaderClipMapSp) - REGISTER_ASSET_LOADER(AssetLoaderClipMapMp) - REGISTER_ASSET_LOADER(AssetLoaderComWorld) - REGISTER_ASSET_LOADER(AssetLoaderGameWorldSp) - REGISTER_ASSET_LOADER(AssetLoaderGameWorldMp) - REGISTER_ASSET_LOADER(AssetLoaderMapEnts) - REGISTER_ASSET_LOADER(AssetLoaderFxWorld) - REGISTER_ASSET_LOADER(AssetLoaderGfxWorld) - REGISTER_ASSET_LOADER(AssetLoaderGfxLightDef) - REGISTER_ASSET_LOADER(AssetLoaderFont) - REGISTER_ASSET_LOADER(AssetLoaderMenuList) - REGISTER_ASSET_LOADER(AssetLoaderMenuDef) - REGISTER_ASSET_LOADER(AssetLoaderLocalizeEntry) - REGISTER_ASSET_LOADER(AssetLoaderWeapon) - REGISTER_ASSET_LOADER(AssetLoaderFx) - REGISTER_ASSET_LOADER(AssetLoaderFxImpactTable) - REGISTER_ASSET_LOADER(AssetLoaderRawFile) - REGISTER_ASSET_LOADER(AssetLoaderStringTable) - REGISTER_ASSET_LOADER(AssetLoaderLeaderboard) - REGISTER_ASSET_LOADER(AssetLoaderStructuredDataDefSet) - REGISTER_ASSET_LOADER(AssetLoaderTracer) - REGISTER_ASSET_LOADER(AssetLoaderVehicle) - REGISTER_ASSET_LOADER(AssetLoaderAddonMapEnts) - -#undef REGISTER_ASSET_LOADER -} - -bool ObjLoader::IsMpZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "mp_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_mp") == 0; -} - -bool ObjLoader::IsZmZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "zm_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_zm") == 0; -} - void ObjLoader::LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const {} void ObjLoader::UnloadContainersOfZone(Zone& zone) const {} -void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection) const {} - -bool ObjLoader::LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const +namespace { - AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, context); - return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); -} + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone) + { + auto& memory = *zone.GetMemory(); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + } -void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext& context) const + void ConfigureGlobalAssetPoolsLoaders(AssetCreatorCollection& collection, Zone& zone) + { + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + } + + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) + { + auto& memory = *zone.GetMemory(); + + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + collection.AddAssetCreator(std::make_unique(memory, searchPath, zone)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + } +} // namespace + +void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const { - for (const auto& [type, loader] : m_asset_loaders_by_type) - loader->FinalizeAssetsForZone(context); + ConfigureDefaultCreators(collection, zone, searchPath); + ConfigureGlobalAssetPoolsLoaders(collection, zone); } diff --git a/src/ObjLoading/Game/IW4/ObjLoaderIW4.h b/src/ObjLoading/Game/IW4/ObjLoaderIW4.h index 9dd8798c..23d0fe5b 100644 --- a/src/ObjLoading/Game/IW4/ObjLoaderIW4.h +++ b/src/ObjLoading/Game/IW4/ObjLoaderIW4.h @@ -3,29 +3,16 @@ #include "AssetLoading/IAssetLoader.h" #include "IObjLoader.h" #include "SearchPath/ISearchPath.h" - -#include -#include +#include "Zone/Zone.h" namespace IW4 { class ObjLoader final : public IObjLoader { public: - ObjLoader(); - void LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const override; void UnloadContainersOfZone(Zone& zone) const override; - void ConfigureCreatorCollection(AssetCreatorCollection& collection) const override; - - bool LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const override; - void FinalizeAssetsForZone(AssetLoadingContext& context) const override; - - private: - static bool IsMpZone(const Zone& zone); - static bool IsZmZone(const Zone& zone); - - std::unordered_map> m_asset_loaders_by_type; + void ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const override; }; } // namespace IW4 diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp deleted file mode 100644 index 94f9a42e..00000000 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "AssetLoaderLocalizeEntry.h" - -#include "Localize/LocalizeCommonAssetLoader.h" - -using namespace IW5; - -XAssetInfoGeneric* AssetLoaderLocalizeEntry::LoadFromGlobalAssetPools(const std::string& assetName) const -{ - return nullptr; -} - -void* AssetLoaderLocalizeEntry::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - return nullptr; -} - -bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderLocalizeEntry::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const -{ - const LocalizeCommonAssetLoader commonLoader( - [memory, manager](const CommonLocalizeEntry& entry) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(entry.m_key.c_str()); - localizeEntry->value = memory->Dup(entry.m_value.c_str()); - - manager->AddAsset(entry.m_key, localizeEntry); - }); - - return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); -} diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h deleted file mode 100644 index 5d8d7e92..00000000 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderLocalizeEntry.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/IW5/IW5.h" -#include "SearchPath/ISearchPath.h" - -namespace IW5 -{ - class AssetLoaderLocalizeEntry final : public BasicAssetLoader - { - public: - _NODISCARD XAssetInfoGeneric* LoadFromGlobalAssetPools(const std::string& assetName) const override; - _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; - }; -} // namespace IW5 diff --git a/src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.cpp b/src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.cpp new file mode 100644 index 00000000..d2f37742 --- /dev/null +++ b/src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.cpp @@ -0,0 +1,23 @@ +#include "AssetLoaderLocalizeIW5.h" + +using namespace IW5; + +AssetLoaderLocalize::AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone) + : CommonLocalizeLoader(searchPath, zone), + m_memory(memory) +{ +} + +AssetCreationResult AssetLoaderLocalize::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + return CreateLocalizeAsset(assetName, context); +} + +AssetCreationResult AssetLoaderLocalize::CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(localizeEntry.m_key.c_str()); + asset->value = m_memory.Dup(localizeEntry.m_value.c_str()); + + return AssetCreationResult::Success(context.AddAsset(localizeEntry.m_key, asset)); +} diff --git a/src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.h b/src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.h new file mode 100644 index 00000000..0daabd9e --- /dev/null +++ b/src/ObjLoading/Game/IW5/Localize/AssetLoaderLocalizeIW5.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Asset/AssetCreationContext.h" +#include "Asset/IAssetCreator.h" +#include "Game/IW5/IW5.h" +#include "Localize/CommonLocalizeLoader.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" +#include "Zone/Zone.h" + +namespace IW5 +{ + class AssetLoaderLocalize final : public AssetCreator, public CommonLocalizeLoader + { + public: + AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone); + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + protected: + AssetCreationResult CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + }; +} // namespace IW5 diff --git a/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp b/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp index f6920242..6224f518 100644 --- a/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp +++ b/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp @@ -1,128 +1,158 @@ #include "ObjLoaderIW5.h" -#include "AssetLoaders/AssetLoaderAddonMapEnts.h" -#include "AssetLoaders/AssetLoaderClipMap.h" -#include "AssetLoaders/AssetLoaderComWorld.h" -#include "AssetLoaders/AssetLoaderFont.h" -#include "AssetLoaders/AssetLoaderFx.h" -#include "AssetLoaders/AssetLoaderFxImpactTable.h" -#include "AssetLoaders/AssetLoaderFxWorld.h" -#include "AssetLoaders/AssetLoaderGfxImage.h" -#include "AssetLoaders/AssetLoaderGfxLightDef.h" -#include "AssetLoaders/AssetLoaderGfxWorld.h" -#include "AssetLoaders/AssetLoaderGlassWorld.h" -#include "AssetLoaders/AssetLoaderLeaderboard.h" -#include "AssetLoaders/AssetLoaderLoadedSound.h" -#include "AssetLoaders/AssetLoaderLocalizeEntry.h" -#include "AssetLoaders/AssetLoaderMapEnts.h" -#include "AssetLoaders/AssetLoaderMaterial.h" -#include "AssetLoaders/AssetLoaderMenuDef.h" -#include "AssetLoaders/AssetLoaderMenuList.h" -#include "AssetLoaders/AssetLoaderPathData.h" -#include "AssetLoaders/AssetLoaderPhysCollmap.h" -#include "AssetLoaders/AssetLoaderPhysPreset.h" -#include "AssetLoaders/AssetLoaderPixelShader.h" -#include "AssetLoaders/AssetLoaderRawFile.h" -#include "AssetLoaders/AssetLoaderScriptFile.h" -#include "AssetLoaders/AssetLoaderSoundAliasList.h" -#include "AssetLoaders/AssetLoaderSoundCurve.h" -#include "AssetLoaders/AssetLoaderStringTable.h" -#include "AssetLoaders/AssetLoaderStructuredDataDef.h" -#include "AssetLoaders/AssetLoaderSurfaceFxTable.h" -#include "AssetLoaders/AssetLoaderTechniqueSet.h" -#include "AssetLoaders/AssetLoaderTracerDef.h" -#include "AssetLoaders/AssetLoaderVehicleDef.h" -#include "AssetLoaders/AssetLoaderVehicleTrack.h" -#include "AssetLoaders/AssetLoaderVertexDecl.h" -#include "AssetLoaders/AssetLoaderVertexShader.h" -#include "AssetLoaders/AssetLoaderWeapon.h" -#include "AssetLoaders/AssetLoaderWeaponAttachment.h" -#include "AssetLoaders/AssetLoaderXAnim.h" -#include "AssetLoaders/AssetLoaderXModel.h" -#include "AssetLoaders/AssetLoaderXModelSurfs.h" -#include "AssetLoading/AssetLoadingManager.h" +#include "Asset/GlobalAssetPoolsLoader.h" #include "Game/IW5/GameIW5.h" -#include "Image/IwiLoader.h" -#include "ObjContainer/IPak/IPak.h" +#include "Game/IW5/IW5.h" +#include "Localize/AssetLoaderLocalizeIW5.h" +#include "ObjLoading.h" + +#include using namespace IW5; -ObjLoader::ObjLoader() -{ -#define REGISTER_ASSET_LOADER(t) \ - { \ - auto l = std::make_unique(); \ - m_asset_loaders_by_type[l->GetHandlingAssetType()] = std::move(l); \ - } - - REGISTER_ASSET_LOADER(AssetLoaderPhysPreset) - REGISTER_ASSET_LOADER(AssetLoaderPhysCollmap) - REGISTER_ASSET_LOADER(AssetLoaderXAnim) - REGISTER_ASSET_LOADER(AssetLoaderXModelSurfs) - REGISTER_ASSET_LOADER(AssetLoaderXModel) - REGISTER_ASSET_LOADER(AssetLoaderMaterial) - REGISTER_ASSET_LOADER(AssetLoaderPixelShader) - REGISTER_ASSET_LOADER(AssetLoaderVertexShader) - REGISTER_ASSET_LOADER(AssetLoaderVertexDecl) - REGISTER_ASSET_LOADER(AssetLoaderTechniqueSet) - REGISTER_ASSET_LOADER(AssetLoaderGfxImage) - REGISTER_ASSET_LOADER(AssetLoaderSoundAliasList) - REGISTER_ASSET_LOADER(AssetLoaderSoundCurve) - REGISTER_ASSET_LOADER(AssetLoaderLoadedSound) - REGISTER_ASSET_LOADER(AssetLoaderClipMap) - REGISTER_ASSET_LOADER(AssetLoaderComWorld) - REGISTER_ASSET_LOADER(AssetLoaderGlassWorld) - REGISTER_ASSET_LOADER(AssetLoaderPathData) - REGISTER_ASSET_LOADER(AssetLoaderVehicleTrack) - REGISTER_ASSET_LOADER(AssetLoaderMapEnts) - REGISTER_ASSET_LOADER(AssetLoaderFxWorld) - REGISTER_ASSET_LOADER(AssetLoaderGfxWorld) - REGISTER_ASSET_LOADER(AssetLoaderGfxLightDef) - REGISTER_ASSET_LOADER(AssetLoaderFont) - REGISTER_ASSET_LOADER(AssetLoaderMenuList) - REGISTER_ASSET_LOADER(AssetLoaderMenuDef) - REGISTER_ASSET_LOADER(AssetLoaderLocalizeEntry) - REGISTER_ASSET_LOADER(AssetLoaderWeaponAttachment) - REGISTER_ASSET_LOADER(AssetLoaderWeapon) - REGISTER_ASSET_LOADER(AssetLoaderFx) - REGISTER_ASSET_LOADER(AssetLoaderFxImpactTable) - REGISTER_ASSET_LOADER(AssetLoaderSurfaceFxTable) - REGISTER_ASSET_LOADER(AssetLoaderRawFile) - REGISTER_ASSET_LOADER(AssetLoaderScriptFile) - REGISTER_ASSET_LOADER(AssetLoaderStringTable) - REGISTER_ASSET_LOADER(AssetLoaderLeaderboard) - REGISTER_ASSET_LOADER(AssetLoaderStructuredDataDef) - REGISTER_ASSET_LOADER(AssetLoaderTracerDef) - REGISTER_ASSET_LOADER(AssetLoaderVehicleDef) - REGISTER_ASSET_LOADER(AssetLoaderAddonMapEnts) - -#undef REGISTER_ASSET_LOADER -} - -bool ObjLoader::IsMpZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "mp_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_mp") == 0; -} - -bool ObjLoader::IsZmZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "zm_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_zm") == 0; -} - void ObjLoader::LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const {} void ObjLoader::UnloadContainersOfZone(Zone& zone) const {} -void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection) const {} - -bool ObjLoader::LoadAssetForZone(AssetLoadingContext& context, const asset_type_t assetType, const std::string& assetName) const +namespace { - AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, context); - return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); -} + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone) + { + auto& memory = *zone.GetMemory(); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + } -void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext& context) const + void ConfigureGlobalAssetPoolsLoaders(AssetCreatorCollection& collection, Zone& zone) + { + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + } + + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) + { + auto& memory = *zone.GetMemory(); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + collection.AddAssetCreator(std::make_unique(memory, searchPath, zone)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + } +} // namespace + +void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const { - for (const auto& [type, loader] : m_asset_loaders_by_type) - loader->FinalizeAssetsForZone(context); + ConfigureDefaultCreators(collection, zone, searchPath); + ConfigureGlobalAssetPoolsLoaders(collection, zone); } diff --git a/src/ObjLoading/Game/IW5/ObjLoaderIW5.h b/src/ObjLoading/Game/IW5/ObjLoaderIW5.h index 4067dc8c..86328991 100644 --- a/src/ObjLoading/Game/IW5/ObjLoaderIW5.h +++ b/src/ObjLoading/Game/IW5/ObjLoaderIW5.h @@ -4,28 +4,14 @@ #include "IObjLoader.h" #include "SearchPath/ISearchPath.h" -#include -#include - namespace IW5 { class ObjLoader final : public IObjLoader { public: - ObjLoader(); - void LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const override; void UnloadContainersOfZone(Zone& zone) const override; - void ConfigureCreatorCollection(AssetCreatorCollection& collection) const override; - - bool LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const override; - void FinalizeAssetsForZone(AssetLoadingContext& context) const override; - - private: - static bool IsMpZone(const Zone& zone); - static bool IsZmZone(const Zone& zone); - - std::unordered_map> m_asset_loaders_by_type; + void ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const override; }; } // namespace IW5 diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp deleted file mode 100644 index 720af58a..00000000 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "AssetLoaderLocalizeEntry.h" - -#include "Localize/LocalizeCommonAssetLoader.h" - -using namespace T5; - -XAssetInfoGeneric* AssetLoaderLocalizeEntry::LoadFromGlobalAssetPools(const std::string& assetName) const -{ - return nullptr; -} - -void* AssetLoaderLocalizeEntry::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - return nullptr; -} - -bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderLocalizeEntry::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const -{ - const LocalizeCommonAssetLoader commonLoader( - [memory, manager](const CommonLocalizeEntry& entry) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(entry.m_key.c_str()); - localizeEntry->value = memory->Dup(entry.m_value.c_str()); - - manager->AddAsset(entry.m_key, localizeEntry); - }); - - return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); -} diff --git a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h deleted file mode 100644 index 3033df86..00000000 --- a/src/ObjLoading/Game/T5/AssetLoaders/AssetLoaderLocalizeEntry.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/T5/T5.h" -#include "SearchPath/ISearchPath.h" - -namespace T5 -{ - class AssetLoaderLocalizeEntry final : public BasicAssetLoader - { - public: - _NODISCARD XAssetInfoGeneric* LoadFromGlobalAssetPools(const std::string& assetName) const override; - _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; - }; -} // namespace T5 diff --git a/src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.cpp b/src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.cpp new file mode 100644 index 00000000..5cfe997a --- /dev/null +++ b/src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.cpp @@ -0,0 +1,23 @@ +#include "AssetLoaderLocalizeT5.h" + +using namespace T5; + +AssetLoaderLocalize::AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone) + : CommonLocalizeLoader(searchPath, zone), + m_memory(memory) +{ +} + +AssetCreationResult AssetLoaderLocalize::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + return CreateLocalizeAsset(assetName, context); +} + +AssetCreationResult AssetLoaderLocalize::CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(localizeEntry.m_key.c_str()); + asset->value = m_memory.Dup(localizeEntry.m_value.c_str()); + + return AssetCreationResult::Success(context.AddAsset(localizeEntry.m_key, asset)); +} diff --git a/src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.h b/src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.h new file mode 100644 index 00000000..8478f9c6 --- /dev/null +++ b/src/ObjLoading/Game/T5/Localize/AssetLoaderLocalizeT5.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Asset/AssetCreationContext.h" +#include "Asset/IAssetCreator.h" +#include "Game/T5/T5.h" +#include "Localize/CommonLocalizeLoader.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" +#include "Zone/Zone.h" + +namespace T5 +{ + class AssetLoaderLocalize final : public AssetCreator, public CommonLocalizeLoader + { + public: + AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone); + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + protected: + AssetCreationResult CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + }; +} // namespace T5 diff --git a/src/ObjLoading/Game/T5/ObjLoaderT5.cpp b/src/ObjLoading/Game/T5/ObjLoaderT5.cpp index 66b0dc3d..eccc4cf7 100644 --- a/src/ObjLoading/Game/T5/ObjLoaderT5.cpp +++ b/src/ObjLoading/Game/T5/ObjLoaderT5.cpp @@ -1,85 +1,137 @@ #include "ObjLoaderT5.h" -#include "AssetLoaders/AssetLoaderLocalizeEntry.h" -#include "AssetLoaders/AssetLoaderRawFile.h" -#include "AssetLoaders/AssetLoaderStringTable.h" -#include "AssetLoaders/AssetLoaderXModel.h" -#include "AssetLoading/AssetLoadingManager.h" +#include "Asset/GlobalAssetPoolsLoader.h" #include "Game/T5/GameT5.h" -#include "Image/IwiLoader.h" -#include "ObjContainer/IPak/IPak.h" +#include "Game/T5/T5.h" +#include "Localize/AssetLoaderLocalizeT5.h" +#include "ObjLoading.h" + +#include using namespace T5; -ObjLoader::ObjLoader() -{ -#define REGISTER_ASSET_LOADER(t) \ - { \ - auto l = std::make_unique(); \ - m_asset_loaders_by_type[l->GetHandlingAssetType()] = std::move(l); \ - } - - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(AssetLoaderXModel) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(AssetLoaderLocalizeEntry) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(AssetLoaderRawFile) - REGISTER_ASSET_LOADER(AssetLoaderStringTable) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - REGISTER_ASSET_LOADER(BasicAssetLoader) - -#undef REGISTER_ASSET_LOADER -} - -bool ObjLoader::IsMpZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "mp_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_mp") == 0; -} - -bool ObjLoader::IsZmZone(const Zone& zone) -{ - return zone.m_name.compare(0, 3, "zm_") == 0 || zone.m_name.compare(zone.m_name.length() - 3, 3, "_zm") == 0; -} - void ObjLoader::LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const {} void ObjLoader::UnloadContainersOfZone(Zone& zone) const {} -void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection) const {} - -bool ObjLoader::LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const +namespace { - AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, context); - return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); -} + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone) + { + auto& memory = *zone.GetMemory(); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + } -void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext& context) const + void ConfigureGlobalAssetPoolsLoaders(AssetCreatorCollection& collection, Zone& zone) + { + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + } + + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) + { + auto& memory = *zone.GetMemory(); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + } +} // namespace + +void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const { - for (const auto& [type, loader] : m_asset_loaders_by_type) - loader->FinalizeAssetsForZone(context); + ConfigureDefaultCreators(collection, zone, searchPath); + ConfigureGlobalAssetPoolsLoaders(collection, zone); } diff --git a/src/ObjLoading/Game/T5/ObjLoaderT5.h b/src/ObjLoading/Game/T5/ObjLoaderT5.h index 743c0388..190eb78c 100644 --- a/src/ObjLoading/Game/T5/ObjLoaderT5.h +++ b/src/ObjLoading/Game/T5/ObjLoaderT5.h @@ -4,28 +4,14 @@ #include "IObjLoader.h" #include "SearchPath/ISearchPath.h" -#include -#include - namespace T5 { class ObjLoader final : public IObjLoader { public: - ObjLoader(); - void LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const override; void UnloadContainersOfZone(Zone& zone) const override; - void ConfigureCreatorCollection(AssetCreatorCollection& collection) const override; - - bool LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const override; - void FinalizeAssetsForZone(AssetLoadingContext& context) const override; - - private: - static bool IsMpZone(const Zone& zone); - static bool IsZmZone(const Zone& zone); - - std::unordered_map> m_asset_loaders_by_type; + void ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const override; }; } // namespace T5 diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp deleted file mode 100644 index b90d5eb7..00000000 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "AssetLoaderLocalizeEntry.h" - -#include "Localize/LocalizeCommonAssetLoader.h" - -using namespace T6; - -XAssetInfoGeneric* AssetLoaderLocalizeEntry::LoadFromGlobalAssetPools(const std::string& assetName) const -{ - return nullptr; -} - -void* AssetLoaderLocalizeEntry::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - return nullptr; -} - -bool AssetLoaderLocalizeEntry::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderLocalizeEntry::LoadFromRaw( - const std::string& assetName, ISearchPath* searchPath, MemoryManager* memory, IAssetLoadingManager* manager, Zone* zone) const -{ - const LocalizeCommonAssetLoader commonLoader( - [memory, manager](const CommonLocalizeEntry& entry) - { - auto* localizeEntry = memory->Create(); - localizeEntry->name = memory->Dup(entry.m_key.c_str()); - localizeEntry->value = memory->Dup(entry.m_value.c_str()); - - manager->AddAsset(entry.m_key, localizeEntry); - }); - - return commonLoader.LoadLocalizeAsset(assetName, searchPath, manager, zone); -} diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.h b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.h deleted file mode 100644 index 62b218ac..00000000 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderLocalizeEntry.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "AssetLoading/BasicAssetLoader.h" -#include "AssetLoading/IAssetLoadingManager.h" -#include "Game/T6/T6.h" -#include "SearchPath/ISearchPath.h" - -namespace T6 -{ - class AssetLoaderLocalizeEntry final : public BasicAssetLoader - { - public: - _NODISCARD XAssetInfoGeneric* LoadFromGlobalAssetPools(const std::string& assetName) const override; - _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; - }; -} // namespace T6 diff --git a/src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.cpp b/src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.cpp new file mode 100644 index 00000000..5a5564d0 --- /dev/null +++ b/src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.cpp @@ -0,0 +1,23 @@ +#include "AssetLoaderLocalizeT6.h" + +using namespace T6; + +AssetLoaderLocalize::AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone) + : CommonLocalizeLoader(searchPath, zone), + m_memory(memory) +{ +} + +AssetCreationResult AssetLoaderLocalize::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + return CreateLocalizeAsset(assetName, context); +} + +AssetCreationResult AssetLoaderLocalize::CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) +{ + auto* asset = m_memory.Alloc(); + asset->name = m_memory.Dup(localizeEntry.m_key.c_str()); + asset->value = m_memory.Dup(localizeEntry.m_value.c_str()); + + return AssetCreationResult::Success(context.AddAsset(localizeEntry.m_key, asset)); +} diff --git a/src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.h b/src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.h new file mode 100644 index 00000000..72db181f --- /dev/null +++ b/src/ObjLoading/Game/T6/Localize/AssetLoaderLocalizeT6.h @@ -0,0 +1,25 @@ +#pragma once + +#include "Asset/AssetCreationContext.h" +#include "Asset/IAssetCreator.h" +#include "Game/T6/T6.h" +#include "Localize/CommonLocalizeLoader.h" +#include "SearchPath/ISearchPath.h" +#include "Utils/MemoryManager.h" +#include "Zone/Zone.h" + +namespace T6 +{ + class AssetLoaderLocalize final : public AssetCreator, public CommonLocalizeLoader + { + public: + AssetLoaderLocalize(MemoryManager& memory, ISearchPath& searchPath, Zone& zone); + AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override; + + protected: + AssetCreationResult CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) override; + + private: + MemoryManager& m_memory; + }; +} // namespace T6 diff --git a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp index a32be94e..16e433e0 100644 --- a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp +++ b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp @@ -1,130 +1,27 @@ #include "ObjLoaderT6.h" -#include "AssetLoaders/AssetLoaderAddonMapEnts.h" -#include "AssetLoaders/AssetLoaderClipMap.h" -#include "AssetLoaders/AssetLoaderComWorld.h" -#include "AssetLoaders/AssetLoaderDDL.h" -#include "AssetLoaders/AssetLoaderDestructibleDef.h" -#include "AssetLoaders/AssetLoaderEmblemSet.h" -#include "AssetLoaders/AssetLoaderFont.h" -#include "AssetLoaders/AssetLoaderFontIcon.h" -#include "AssetLoaders/AssetLoaderFootstepFxTable.h" -#include "AssetLoaders/AssetLoaderFootstepTable.h" -#include "AssetLoaders/AssetLoaderFx.h" -#include "AssetLoaders/AssetLoaderGameWorldMp.h" -#include "AssetLoaders/AssetLoaderGameWorldSp.h" -#include "AssetLoaders/AssetLoaderGfxImage.h" -#include "AssetLoaders/AssetLoaderGfxLightDef.h" -#include "AssetLoaders/AssetLoaderGfxWorld.h" -#include "AssetLoaders/AssetLoaderGlasses.h" -#include "AssetLoaders/AssetLoaderImpactFx.h" -#include "AssetLoaders/AssetLoaderLeaderboard.h" -#include "AssetLoaders/AssetLoaderLocalizeEntry.h" -#include "AssetLoaders/AssetLoaderMapEnts.h" -#include "AssetLoaders/AssetLoaderMaterial.h" -#include "AssetLoaders/AssetLoaderMemoryBlock.h" -#include "AssetLoaders/AssetLoaderMenu.h" -#include "AssetLoaders/AssetLoaderMenuList.h" -#include "AssetLoaders/AssetLoaderPhysConstraints.h" -#include "AssetLoaders/AssetLoaderPhysPreset.h" -#include "AssetLoaders/AssetLoaderQdb.h" -#include "AssetLoaders/AssetLoaderRawFile.h" -#include "AssetLoaders/AssetLoaderScriptParseTree.h" -#include "AssetLoaders/AssetLoaderSkinnedVerts.h" -#include "AssetLoaders/AssetLoaderSlug.h" -#include "AssetLoaders/AssetLoaderSoundBank.h" -#include "AssetLoaders/AssetLoaderSoundDriverGlobals.h" -#include "AssetLoaders/AssetLoaderSoundPatch.h" -#include "AssetLoaders/AssetLoaderStringTable.h" -#include "AssetLoaders/AssetLoaderTechniqueSet.h" -#include "AssetLoaders/AssetLoaderTracer.h" -#include "AssetLoaders/AssetLoaderVehicle.h" -#include "AssetLoaders/AssetLoaderWeapon.h" -#include "AssetLoaders/AssetLoaderWeaponAttachment.h" -#include "AssetLoaders/AssetLoaderWeaponAttachmentUnique.h" -#include "AssetLoaders/AssetLoaderWeaponCamo.h" -#include "AssetLoaders/AssetLoaderXAnim.h" -#include "AssetLoaders/AssetLoaderXGlobals.h" -#include "AssetLoaders/AssetLoaderXModel.h" -#include "AssetLoaders/AssetLoaderZBarrier.h" +#include "Asset/GlobalAssetPoolsLoader.h" #include "AssetLoading/AssetLoadingManager.h" #include "Game/T6/CommonT6.h" #include "Game/T6/GameAssetPoolT6.h" #include "Game/T6/GameT6.h" +#include "Game/T6/T6.h" #include "Image/Dx12TextureLoader.h" #include "Image/IwiLoader.h" #include "Image/IwiTypes.h" #include "Image/Texture.h" +#include "Localize/AssetLoaderLocalizeT6.h" #include "ObjContainer/IPak/IPak.h" #include "ObjLoading.h" #include +#include namespace T6 { constexpr auto IPAK_READ_HASH = Common::Com_HashKey("ipak_read", 64); constexpr auto GLOBAL_HASH = Common::Com_HashKey("GLOBAL", 64); - ObjLoader::ObjLoader() - { -#define REGISTER_ASSET_LOADER(t) \ - { \ - auto l = std::make_unique(); \ - m_asset_loaders_by_type[l->GetHandlingAssetType()] = std::move(l); \ - } - - REGISTER_ASSET_LOADER(AssetLoaderPhysPreset) - REGISTER_ASSET_LOADER(AssetLoaderPhysConstraints) - REGISTER_ASSET_LOADER(AssetLoaderDestructibleDef) - REGISTER_ASSET_LOADER(AssetLoaderXAnim) - REGISTER_ASSET_LOADER(AssetLoaderXModel) - REGISTER_ASSET_LOADER(AssetLoaderMaterial) - REGISTER_ASSET_LOADER(AssetLoaderTechniqueSet) - REGISTER_ASSET_LOADER(AssetLoaderGfxImage) - REGISTER_ASSET_LOADER(AssetLoaderSoundBank) - REGISTER_ASSET_LOADER(AssetLoaderSoundPatch) - REGISTER_ASSET_LOADER(AssetLoaderClipMap) - REGISTER_ASSET_LOADER(AssetLoaderClipMapPvs) - REGISTER_ASSET_LOADER(AssetLoaderComWorld) - REGISTER_ASSET_LOADER(AssetLoaderGameWorldSp) - REGISTER_ASSET_LOADER(AssetLoaderGameWorldMp) - REGISTER_ASSET_LOADER(AssetLoaderMapEnts) - REGISTER_ASSET_LOADER(AssetLoaderGfxWorld) - REGISTER_ASSET_LOADER(AssetLoaderGfxLightDef) - REGISTER_ASSET_LOADER(AssetLoaderFont) - REGISTER_ASSET_LOADER(AssetLoaderFontIcon) - REGISTER_ASSET_LOADER(AssetLoaderMenuList) - REGISTER_ASSET_LOADER(AssetLoaderMenu) - REGISTER_ASSET_LOADER(AssetLoaderLocalizeEntry) - REGISTER_ASSET_LOADER(AssetLoaderWeapon) - REGISTER_ASSET_LOADER(AssetLoaderWeaponAttachment) - REGISTER_ASSET_LOADER(AssetLoaderWeaponAttachmentUnique) - REGISTER_ASSET_LOADER(AssetLoaderWeaponCamo) - REGISTER_ASSET_LOADER(AssetLoaderSoundDriverGlobals) - REGISTER_ASSET_LOADER(AssetLoaderFx) - REGISTER_ASSET_LOADER(AssetLoaderImpactFx) - REGISTER_ASSET_LOADER(AssetLoaderRawFile) - REGISTER_ASSET_LOADER(AssetLoaderStringTable) - REGISTER_ASSET_LOADER(AssetLoaderLeaderboard) - REGISTER_ASSET_LOADER(AssetLoaderXGlobals) - REGISTER_ASSET_LOADER(AssetLoaderDDL) - REGISTER_ASSET_LOADER(AssetLoaderGlasses) - REGISTER_ASSET_LOADER(AssetLoaderEmblemSet) - REGISTER_ASSET_LOADER(AssetLoaderScriptParseTree) - REGISTER_ASSET_LOADER(AssetLoaderVehicle) - REGISTER_ASSET_LOADER(AssetLoaderMemoryBlock) - REGISTER_ASSET_LOADER(AssetLoaderAddonMapEnts) - REGISTER_ASSET_LOADER(AssetLoaderTracer) - REGISTER_ASSET_LOADER(AssetLoaderSkinnedVerts) - REGISTER_ASSET_LOADER(AssetLoaderQdb) - REGISTER_ASSET_LOADER(AssetLoaderSlug) - REGISTER_ASSET_LOADER(AssetLoaderFootstepTable) - REGISTER_ASSET_LOADER(AssetLoaderFootstepFxTable) - REGISTER_ASSET_LOADER(AssetLoaderZBarrier) - -#undef REGISTER_ASSET_LOADER - } - bool ObjLoader::VerifySoundBankChecksum(const SoundBank& soundBank, const SndRuntimeAssetBank& sndRuntimeAssetBank) { SoundAssetBankChecksum checksum{}; @@ -356,17 +253,155 @@ namespace T6 IPak::Repository.RemoveContainerReferences(&zone); } - void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection) const {} - - bool ObjLoader::LoadAssetForZone(AssetLoadingContext& context, const asset_type_t assetType, const std::string& assetName) const + namespace { - AssetLoadingManager assetLoadingManager(m_asset_loaders_by_type, context); - return assetLoadingManager.LoadAssetFromLoader(assetType, assetName); - } + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone) + { + auto& memory = *zone.GetMemory(); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + // collection.AddDefaultAssetCreator(std::make_unique(memory)); + } - void ObjLoader::FinalizeAssetsForZone(AssetLoadingContext& context) const + void ConfigureGlobalAssetPoolsLoaders(AssetCreatorCollection& collection, Zone& zone) + { + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + collection.AddAssetCreator(std::make_unique>(zone)); + } + + void ConfigureDefaultCreators(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) + { + auto& memory = *zone.GetMemory(); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + // collection.AddAssetCreator(std::make_unique(memory)); + } + } // namespace + + void ObjLoader::ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const { - for (const auto& [type, loader] : m_asset_loaders_by_type) - loader->FinalizeAssetsForZone(context); + ConfigureDefaultCreators(collection, zone, searchPath); + ConfigureGlobalAssetPoolsLoaders(collection, zone); } } // namespace T6 diff --git a/src/ObjLoading/Game/T6/ObjLoaderT6.h b/src/ObjLoading/Game/T6/ObjLoaderT6.h index 2b540f0a..f571c294 100644 --- a/src/ObjLoading/Game/T6/ObjLoaderT6.h +++ b/src/ObjLoading/Game/T6/ObjLoaderT6.h @@ -10,22 +10,16 @@ #include #include #include -#include namespace T6 { class ObjLoader final : public IObjLoader { public: - ObjLoader(); - void LoadReferencedContainersForZone(ISearchPath& searchPath, Zone& zone) const override; void UnloadContainersOfZone(Zone& zone) const override; - void ConfigureCreatorCollection(AssetCreatorCollection& collection) const override; - - bool LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const override; - void FinalizeAssetsForZone(AssetLoadingContext& context) const override; + void ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const override; private: static bool VerifySoundBankChecksum(const SoundBank& soundBank, const SndRuntimeAssetBank& sndRuntimeAssetBank); @@ -43,7 +37,5 @@ namespace T6 static bool IsMpZone(const Zone& zone); static bool IsZmZone(const Zone& zone); - - std::unordered_map> m_asset_loaders_by_type; }; } // namespace T6 diff --git a/src/ObjLoading/IObjLoader.h b/src/ObjLoading/IObjLoader.h index 59aa1a46..8df2d82f 100644 --- a/src/ObjLoading/IObjLoader.h +++ b/src/ObjLoading/IObjLoader.h @@ -28,10 +28,7 @@ public: */ virtual void UnloadContainersOfZone(Zone& zone) const = 0; - virtual void ConfigureCreatorCollection(AssetCreatorCollection& collection) const = 0; - - virtual bool LoadAssetForZone(AssetLoadingContext& context, asset_type_t assetType, const std::string& assetName) const = 0; - virtual void FinalizeAssetsForZone(AssetLoadingContext& context) const = 0; + virtual void ConfigureCreatorCollection(AssetCreatorCollection& collection, Zone& zone, ISearchPath& searchPath) const = 0; static const IObjLoader* GetObjLoaderForGame(GameId game); }; diff --git a/src/ObjLoading/Localize/CommonLocalizeLoader.cpp b/src/ObjLoading/Localize/CommonLocalizeLoader.cpp new file mode 100644 index 00000000..d5071e12 --- /dev/null +++ b/src/ObjLoading/Localize/CommonLocalizeLoader.cpp @@ -0,0 +1,52 @@ +#include "CommonLocalizeLoader.h" + +#include "Localize/LocalizeCommon.h" +#include "Localize/Parsing/LocalizeFileReader.h" + +#include + +CommonLocalizeLoader::CommonLocalizeLoader(ISearchPath& searchPath, Zone& zone) + : m_search_path(searchPath), + m_zone(zone) +{ +} + +std::string CommonLocalizeLoader::GetFileName(const std::string& assetName) const +{ + return std::format("{}/localizedstrings/{}.str", LocalizeCommon::GetNameOfLanguage(m_zone.m_language), assetName); +} + +AssetCreationResult CommonLocalizeLoader::CreateLocalizeAsset(const std::string& assetName, AssetCreationContext& context) +{ + std::string fileName = GetFileName(assetName); + + const auto file = m_search_path.Open(fileName); + if (!file.IsOpen()) + return AssetCreationResult::NoAction(); + + LocalizeFileReader reader(*file.m_stream, assetName, m_zone.m_language, *this); + + std::vector localizeEntries; + if (!reader.ReadLocalizeFile(localizeEntries)) + return AssetCreationResult::Failure(); + + auto lastResult = AssetCreationResult::Failure(); + for (const auto& entry : localizeEntries) + { + lastResult = CreateAssetFromCommonAsset(entry, context); + if (!lastResult.HasBeenSuccessful()) + return lastResult; + } + + return lastResult; +} + +bool CommonLocalizeLoader::CheckLocalizeEntryForDuplicates(const std::string& key) +{ + const auto existingEntry = m_keys.find(key); + if (existingEntry != m_keys.end()) + return false; + + m_keys.emplace(key); + return true; +} diff --git a/src/ObjLoading/Localize/CommonLocalizeLoader.h b/src/ObjLoading/Localize/CommonLocalizeLoader.h new file mode 100644 index 00000000..6768bdd6 --- /dev/null +++ b/src/ObjLoading/Localize/CommonLocalizeLoader.h @@ -0,0 +1,32 @@ +#pragma once + +#include "Asset/IAssetCreator.h" +#include "AssetLoading/IAssetLoadingManager.h" +#include "Localize/CommonLocalizeEntry.h" +#include "Localize/Parsing/ILocalizeFileDuplicationChecker.h" +#include "SearchPath/ISearchPath.h" +#include "Zone/Zone.h" + +#include +#include + +class CommonLocalizeLoader : ILocalizeFileDuplicationChecker +{ +public: + CommonLocalizeLoader(ISearchPath& searchPath, Zone& zone); + + AssetCreationResult CreateLocalizeAsset(const std::string& assetName, AssetCreationContext& context); + +protected: + virtual AssetCreationResult CreateAssetFromCommonAsset(const CommonLocalizeEntry& localizeEntry, AssetCreationContext& context) = 0; + +private: + std::string GetFileName(const std::string& assetName) const; + + bool CheckLocalizeEntryForDuplicates(const std::string& key) override; + + ISearchPath& m_search_path; + Zone& m_zone; + + std::unordered_set m_keys; +}; diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp deleted file mode 100644 index bbfd8bd3..00000000 --- a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "LocalizeCommonAssetLoader.h" - -#include "Localize/LocalizeCommon.h" -#include "Localize/LocalizeReadingZoneState.h" -#include "Localize/Parsing/LocalizeFileReader.h" - -#include - -LocalizeCommonAssetLoader::LocalizeCommonAssetLoader(std::function entryCallback) - : m_entry_callback(std::move(entryCallback)) -{ -} - -std::string LocalizeCommonAssetLoader::GetFileName(const std::string& assetName, Zone* zone) const -{ - std::ostringstream ss; - ss << LocalizeCommon::GetNameOfLanguage(zone->m_language) << "/localizedstrings/" << assetName << ".str"; - return ss.str(); -} - -bool LocalizeCommonAssetLoader::LoadLocalizeAsset(const std::string& assetName, ISearchPath* searchPath, IAssetLoadingManager* manager, Zone* zone) const -{ - std::string fileName = GetFileName(assetName, zone); - - const auto file = searchPath->Open(fileName); - if (!file.IsOpen()) - return false; - - auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState(); - LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState); - - std::vector localizeEntries; - if (!reader.ReadLocalizeFile(localizeEntries)) - return false; - - for (const auto& entry : localizeEntries) - { - m_entry_callback(entry); - } - - return true; -} diff --git a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h b/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h deleted file mode 100644 index 0955b630..00000000 --- a/src/ObjLoading/Localize/LocalizeCommonAssetLoader.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "AssetLoading/IAssetLoadingManager.h" -#include "Localize/CommonLocalizeEntry.h" -#include "SearchPath/ISearchPath.h" -#include "Zone/Zone.h" - -#include -#include - -class LocalizeCommonAssetLoader -{ -public: - explicit LocalizeCommonAssetLoader(std::function entryCallback); - - bool LoadLocalizeAsset(const std::string& assetName, ISearchPath* searchPath, IAssetLoadingManager* manager, Zone* zone) const; - -private: - std::string GetFileName(const std::string& assetName, Zone* zone) const; - - std::function m_entry_callback; -}; diff --git a/src/ObjLoading/Localize/LocalizeReadingZoneState.cpp b/src/ObjLoading/Localize/LocalizeReadingZoneState.cpp deleted file mode 100644 index 652c5ba9..00000000 --- a/src/ObjLoading/Localize/LocalizeReadingZoneState.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "LocalizeReadingZoneState.h" - -bool LocalizeReadingZoneState::DoLocalizeEntryDuplicateCheck(const std::string& key) -{ - const auto existingEntry = m_keys.find(key); - if (existingEntry != m_keys.end()) - return false; - - m_keys.emplace(key); - return true; -} diff --git a/src/ObjLoading/Localize/LocalizeReadingZoneState.h b/src/ObjLoading/Localize/Parsing/ILocalizeFileDuplicationChecker.h similarity index 51% rename from src/ObjLoading/Localize/LocalizeReadingZoneState.h rename to src/ObjLoading/Localize/Parsing/ILocalizeFileDuplicationChecker.h index 6350e138..d7c7f6c2 100644 --- a/src/ObjLoading/Localize/LocalizeReadingZoneState.h +++ b/src/ObjLoading/Localize/Parsing/ILocalizeFileDuplicationChecker.h @@ -1,13 +1,12 @@ #pragma once -#include "AssetLoading/IZoneAssetLoaderState.h" - #include -#include -class LocalizeReadingZoneState final : public IZoneAssetLoaderState +class ILocalizeFileDuplicationChecker { public: + virtual ~ILocalizeFileDuplicationChecker() = default; + /** * Checks whether a localize key was already added. * Inserts key if it was not added yet. @@ -15,8 +14,5 @@ public: * \param key The key to check * \returns \c true if key was not duplicated yet, \c false otherwise */ - bool DoLocalizeEntryDuplicateCheck(const std::string& key); - -private: - std::unordered_set m_keys; + virtual bool CheckLocalizeEntryForDuplicates(const std::string& key) = 0; }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp index 35958c06..fb484dfa 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp @@ -8,8 +8,8 @@ #include "Sequence/SequenceLocalizeFileReference.h" #include "Sequence/SequenceLocalizeFileVersion.h" -LocalizeFileParser::LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, LocalizeReadingZoneState* zoneState) - : AbstractParser(lexer, std::make_unique(language, zoneState)) +LocalizeFileParser::LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, ILocalizeFileDuplicationChecker& duplicationChecker) + : AbstractParser(lexer, std::make_unique(language, duplicationChecker)) { } diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h index 20b5b39b..8ce6517d 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParser.h @@ -12,6 +12,6 @@ protected: const std::vector& GetTestsForState() override; public: - LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, LocalizeReadingZoneState* zoneState); + LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, ILocalizeFileDuplicationChecker& duplicationChecker); std::vector GetParsedValues(); }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp index 0a52c5f8..d7464268 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp @@ -3,10 +3,10 @@ #include "Localize/LocalizeCommon.h" #include "Utils/StringUtils.h" -LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, LocalizeReadingZoneState* zoneState) +LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, ILocalizeFileDuplicationChecker& duplicationChecker) : m_end(false), m_language(language), - m_zone_state(zoneState) + m_duplication_checker(duplicationChecker) { m_language_name_caps = LocalizeCommon::GetNameOfLanguage(m_language); utils::MakeStringUpperCase(m_language_name_caps); diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h index bee910d7..df931972 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h @@ -1,8 +1,8 @@ #pragma once #include "Game/GameLanguage.h" +#include "ILocalizeFileDuplicationChecker.h" #include "Localize/CommonLocalizeEntry.h" -#include "Localize/LocalizeReadingZoneState.h" #include #include @@ -10,16 +10,16 @@ class LocalizeFileParserState { public: + LocalizeFileParserState(GameLanguage language, ILocalizeFileDuplicationChecker& duplicationChecker); + bool m_end; std::vector m_entries; GameLanguage m_language; - LocalizeReadingZoneState* m_zone_state; + ILocalizeFileDuplicationChecker& m_duplication_checker; std::string m_language_name_caps; std::string m_current_reference; std::unordered_set m_current_reference_languages; - - LocalizeFileParserState(GameLanguage language, LocalizeReadingZoneState* zoneState); }; diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp index b50c53b0..76a231b6 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp @@ -4,11 +4,11 @@ #include "Parsing/Impl/CommentRemovingStreamProxy.h" #include "Parsing/Impl/ParserSingleInputStream.h" -LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState) +LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, ILocalizeFileDuplicationChecker& duplicationChecker) : m_file_name(std::move(fileName)), m_stream(nullptr), m_language(language), - m_zone_state(zoneState) + m_duplication_checker(duplicationChecker) { OpenBaseStream(stream); SetupStreamProxies(); @@ -38,7 +38,7 @@ bool LocalizeFileReader::ReadLocalizeFile(std::vector& entr lexerConfig.m_read_floating_point_numbers = false; const auto lexer = std::make_unique(m_stream, std::move(lexerConfig)); - const auto parser = std::make_unique(lexer.get(), m_language, m_zone_state); + const auto parser = std::make_unique(lexer.get(), m_language, m_duplication_checker); if (parser->Parse()) { diff --git a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h index 1abb4d60..9028041b 100644 --- a/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h +++ b/src/ObjLoading/Localize/Parsing/LocalizeFileReader.h @@ -1,8 +1,8 @@ #pragma once #include "Game/GameLanguage.h" +#include "ILocalizeFileDuplicationChecker.h" #include "Localize/CommonLocalizeEntry.h" -#include "Localize/LocalizeReadingZoneState.h" #include "Parsing/IParserLineStream.h" #include @@ -16,13 +16,13 @@ class LocalizeFileReader IParserLineStream* m_stream; std::vector> m_open_streams; GameLanguage m_language; - LocalizeReadingZoneState* m_zone_state; + ILocalizeFileDuplicationChecker& m_duplication_checker; bool OpenBaseStream(std::istream& stream); void SetupStreamProxies(); public: - LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState); + LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, ILocalizeFileDuplicationChecker& duplicationChecker); bool ReadLocalizeFile(std::vector& entries); }; diff --git a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp index fbf8110b..60102949 100644 --- a/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp +++ b/src/ObjLoading/Localize/Parsing/Sequence/SequenceLocalizeFileLanguageValue.cpp @@ -33,7 +33,7 @@ void SequenceLocalizeFileLanguageValue::ProcessMatch(LocalizeFileParserState* st if (langName == state->m_language_name_caps) { const auto& currentReference = state->m_current_reference; - if (!state->m_zone_state->DoLocalizeEntryDuplicateCheck(currentReference)) + if (!state->m_duplication_checker.CheckLocalizeEntryForDuplicates(currentReference)) { std::cout << "Localize: a value for reference \"" << currentReference << "\" was already defined\n"; }