diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp index c05a7c5f..eb3cb03b 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp @@ -1,5 +1,9 @@ #include "AssetLoadingManager.h" +#include "Utils/StringUtils.h" + +#include +#include #include AssetLoadingManager::AssetLoadingManager(const std::map>& assetLoadersByType, AssetLoadingContext& context) @@ -26,31 +30,11 @@ XAssetInfoGeneric* AssetLoadingManager::AddAssetInternal(std::unique_ptrm_pools->AddAsset(std::move(xAssetInfo)); if (m_last_dependency_loaded == nullptr) - std::cout << "Failed to add asset of type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\" to pool: \"" << pAssetName << "\"\n"; + std::cerr << "Failed to add asset of type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\" to pool: \"" << pAssetName << "\"\n"; return m_last_dependency_loaded; } -XAssetInfoGeneric* AssetLoadingManager::AddAsset(const asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings) -{ - return AddAsset(std::make_unique(assetType, assetName, asset, std::move(dependencies), std::move(usedScriptStrings))); -} - -XAssetInfoGeneric* AssetLoadingManager::AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings, - std::vector indirectAssetReferences) -{ - return AddAsset(std::make_unique( - assetType, assetName, asset, std::move(dependencies), std::move(usedScriptStrings), std::move(indirectAssetReferences))); -} - XAssetInfoGeneric* AssetLoadingManager::AddAsset(std::unique_ptr xAssetInfo) { xAssetInfo->m_zone = m_context.m_zone; @@ -66,7 +50,8 @@ XAssetInfoGeneric* AssetLoadingManager::LoadIgnoredDependency(const asset_type_t auto* linkAsset = loader->CreateEmptyAsset(assetName, m_context.m_zone->GetMemory()); if (linkAsset) { - AddAsset(assetType, assetName, linkAsset, std::vector(), std::vector()); + IAssetLoadingManager::AddAsset( + assetType, assetName, linkAsset, std::vector(), std::vector(), std::vector()); auto* lastDependency = m_last_dependency_loaded; m_last_dependency_loaded = nullptr; return lastDependency; @@ -81,11 +66,11 @@ XAssetInfoGeneric* AssetLoadingManager::LoadIgnoredDependency(const asset_type_t return lastDependency; } - std::cout << "Failed to create empty asset \"" << assetName << "\" for type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\"\n"; + std::cerr << "Failed to create empty asset \"" << assetName << "\" for type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\"\n"; return nullptr; } -XAssetInfoGeneric* AssetLoadingManager::LoadAssetDependency(const asset_type_t assetType, const std::string& assetName, IAssetLoader* loader) +XAssetInfoGeneric* AssetLoadingManager::LoadAssetDependency(const asset_type_t assetType, const std::string& assetName, const IAssetLoader* loader) { if (loader->CanLoadFromGdt() && !m_context.m_gdt_files.empty() && loader->LoadFromGdt(assetName, &m_context, m_context.m_zone->GetMemory(), this, m_context.m_zone)) @@ -141,51 +126,65 @@ XAssetInfoGeneric* AssetLoadingManager::LoadAssetDependency(const asset_type_t a return lastDependency; } - std::cout << "Failed to load asset of type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\": \"" << assetName << "\"\n"; + std::cerr << "Failed to load asset of type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\": \"" << assetName << "\"\n"; return nullptr; } XAssetInfoGeneric* AssetLoadingManager::LoadDependency(const asset_type_t assetType, const std::string& assetName) { - auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, assetName); + const auto normalizedAssetName = NormalizeAssetName(assetName); + + auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, normalizedAssetName); if (alreadyLoadedAsset) return alreadyLoadedAsset; const auto loader = m_asset_loaders_by_type.find(assetType); if (loader != m_asset_loaders_by_type.end()) { - const auto ignoreEntry = m_context.m_ignored_asset_map.find(assetName); + const auto ignoreEntry = m_context.m_ignored_asset_map.find(normalizedAssetName); if (ignoreEntry != m_context.m_ignored_asset_map.end() && ignoreEntry->second == assetType) { - const auto linkAssetName = ',' + assetName; + const auto linkAssetName = std::format(",{}", normalizedAssetName); return LoadIgnoredDependency(assetType, linkAssetName, loader->second.get()); } - return LoadAssetDependency(assetType, assetName, loader->second.get()); + return LoadAssetDependency(assetType, normalizedAssetName, loader->second.get()); } - std::cout << "Failed to find loader for asset type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\"\n"; + std::cerr << "Failed to find loader for asset type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\"\n"; return nullptr; } IndirectAssetReference AssetLoadingManager::LoadIndirectAssetReference(const asset_type_t assetType, const std::string& assetName) { - const auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, assetName); - if (alreadyLoadedAsset) - return IndirectAssetReference(assetType, assetName); + const auto normalizedAssetName = NormalizeAssetName(assetName); - const auto ignoreEntry = m_context.m_ignored_asset_map.find(assetName); + const auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, normalizedAssetName); + if (alreadyLoadedAsset) + return IndirectAssetReference(assetType, normalizedAssetName); + + const auto ignoreEntry = m_context.m_ignored_asset_map.find(normalizedAssetName); if (ignoreEntry != m_context.m_ignored_asset_map.end() && ignoreEntry->second == assetType) - return IndirectAssetReference(assetType, assetName); + return IndirectAssetReference(assetType, normalizedAssetName); const auto loader = m_asset_loaders_by_type.find(assetType); if (loader != m_asset_loaders_by_type.end()) { - LoadAssetDependency(assetType, assetName, loader->second.get()); - return IndirectAssetReference(assetType, assetName); + LoadAssetDependency(assetType, normalizedAssetName, loader->second.get()); + return IndirectAssetReference(assetType, normalizedAssetName); } - std::cout << "Failed to find loader for asset type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\"\n"; - return IndirectAssetReference(assetType, assetName); + std::cerr << "Failed to find loader for asset type \"" << m_context.m_zone->m_pools->GetAssetTypeName(assetType) << "\"\n"; + return IndirectAssetReference(assetType, normalizedAssetName); +} + +std::string AssetLoadingManager::NormalizeAssetName(const std::string& assetName) +{ + std::string result(assetName); + utils::MakeStringLowerCase(result); + + std::ranges::replace(result, '\\', '/'); + + return result; } diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.h b/src/ObjLoading/AssetLoading/AssetLoadingManager.h index 23fac1f0..edbd2301 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.h +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.h @@ -1,4 +1,5 @@ #pragma once + #include "AssetLoadingContext.h" #include "IAssetLoader.h" #include "IAssetLoadingManager.h" @@ -7,34 +8,26 @@ class AssetLoadingManager final : public IAssetLoadingManager { - const std::map>& m_asset_loaders_by_type; - AssetLoadingContext& m_context; - XAssetInfoGeneric* m_last_dependency_loaded; - - XAssetInfoGeneric* LoadIgnoredDependency(asset_type_t assetType, const std::string& assetName, IAssetLoader* loader); - XAssetInfoGeneric* LoadAssetDependency(asset_type_t assetType, const std::string& assetName, IAssetLoader* loader); - - XAssetInfoGeneric* AddAssetInternal(std::unique_ptr xAssetInfo); - public: AssetLoadingManager(const std::map>& assetLoadersByType, AssetLoadingContext& context); bool LoadAssetFromLoader(asset_type_t assetType, const std::string& assetName); - _NODISCARD AssetLoadingContext* GetAssetLoadingContext() const override; + [[nodiscard]] AssetLoadingContext* GetAssetLoadingContext() const override; - XAssetInfoGeneric* AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings) override; - XAssetInfoGeneric* AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings, - std::vector indirectAssetReferences) override; XAssetInfoGeneric* AddAsset(std::unique_ptr xAssetInfo) override; XAssetInfoGeneric* LoadDependency(asset_type_t assetType, const std::string& assetName) override; IndirectAssetReference LoadIndirectAssetReference(asset_type_t assetType, const std::string& assetName) override; + +private: + XAssetInfoGeneric* LoadIgnoredDependency(asset_type_t assetType, const std::string& assetName, IAssetLoader* loader); + XAssetInfoGeneric* LoadAssetDependency(asset_type_t assetType, const std::string& assetName, const IAssetLoader* loader); + + XAssetInfoGeneric* AddAssetInternal(std::unique_ptr xAssetInfo); + + static std::string NormalizeAssetName(const std::string& assetName); + + const std::map>& m_asset_loaders_by_type; + AssetLoadingContext& m_context; + XAssetInfoGeneric* m_last_dependency_loaded; }; diff --git a/src/ObjLoading/AssetLoading/IAssetLoadingManager.h b/src/ObjLoading/AssetLoading/IAssetLoadingManager.h index 0d90a6f2..b7283769 100644 --- a/src/ObjLoading/AssetLoading/IAssetLoadingManager.h +++ b/src/ObjLoading/AssetLoading/IAssetLoadingManager.h @@ -18,17 +18,6 @@ public: _NODISCARD virtual AssetLoadingContext* GetAssetLoadingContext() const = 0; - virtual XAssetInfoGeneric* AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings) = 0; - virtual XAssetInfoGeneric* AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings, - std::vector indirectAssetReferences) = 0; virtual XAssetInfoGeneric* AddAsset(std::unique_ptr xAssetInfo) = 0; XAssetInfoGeneric* AddAsset(const asset_type_t assetType, const std::string& assetName, void* asset) @@ -41,6 +30,26 @@ public: return AddAsset(assetType, assetName, asset, std::move(dependencies), std::vector()); } + XAssetInfoGeneric* AddAsset(const asset_type_t assetType, + const std::string& assetName, + void* asset, + std::vector dependencies, + std::vector usedScriptStrings) + { + return AddAsset(assetType, assetName, asset, std::move(dependencies), std::move(usedScriptStrings), std::vector()); + } + + XAssetInfoGeneric* AddAsset(const asset_type_t assetType, + const std::string& assetName, + void* asset, + std::vector dependencies, + std::vector usedScriptStrings, + std::vector indirectAssetReferences) + { + return AddAsset(std::make_unique( + assetType, assetName, asset, std::move(dependencies), std::move(usedScriptStrings), std::move(indirectAssetReferences))); + } + virtual XAssetInfoGeneric* LoadDependency(asset_type_t assetType, const std::string& assetName) = 0; virtual IndirectAssetReference LoadIndirectAssetReference(asset_type_t assetType, const std::string& assetName) = 0; }; diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp index 87659970..fb7e6fb7 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderWeapon.cpp @@ -137,11 +137,8 @@ namespace if (ConvertString(value, field.iOffset)) { if (!value.empty()) - { - auto lowerValue = value; - utils::MakeStringLowerCase(lowerValue); - m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, lowerValue)); - } + m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, value)); + return true; } diff --git a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp index f14bb2c0..acc62b29 100644 --- a/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/IW5/AssetLoaders/AssetLoaderWeapon.cpp @@ -135,11 +135,8 @@ namespace if (ConvertString(value, field.iOffset)) { if (!value.empty()) - { - auto lowerValue = value; - utils::MakeStringLowerCase(lowerValue); - m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, lowerValue)); - } + m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, value)); + return true; } diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp index 9df4a899..5bf8b306 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeapon.cpp @@ -263,11 +263,8 @@ namespace T6 if (ConvertString(value, field.iOffset)) { if (!value.empty()) - { - auto lowerValue = value; - utils::MakeStringLowerCase(lowerValue); - m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, lowerValue)); - } + m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, value)); + return true; } diff --git a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp index 9c5addfd..4081af74 100644 --- a/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp +++ b/src/ObjLoading/Game/T6/AssetLoaders/AssetLoaderWeaponAttachmentUnique.cpp @@ -86,6 +86,7 @@ namespace T6 { if (!value.empty()) m_indirect_asset_references.emplace(m_loading_manager->LoadIndirectAssetReference(ASSET_TYPE_XANIMPARTS, value)); + return true; } diff --git a/test/ObjLoadingTests/Mock/MockAssetLoadingManager.cpp b/test/ObjLoadingTests/Mock/MockAssetLoadingManager.cpp index ea45e05e..2934ea27 100644 --- a/test/ObjLoadingTests/Mock/MockAssetLoadingManager.cpp +++ b/test/ObjLoadingTests/Mock/MockAssetLoadingManager.cpp @@ -20,26 +20,6 @@ XAssetInfoGeneric* MockAssetLoadingManager::AddAsset(std::unique_ptr dependencies, - std::vector usedScriptStrings) -{ - return AddAsset(std::make_unique(assetType, assetName, asset, std::move(dependencies), std::move(usedScriptStrings))); -} - -XAssetInfoGeneric* MockAssetLoadingManager::AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings, - std::vector indirectAssetReferences) -{ - return AddAsset(std::make_unique( - assetType, assetName, asset, std::move(dependencies), std::move(usedScriptStrings), std::move(indirectAssetReferences))); -} - XAssetInfoGeneric* MockAssetLoadingManager::LoadDependency(const asset_type_t assetType, const std::string& assetName) { auto foundDependencies = m_available_dependencies.find(assetName); diff --git a/test/ObjLoadingTests/Mock/MockAssetLoadingManager.h b/test/ObjLoadingTests/Mock/MockAssetLoadingManager.h index 107e61ee..5e112146 100644 --- a/test/ObjLoadingTests/Mock/MockAssetLoadingManager.h +++ b/test/ObjLoadingTests/Mock/MockAssetLoadingManager.h @@ -18,17 +18,6 @@ public: _NODISCARD AssetLoadingContext* GetAssetLoadingContext() const override; XAssetInfoGeneric* AddAsset(std::unique_ptr xAssetInfo) override; - XAssetInfoGeneric* AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings) override; - XAssetInfoGeneric* AddAsset(asset_type_t assetType, - const std::string& assetName, - void* asset, - std::vector dependencies, - std::vector usedScriptStrings, - std::vector indirectAssetReferences) override; XAssetInfoGeneric* LoadDependency(asset_type_t assetType, const std::string& assetName) override; IndirectAssetReference LoadIndirectAssetReference(asset_type_t assetType, const std::string& assetName) override;