From ba39e3f4d9cae3e531ecc0dd4de68eb855b99981 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Thu, 25 Dec 2025 15:29:32 +0100 Subject: [PATCH] fix: do not override properties of foreign zones --- .../Asset/GlobalAssetPoolsLoader.cpp | 21 ++++++++++++------- src/ObjLoading/Asset/GlobalAssetPoolsLoader.h | 10 +++++---- .../Templates/ZoneWriteTemplate.cpp | 3 ++- src/ZoneWriting/Writing/AssetWriter.cpp | 12 ++++++++--- src/ZoneWriting/Writing/AssetWriter.h | 3 ++- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp index d812fb5e..ec124440 100644 --- a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp +++ b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp @@ -1,6 +1,9 @@ #include "GlobalAssetPoolsLoader.h" -GlobalAssetPoolsAssetStealer::GlobalAssetPoolsAssetStealer(GenericAssetRegistration& registration, Zone& zone, Zone& foreignZone, AssetCreationContext& context) +GlobalAssetPoolsRegistrationPreparation::GlobalAssetPoolsRegistrationPreparation(GenericAssetRegistration& registration, + Zone& zone, + Zone& foreignZone, + AssetCreationContext& context) : m_registration(registration), m_zone(zone), m_foreign_zone(foreignZone), @@ -9,7 +12,7 @@ GlobalAssetPoolsAssetStealer::GlobalAssetPoolsAssetStealer(GenericAssetRegistrat { } -std::optional GlobalAssetPoolsAssetStealer::Visit_Dependency(const asset_type_t assetType, const char* assetName) +std::optional GlobalAssetPoolsRegistrationPreparation::Visit_Dependency(const asset_type_t assetType, const char* assetName) { if (assetName && assetName[0] == ',') { @@ -24,7 +27,7 @@ std::optional GlobalAssetPoolsAssetStealer::Visit_Dependency if (assetDependency) { m_registration.AddDependency(assetDependency); - return assetDependency; + return std::nullopt; } } @@ -32,25 +35,27 @@ std::optional GlobalAssetPoolsAssetStealer::Visit_Dependency if (newDependency) { m_registration.AddDependency(newDependency); - return newDependency; + return std::nullopt; } m_failure = true; return std::nullopt; } -std::optional GlobalAssetPoolsAssetStealer::Visit_ScriptString(scr_string_t scriptString) +std::optional GlobalAssetPoolsRegistrationPreparation::Visit_ScriptString(scr_string_t scriptString) { // Make sure any used script string is available in the created zone - return m_zone.m_script_strings.AddOrGetScriptString(m_foreign_zone.m_script_strings.CValue(scriptString)); + m_zone.m_script_strings.AddOrGetScriptString(m_foreign_zone.m_script_strings.CValue(scriptString)); + m_registration.AddScriptString(scriptString); + return std::nullopt; } -void GlobalAssetPoolsAssetStealer::Visit_IndirectAssetRef(const asset_type_t assetType, const char* assetName) +void GlobalAssetPoolsRegistrationPreparation::Visit_IndirectAssetRef(const asset_type_t assetType, const char* assetName) { m_registration.AddIndirectAssetReference(m_context.LoadIndirectAssetReferenceGeneric(assetType, assetName)); } -bool GlobalAssetPoolsAssetStealer::Failed() const +bool GlobalAssetPoolsRegistrationPreparation::Failed() const { return m_failure; } diff --git a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h index 6cfe4343..e47a32e4 100644 --- a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h +++ b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h @@ -5,10 +5,10 @@ #include "Marking/BaseAssetMarker.h" #include "Pool/GlobalAssetPool.h" -class GlobalAssetPoolsAssetStealer : public AssetVisitor +class GlobalAssetPoolsRegistrationPreparation : public AssetVisitor { public: - GlobalAssetPoolsAssetStealer(GenericAssetRegistration& registration, Zone& zone, Zone& foreignZone, AssetCreationContext& context); + GlobalAssetPoolsRegistrationPreparation(GenericAssetRegistration& registration, Zone& zone, Zone& foreignZone, AssetCreationContext& context); std::optional Visit_Dependency(asset_type_t assetType, const char* assetName) override; std::optional Visit_ScriptString(scr_string_t scriptString) override; @@ -44,11 +44,13 @@ public: AssetRegistration registration(assetName, existingAsset->Asset()); - GlobalAssetPoolsAssetStealer stealer(registration, m_zone, *existingAsset->m_zone, context); - AssetMarker marker(stealer); + GlobalAssetPoolsRegistrationPreparation registrationPreparation(registration, m_zone, *existingAsset->m_zone, context); + AssetMarker marker(registrationPreparation); marker.Mark(existingAsset->Asset()); auto* newAsset = context.AddAsset(std::move(registration)); + // Make sure we remember this asset came from a different zone + newAsset->m_zone = existingAsset->m_zone; return AssetCreationResult::Success(newAsset); } diff --git a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp index 3d1aba7b..64848e49 100644 --- a/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp +++ b/src/ZoneCodeGeneratorLib/Generating/Templates/ZoneWriteTemplate.cpp @@ -261,7 +261,8 @@ namespace "{0}::{0}({1}* asset, const Zone& zone, IZoneOutputStream& stream)", WriterClassName(m_env.m_asset), m_env.m_asset->m_definition->GetFullName()) m_intendation++; - LINEF(": AssetWriter(zone.m_pools->GetAssetOrAssetReference({0}::EnumEntry, AssetName<{0}>(*asset)), zone, stream)", m_env.m_asset->m_asset_name) + LINEF(": AssetWriter(zone.m_pools->GetAssetOrAssetReference({0}::EnumEntry, NonReferenceAssetName(AssetName<{0}>(*asset))), zone, stream)", + m_env.m_asset->m_asset_name) m_intendation--; LINE("{") diff --git a/src/ZoneWriting/Writing/AssetWriter.cpp b/src/ZoneWriting/Writing/AssetWriter.cpp index 70b93e02..4dc9752c 100644 --- a/src/ZoneWriting/Writing/AssetWriter.cpp +++ b/src/ZoneWriting/Writing/AssetWriter.cpp @@ -10,6 +10,14 @@ AssetWriter::AssetWriter(XAssetInfoGeneric* asset, const Zone& zone, IZoneOutput { } +const char* AssetWriter::NonReferenceAssetName(const char* assetName) +{ + if (assetName && assetName[0] == ',') + return &assetName[1]; + + return assetName; +} + scr_string_t AssetWriter::UseScriptString(const scr_string_t scrString) const { assert(scrString < m_asset->m_zone->m_script_strings.Count()); @@ -17,9 +25,7 @@ scr_string_t AssetWriter::UseScriptString(const scr_string_t scrString) const if (m_asset->m_zone == &m_zone) return scrString; - // This swap should have already been performed in GlobalAssetPoolsLoader - assert(false); - + // The asset comes from a different zone, we need to translate it const auto strValue = m_asset->m_zone->m_script_strings.CValue(scrString); return m_zone.m_script_strings.GetScriptString(strValue); } diff --git a/src/ZoneWriting/Writing/AssetWriter.h b/src/ZoneWriting/Writing/AssetWriter.h index 7dec6784..188828c1 100644 --- a/src/ZoneWriting/Writing/AssetWriter.h +++ b/src/ZoneWriting/Writing/AssetWriter.h @@ -11,7 +11,8 @@ class AssetWriter : public ContentWriterBase protected: AssetWriter(XAssetInfoGeneric* asset, const Zone& zone, IZoneOutputStream& stream); - _NODISCARD scr_string_t UseScriptString(scr_string_t scrString) const; + [[nodiscard]] static const char* NonReferenceAssetName(const char* assetName); + [[nodiscard]] scr_string_t UseScriptString(scr_string_t scrString) const; void WriteScriptStringArray(bool atStreamStart, size_t count); XAssetInfoGeneric* m_asset;