From 9ebea5034a7e05b6da548aabcf509b083163a97a Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 24 Dec 2024 00:58:53 +0100 Subject: [PATCH] chore: generalize default asset creators --- src/Common/Game/IAsset.h | 26 +++++++++ src/Common/Game/IW3/IW3.h | 29 ++++++++++ src/ObjLoading/Asset/AssetCreationContext.cpp | 2 + src/ObjLoading/Asset/AssetCreationContext.h | 4 +- ...setCreator.cpp => AssetCreationResult.cpp} | 2 +- src/ObjLoading/Asset/AssetCreationResult.h | 22 ++++++++ src/ObjLoading/Asset/IAssetCreator.h | 20 +------ src/ObjLoading/Asset/IDefaultAssetCreator.h | 21 ++++++- .../AssetLoaders/AssetLoaderStringTable.cpp | 39 ------------- .../IW3/AssetLoaders/AssetLoaderStringTable.h | 17 ------ .../Game/IW3/Image/DefaultCreatorImageIW3.cpp | 16 ------ .../Game/IW3/Image/DefaultCreatorImageIW3.h | 18 ------ src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp | 55 +++++++++---------- .../IW3/RawFile/DefaultCreatorRawFileIW3.cpp | 16 ------ .../IW3/RawFile/DefaultCreatorRawFileIW3.h | 18 ------ .../StringTable/AssetLoaderStringTableIW3.cpp | 29 ++++++++++ .../StringTable/AssetLoaderStringTableIW3.h | 21 +++++++ .../AssetLoaderStringTableIW3Test.cpp} | 20 +++++-- 18 files changed, 193 insertions(+), 182 deletions(-) rename src/ObjLoading/Asset/{IAssetCreator.cpp => AssetCreationResult.cpp} (96%) create mode 100644 src/ObjLoading/Asset/AssetCreationResult.h delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.cpp delete mode 100644 src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.h delete mode 100644 src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp delete mode 100644 src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.h delete mode 100644 src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp delete mode 100644 src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.h create mode 100644 src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.cpp create mode 100644 src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.h rename test/ObjLoadingTests/Game/IW3/{AssetLoaders/AssetLoaderStringTableTest.cpp => StringTable/AssetLoaderStringTableIW3Test.cpp} (59%) diff --git a/src/Common/Game/IAsset.h b/src/Common/Game/IAsset.h index a63c373c..d9879d0f 100644 --- a/src/Common/Game/IAsset.h +++ b/src/Common/Game/IAsset.h @@ -2,6 +2,9 @@ #include "Zone/ZoneTypes.h" +#include +#include + struct IAssetBase { }; @@ -12,3 +15,26 @@ public: static constexpr auto EnumEntry = AssetTypeEnum; using Type = AssetType; }; + +template struct AssetNameAccessor +{ +public: + static_assert(std::is_base_of_v); + + const char*& operator()(AssetType::Type& asset) + { + throw std::runtime_error(); + } +}; + +#define DEFINE_ASSET_NAME_ACCESSOR(assetType, nameProperty) \ + template<> struct AssetNameAccessor \ + { \ + public: \ + static_assert(std::is_base_of_v); \ + \ + const char*& operator()(assetType::Type& asset) \ + { \ + return asset.nameProperty; \ + } \ + } diff --git a/src/Common/Game/IW3/IW3.h b/src/Common/Game/IW3/IW3.h index a489583c..1a3bda98 100644 --- a/src/Common/Game/IW3/IW3.h +++ b/src/Common/Game/IW3/IW3.h @@ -113,3 +113,32 @@ namespace IW3 using AssetRawFile = Asset; using AssetStringTable = Asset; } // namespace IW3 + +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXModelPieces, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetPhysPreset, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXAnim, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetXModel, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetMaterial, info.name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetTechniqueSet, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetImage, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetSound, aliasName); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetSoundCurve, filename); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetLoadedSound, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetClipMap, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetClipMapPvs, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetComWorld, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetGameWorldSp, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetGameWorldMp, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetMapEnts, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetGfxWorld, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetLightDef, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetFont, fontName); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetMenuList, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetMenu, window.name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetLocalize, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetWeapon, szInternalName); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetSoundDriverGlobals, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetFx, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetImpactFx, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetRawFile, name); +DEFINE_ASSET_NAME_ACCESSOR(IW3::AssetStringTable, name); diff --git a/src/ObjLoading/Asset/AssetCreationContext.cpp b/src/ObjLoading/Asset/AssetCreationContext.cpp index 2e71bdca..fc8a8332 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.cpp +++ b/src/ObjLoading/Asset/AssetCreationContext.cpp @@ -3,6 +3,8 @@ #include #include +IgnoredAssetLookup::IgnoredAssetLookup() = default; + IgnoredAssetLookup::IgnoredAssetLookup(const AssetList& assetList) { m_ignored_asset_lookup.reserve(assetList.m_entries.size()); diff --git a/src/ObjLoading/Asset/AssetCreationContext.h b/src/ObjLoading/Asset/AssetCreationContext.h index f4e8d117..5e0a6d77 100644 --- a/src/ObjLoading/Asset/AssetCreationContext.h +++ b/src/ObjLoading/Asset/AssetCreationContext.h @@ -1,6 +1,5 @@ #pragma once -#include "AssetCreatorCollection.h" #include "AssetLoading/IZoneAssetLoaderState.h" #include "AssetRegistration.h" #include "Game/IAsset.h" @@ -20,6 +19,7 @@ class AssetCreatorCollection; class IgnoredAssetLookup { public: + IgnoredAssetLookup(); explicit IgnoredAssetLookup(const AssetList& assetList); [[nodiscard]] bool IsAssetIgnored(asset_type_t assetType, const std::string& name) const; @@ -90,3 +90,5 @@ private: const IgnoredAssetLookup* m_ignored_asset_lookup; std::unordered_map> m_zone_asset_loader_states; }; + +#include "AssetCreatorCollection.h" diff --git a/src/ObjLoading/Asset/IAssetCreator.cpp b/src/ObjLoading/Asset/AssetCreationResult.cpp similarity index 96% rename from src/ObjLoading/Asset/IAssetCreator.cpp rename to src/ObjLoading/Asset/AssetCreationResult.cpp index abaa88e5..cc4ad30d 100644 --- a/src/ObjLoading/Asset/IAssetCreator.cpp +++ b/src/ObjLoading/Asset/AssetCreationResult.cpp @@ -1,4 +1,4 @@ -#include "IAssetCreator.h" +#include "AssetCreationResult.h" AssetCreationResult AssetCreationResult::Success(XAssetInfoGeneric* assetInfo) { diff --git a/src/ObjLoading/Asset/AssetCreationResult.h b/src/ObjLoading/Asset/AssetCreationResult.h new file mode 100644 index 00000000..856e9ad0 --- /dev/null +++ b/src/ObjLoading/Asset/AssetCreationResult.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Pool/XAssetInfo.h" + +class AssetCreationResult +{ +public: + static AssetCreationResult Success(XAssetInfoGeneric* assetInfo); + static AssetCreationResult Failure(); + static AssetCreationResult NoAction(); + + [[nodiscard]] bool HasBeenSuccessful() const; + [[nodiscard]] bool HasTakenAction() const; + [[nodiscard]] bool HasFailed() const; + [[nodiscard]] XAssetInfoGeneric* GetAssetInfo() const; + +private: + AssetCreationResult(bool takenAction, XAssetInfoGeneric* assetInfo); + + bool m_taken_action; + XAssetInfoGeneric* m_asset_info; +}; diff --git a/src/ObjLoading/Asset/IAssetCreator.h b/src/ObjLoading/Asset/IAssetCreator.h index 9f7232e9..8d0bc25d 100644 --- a/src/ObjLoading/Asset/IAssetCreator.h +++ b/src/ObjLoading/Asset/IAssetCreator.h @@ -1,6 +1,7 @@ #pragma once #include "AssetCreationContext.h" +#include "AssetCreationResult.h" #include "Game/IAsset.h" #include "Pool/XAssetInfo.h" #include "SearchPath/ISearchPath.h" @@ -10,25 +11,6 @@ #include #include -class AssetCreationResult -{ -public: - static AssetCreationResult Success(XAssetInfoGeneric* assetInfo); - static AssetCreationResult Failure(); - static AssetCreationResult NoAction(); - - [[nodiscard]] bool HasBeenSuccessful() const; - [[nodiscard]] bool HasTakenAction() const; - [[nodiscard]] bool HasFailed() const; - [[nodiscard]] XAssetInfoGeneric* GetAssetInfo() const; - -private: - AssetCreationResult(bool takenAction, XAssetInfoGeneric* assetInfo); - - bool m_taken_action; - XAssetInfoGeneric* m_asset_info; -}; - class AssetCreationContext; class IAssetCreator diff --git a/src/ObjLoading/Asset/IDefaultAssetCreator.h b/src/ObjLoading/Asset/IDefaultAssetCreator.h index 5820eb38..bcd0963f 100644 --- a/src/ObjLoading/Asset/IDefaultAssetCreator.h +++ b/src/ObjLoading/Asset/IDefaultAssetCreator.h @@ -1,16 +1,15 @@ #pragma once #include "AssetCreationContext.h" +#include "AssetCreationResult.h" #include "Game/IAsset.h" #include "IAssetCreator.h" +#include "Utils/MemoryManager.h" #include "Zone/ZoneTypes.h" #include #include -class AssetCreationResult; -class AssetCreationContext; - class IDefaultAssetCreator { public: @@ -30,8 +29,24 @@ template class DefaultAssetCreator : public IDefaultAssetCre public: static_assert(std::is_base_of_v); + DefaultAssetCreator(MemoryManager& memory) + : m_memory(memory) + { + } + [[nodiscard]] asset_type_t GetHandlingAssetType() const override { return AssetType::EnumEntry; } + + AssetCreationResult CreateDefaultAsset(const std::string& assetName, AssetCreationContext& context) const override + { + auto* asset = m_memory.Alloc(); + AssetNameAccessor{}(*asset) = m_memory.Dup(assetName.c_str()); + + return AssetCreationResult::Success(context.AddAsset(assetName, asset)); + } + +private: + MemoryManager& m_memory; }; diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.cpp b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.cpp deleted file mode 100644 index 972e647f..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "AssetLoaderStringTable.h" - -#include "Csv/CsvStream.h" -#include "Game/IW3/CommonIW3.h" -#include "ObjLoading.h" -#include "Pool/GlobalAssetPool.h" -#include "StringTable/StringTableLoader.h" - -#include - -using namespace IW3; - -void* AssetLoaderStringTable::CreateEmptyAsset(const std::string& assetName, MemoryManager* memory) -{ - auto* stringTable = memory->Create(); - memset(stringTable, 0, sizeof(StringTable)); - stringTable->name = memory->Dup(assetName.c_str()); - return stringTable; -} - -bool AssetLoaderStringTable::CanLoadFromRaw() const -{ - return true; -} - -bool AssetLoaderStringTable::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; - - string_table::StringTableLoaderV1 loader; - auto* stringTable = loader.LoadFromStream(assetName, *memory, *file.m_stream); - - manager->AddAsset(assetName, stringTable); - - return true; -} diff --git a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.h b/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.h deleted file mode 100644 index a8a52387..00000000 --- a/src/ObjLoading/Game/IW3/AssetLoaders/AssetLoaderStringTable.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "AssetLoading/BasicAssetLoader.h" -#include "Game/IW3/IW3.h" -#include "SearchPath/ISearchPath.h" - -namespace IW3 -{ - class AssetLoaderStringTable 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/Image/DefaultCreatorImageIW3.cpp b/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp deleted file mode 100644 index 4e3ed4cc..00000000 --- a/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#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 deleted file mode 100644 index 5b7aa7e1..00000000 --- a/src/ObjLoading/Game/IW3/Image/DefaultCreatorImageIW3.h +++ /dev/null @@ -1,18 +0,0 @@ -#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/ObjLoaderIW3.cpp b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp index 4df8a0c6..cca44a9a 100644 --- a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp +++ b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp @@ -4,7 +4,6 @@ #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" @@ -22,33 +21,33 @@ namespace { 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)); + 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) diff --git a/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp b/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp deleted file mode 100644 index 0553a792..00000000 --- a/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#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 deleted file mode 100644 index 229538f7..00000000 --- a/src/ObjLoading/Game/IW3/RawFile/DefaultCreatorRawFileIW3.h +++ /dev/null @@ -1,18 +0,0 @@ -#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/IW3/StringTable/AssetLoaderStringTableIW3.cpp b/src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.cpp new file mode 100644 index 00000000..6a846669 --- /dev/null +++ b/src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.cpp @@ -0,0 +1,29 @@ +#include "AssetLoaderStringTableIW3.h" + +#include "Game/IW3/IW3.h" +#include "Pool/GlobalAssetPool.h" +#include "StringTable/StringTableLoader.h" + +#include + +using namespace IW3; + +AssetLoaderStringTable::AssetLoaderStringTable(MemoryManager& memory, ISearchPath& searchPath) + : m_memory(memory), + m_search_path(searchPath) +{ +} + +AssetCreationResult AssetLoaderStringTable::CreateAsset(const std::string& assetName, AssetCreationContext& context) +{ + const auto file = m_search_path.Open(assetName); + if (!file.IsOpen()) + return AssetCreationResult::NoAction(); + + string_table::StringTableLoaderV1 loader; + auto* stringTable = loader.LoadFromStream(assetName, m_memory, *file.m_stream); + if (!stringTable) + return AssetCreationResult::Failure(); + + return AssetCreationResult::Success(context.AddAsset(assetName, stringTable)); +} diff --git a/src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.h b/src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.h new file mode 100644 index 00000000..618eb8a9 --- /dev/null +++ b/src/ObjLoading/Game/IW3/StringTable/AssetLoaderStringTableIW3.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 AssetLoaderStringTable final : public AssetCreator + { + public: + AssetLoaderStringTable(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/test/ObjLoadingTests/Game/IW3/AssetLoaders/AssetLoaderStringTableTest.cpp b/test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp similarity index 59% rename from test/ObjLoadingTests/Game/IW3/AssetLoaders/AssetLoaderStringTableTest.cpp rename to test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp index e3320300..819dd3c0 100644 --- a/test/ObjLoadingTests/Game/IW3/AssetLoaders/AssetLoaderStringTableTest.cpp +++ b/test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp @@ -1,8 +1,9 @@ -#include "Game/IW3/AssetLoaders/AssetLoaderStringTable.h" +#include "Game/IW3/StringTable/AssetLoaderStringTableIW3.h" #include "Game/IW3/GameIW3.h" #include "Mock/MockAssetLoadingManager.h" #include "Mock/MockSearchPath.h" +#include "Pool/ZoneAssetPools.h" #include "Utils/MemoryManager.h" #include @@ -21,16 +22,23 @@ namespace "lorem,ipsum"); Zone zone("MockZone", 0, IGame::GetGameById(GameId::IW3)); - MockAssetLoadingManager assetLoadingManager(zone, searchPath); + zone.m_pools = ZoneAssetPools::CreateForGame(GameId::IW3, &zone, 1); + + const auto assetTypeCount = zone.m_pools->GetAssetTypeCount(); + for (auto i = 0; i < assetTypeCount; i++) + zone.m_pools->InitPoolDynamic(i); - AssetLoaderStringTable assetLoader; MemoryManager memory; + AssetCreatorCollection creatorCollection(zone); + AssetLoaderStringTable assetLoader(memory, searchPath); + IgnoredAssetLookup ignoredAssetLookup; - assetLoader.LoadFromRaw("mp/cooltable.csv", &searchPath, &memory, &assetLoadingManager, &zone); + AssetCreationContext context(&zone, &creatorCollection, &ignoredAssetLookup); - auto* assetInfo = reinterpret_cast*>(assetLoadingManager.MockGetAddedAsset("mp/cooltable.csv")); - REQUIRE(assetInfo != nullptr); + const auto result = assetLoader.CreateAsset("mp/cooltable.csv", context); + REQUIRE(result.HasBeenSuccessful()); + const auto* assetInfo = reinterpret_cast*>(result.GetAssetInfo()); const auto* stringTable = assetInfo->Asset(); REQUIRE(stringTable->name == "mp/cooltable.csv"s); REQUIRE(stringTable->columnCount == 3);