From fc18f813025c0301ef7bb4c74ffa8c11df1f481f Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 30 Mar 2024 17:44:55 +0100 Subject: [PATCH] fix: consider asset references when looking for assets of zone --- src/ObjLoading/AssetLoading/AssetLoadingManager.cpp | 6 +++--- .../Generating/Templates/ZoneWriteTemplate.cpp | 4 ++-- src/ZoneCommon/Pool/ZoneAssetPools.cpp | 13 +++++++++++++ src/ZoneCommon/Pool/ZoneAssetPools.h | 2 ++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp index 83a350ed..c05a7c5f 100644 --- a/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp +++ b/src/ObjLoading/AssetLoading/AssetLoadingManager.cpp @@ -59,7 +59,7 @@ XAssetInfoGeneric* AssetLoadingManager::AddAsset(std::unique_ptrm_pools->GetAsset(assetType, assetName); + auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, assetName); if (alreadyLoadedAsset) return alreadyLoadedAsset; @@ -147,7 +147,7 @@ XAssetInfoGeneric* AssetLoadingManager::LoadAssetDependency(const asset_type_t a XAssetInfoGeneric* AssetLoadingManager::LoadDependency(const asset_type_t assetType, const std::string& assetName) { - auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAsset(assetType, assetName); + auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, assetName); if (alreadyLoadedAsset) return alreadyLoadedAsset; @@ -171,7 +171,7 @@ XAssetInfoGeneric* AssetLoadingManager::LoadDependency(const asset_type_t assetT IndirectAssetReference AssetLoadingManager::LoadIndirectAssetReference(const asset_type_t assetType, const std::string& assetName) { - const auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAsset(assetType, assetName); + const auto* alreadyLoadedAsset = m_context.m_zone->m_pools->GetAssetOrAssetReference(assetType, assetName); if (alreadyLoadedAsset) return IndirectAssetReference(assetType, assetName); diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index 36d503f6..92d44eab 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -115,8 +115,8 @@ class ZoneWriteTemplate::Internal final : BaseTemplate << "* asset, Zone* zone, IZoneOutputStream* stream)") m_intendation++; - LINE_START(": AssetWriter(zone->m_pools->GetAsset(" << m_env.m_asset->m_asset_enum_entry->m_name << ", GetAssetName(asset))" - << ", zone, stream)") + LINE_START(": AssetWriter(zone->m_pools->GetAssetOrAssetReference(" << m_env.m_asset->m_asset_enum_entry->m_name << ", GetAssetName(asset))" + << ", zone, stream)") LINE_END("") m_intendation--; diff --git a/src/ZoneCommon/Pool/ZoneAssetPools.cpp b/src/ZoneCommon/Pool/ZoneAssetPools.cpp index ef13b01e..9dc79b9a 100644 --- a/src/ZoneCommon/Pool/ZoneAssetPools.cpp +++ b/src/ZoneCommon/Pool/ZoneAssetPools.cpp @@ -1,5 +1,7 @@ #include "ZoneAssetPools.h" +#include + ZoneAssetPools::ZoneAssetPools(Zone* zone) : m_zone(zone) { @@ -25,6 +27,17 @@ XAssetInfoGeneric* ZoneAssetPools::AddAsset(std::unique_ptr x return assetInfo; } +XAssetInfoGeneric* ZoneAssetPools::GetAssetOrAssetReference(const asset_type_t type, const std::string& name) const +{ + auto* result = GetAsset(type, name); + + if (result != nullptr || (!name.empty() && name[0] == ',')) + return result; + + result = GetAsset(type, std::format(",{}", name)); + return result; +} + size_t ZoneAssetPools::GetTotalAssetCount() const { return m_assets_in_order.size(); diff --git a/src/ZoneCommon/Pool/ZoneAssetPools.h b/src/ZoneCommon/Pool/ZoneAssetPools.h index 5b2acaf7..d3bf72d8 100644 --- a/src/ZoneCommon/Pool/ZoneAssetPools.h +++ b/src/ZoneCommon/Pool/ZoneAssetPools.h @@ -39,6 +39,8 @@ public: std::vector usedScriptStrings, std::vector indirectAssetReferences); _NODISCARD virtual XAssetInfoGeneric* GetAsset(asset_type_t type, const std::string& name) const = 0; + _NODISCARD virtual XAssetInfoGeneric* GetAssetOrAssetReference(asset_type_t type, const std::string& name) const; + _NODISCARD virtual asset_type_t GetAssetTypeCount() const = 0; _NODISCARD virtual const char* GetAssetTypeName(asset_type_t assetType) const = 0;