From 6bd6635a8349533a34f940f320721c4a46a61c8c Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 22 Apr 2024 19:23:54 +0200 Subject: [PATCH] feat: normalize asset names before loading --- .../AssetLoading/AssetLoadingManager.cpp | 52 +++++++++++++------ .../AssetLoading/AssetLoadingManager.h | 2 + 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp index c6c6208f..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,7 +30,7 @@ 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; } @@ -62,7 +66,7 @@ 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; } @@ -122,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 3a5e4808..edbd2301 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.h +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.h @@ -25,6 +25,8 @@ private: 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;