From 8eb79da8a232fbf7af009e7aede4e4983c25f092 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Thu, 18 Dec 2025 14:49:43 +0000 Subject: [PATCH] chore: adjust asset data when taking from global asset pools --- .../Asset/GlobalAssetPoolsLoader.cpp | 43 ++++++++++++++++++ src/ObjLoading/Asset/GlobalAssetPoolsLoader.h | 45 +++++++++++-------- src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp | 5 ++- src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp | 5 ++- src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp | 1 + src/ObjLoading/Game/T5/ObjLoaderT5.cpp | 3 +- src/ObjLoading/Game/T6/ObjLoaderT6.cpp | 3 +- src/ZoneCommon.lua | 2 + src/ZoneCommon/Marking/AssetVisitor.h | 2 +- src/ZoneCommon/Marking/BaseAssetMarker.cpp | 3 ++ src/ZoneCommon/Marking/BaseAssetMarker.h | 2 +- .../Loading/AssetInfoCollector.cpp | 2 +- src/ZoneLoading/Loading/AssetInfoCollector.h | 2 +- src/ZoneWriting/Writing/AssetWriter.cpp | 3 ++ 14 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp diff --git a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp new file mode 100644 index 00000000..5cd4ec2f --- /dev/null +++ b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.cpp @@ -0,0 +1,43 @@ +#include "GlobalAssetPoolsLoader.h" + +GlobalAssetPoolsAssetStealer::GlobalAssetPoolsAssetStealer(GenericAssetRegistration& registration, Zone& zone, Zone& foreignZone, AssetCreationContext& context) + : m_registration(registration), + m_zone(zone), + m_foreign_zone(foreignZone), + m_context(context), + m_failure(false) +{ +} + +std::optional GlobalAssetPoolsAssetStealer::Visit_Dependency(const asset_type_t assetType, const char* assetName) +{ + auto assetNameToLoad = assetName; + if (assetNameToLoad && assetNameToLoad[0] == ',') + assetNameToLoad = &assetNameToLoad[1]; + + auto* newDependency = m_context.LoadDependencyGeneric(assetType, assetNameToLoad); + if (!newDependency) + { + m_failure = true; + return std::nullopt; + } + + m_registration.AddDependency(newDependency); + return newDependency; +} + +std::optional GlobalAssetPoolsAssetStealer::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)); +} + +void GlobalAssetPoolsAssetStealer::Visit_IndirectAssetRef(const asset_type_t assetType, const char* assetName) +{ + m_registration.AddIndirectAssetReference(m_context.LoadIndirectAssetReferenceGeneric(assetType, assetName)); +} + +bool GlobalAssetPoolsAssetStealer::Failed() const +{ + return m_failure; +} diff --git a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h index c8fd7c04..6cfe4343 100644 --- a/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h +++ b/src/ObjLoading/Asset/GlobalAssetPoolsLoader.h @@ -1,7 +1,30 @@ #pragma once + #include "Asset/IAssetCreator.h" +#include "Marking/AssetVisitor.h" +#include "Marking/BaseAssetMarker.h" #include "Pool/GlobalAssetPool.h" +class GlobalAssetPoolsAssetStealer : public AssetVisitor +{ +public: + GlobalAssetPoolsAssetStealer(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; + void Visit_IndirectAssetRef(asset_type_t assetType, const char* assetName) override; + + [[nodiscard]] bool Failed() const; + +private: + GenericAssetRegistration& m_registration; + Zone& m_zone; + Zone& m_foreign_zone; + AssetCreationContext& m_context; + + bool m_failure; +}; + template class GlobalAssetPoolsLoader : public AssetCreator { public: @@ -21,28 +44,12 @@ public: AssetRegistration registration(assetName, existingAsset->Asset()); - for (const auto* dependency : existingAsset->m_dependencies) - { - auto* newDependency = context.LoadDependencyGeneric(dependency->m_type, dependency->m_name); - if (newDependency) - registration.AddDependency(newDependency); - else - return AssetCreationResult::Failure(); - } - - for (const auto& indirectAssetReference : existingAsset->m_indirect_asset_references) - registration.AddIndirectAssetReference(context.LoadIndirectAssetReferenceGeneric(indirectAssetReference.m_type, indirectAssetReference.m_name)); - - // Make sure any used script string is available in the created zone - // The replacement of the scr_string_t values will be done upon writing - for (const auto scrString : existingAsset->m_used_script_strings) - m_zone.m_script_strings.AddOrGetScriptString(existingAsset->m_zone->m_script_strings.CValue(scrString)); + GlobalAssetPoolsAssetStealer stealer(registration, m_zone, *existingAsset->m_zone, context); + AssetMarker marker(stealer); + marker.Mark(existingAsset->Asset()); auto* newAsset = context.AddAsset(std::move(registration)); - // Make sure we remember this asset came from another zone - newAsset->m_zone = existingAsset->m_zone; - return AssetCreationResult::Success(newAsset); } diff --git a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp index fb2c1627..4052f23c 100644 --- a/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp +++ b/src/ObjLoading/Game/IW3/ObjLoaderIW3.cpp @@ -1,6 +1,7 @@ #include "ObjLoaderIW3.h" #include "Asset/GlobalAssetPoolsLoader.h" +#include "Game/IW3/AssetMarkerIW3.h" #include "Game/IW3/GameIW3.h" #include "Game/IW3/IW3.h" #include "Game/IW3/XModel/LoaderXModelIW3.h" @@ -65,7 +66,7 @@ namespace collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); - collection.AddAssetCreator(std::make_unique>(zone)); + // collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); @@ -78,7 +79,7 @@ namespace collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); - collection.AddAssetCreator(std::make_unique>(zone)); + // collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); diff --git a/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp b/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp index ad5b83c4..5558b40a 100644 --- a/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp +++ b/src/ObjLoading/Game/IW4/ObjLoaderIW4.cpp @@ -1,6 +1,7 @@ #include "ObjLoaderIW4.h" #include "Asset/GlobalAssetPoolsLoader.h" +#include "Game/IW4/AssetMarkerIW4.h" #include "Game/IW4/GameIW4.h" #include "Game/IW4/IW4.h" #include "Game/IW4/XModel/LoaderXModelIW4.h" @@ -79,7 +80,7 @@ namespace collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); - collection.AddAssetCreator(std::make_unique>(zone)); + // collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); @@ -90,7 +91,7 @@ namespace collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); - collection.AddAssetCreator(std::make_unique>(zone)); + // collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); diff --git a/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp b/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp index cb3d96cd..70079f7b 100644 --- a/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp +++ b/src/ObjLoading/Game/IW5/ObjLoaderIW5.cpp @@ -1,6 +1,7 @@ #include "ObjLoaderIW5.h" #include "Asset/GlobalAssetPoolsLoader.h" +#include "Game/IW5/AssetMarkerIW5.h" #include "Game/IW5/GameIW5.h" #include "Game/IW5/IW5.h" #include "Game/IW5/XModel/LoaderXModelIW5.h" diff --git a/src/ObjLoading/Game/T5/ObjLoaderT5.cpp b/src/ObjLoading/Game/T5/ObjLoaderT5.cpp index cc67cc5a..e8cff138 100644 --- a/src/ObjLoading/Game/T5/ObjLoaderT5.cpp +++ b/src/ObjLoading/Game/T5/ObjLoaderT5.cpp @@ -1,6 +1,7 @@ #include "ObjLoaderT5.h" #include "Asset/GlobalAssetPoolsLoader.h" +#include "Game/T5/AssetMarkerT5.h" #include "Game/T5/GameT5.h" #include "Game/T5/T5.h" #include "Game/T5/XModel/LoaderXModelT5.h" @@ -71,7 +72,7 @@ namespace collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); - collection.AddAssetCreator(std::make_unique>(zone)); + // collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); diff --git a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp index ba53fbeb..a7df0b3f 100644 --- a/src/ObjLoading/Game/T6/ObjLoaderT6.cpp +++ b/src/ObjLoading/Game/T6/ObjLoaderT6.cpp @@ -3,6 +3,7 @@ #include "Asset/GlobalAssetPoolsLoader.h" #include "FontIcon/CsvLoaderFontIconT6.h" #include "FontIcon/JsonLoaderFontIconT6.h" +#include "Game/T6/AssetMarkerT6.h" #include "Game/T6/CommonT6.h" #include "Game/T6/GameAssetPoolT6.h" #include "Game/T6/GameT6.h" @@ -340,7 +341,7 @@ namespace T6 collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); - collection.AddAssetCreator(std::make_unique>(zone)); + // collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); collection.AddAssetCreator(std::make_unique>(zone)); diff --git a/src/ZoneCommon.lua b/src/ZoneCommon.lua index 821006ce..e293d7d0 100644 --- a/src/ZoneCommon.lua +++ b/src/ZoneCommon.lua @@ -10,6 +10,7 @@ function ZoneCommon:include(includes) ObjCommon:include(includes) Parser:include(includes) Cryptography:include(includes) + ZoneCode:include(includes) end end @@ -21,6 +22,7 @@ function ZoneCommon:link(links) links:linkto(Parser) links:linkto(Utils) links:linkto(lzx) + ZoneCode:use() end function ZoneCommon:use() diff --git a/src/ZoneCommon/Marking/AssetVisitor.h b/src/ZoneCommon/Marking/AssetVisitor.h index 5d708783..4a74d962 100644 --- a/src/ZoneCommon/Marking/AssetVisitor.h +++ b/src/ZoneCommon/Marking/AssetVisitor.h @@ -10,7 +10,7 @@ class AssetVisitor public: virtual ~AssetVisitor() = default; - virtual std::optional Visit_Dependency(asset_type_t assetType, const char* assetName) + virtual std::optional Visit_Dependency(asset_type_t assetType, const char* assetName) { // Do nothing by default return std::nullopt; diff --git a/src/ZoneCommon/Marking/BaseAssetMarker.cpp b/src/ZoneCommon/Marking/BaseAssetMarker.cpp index 3d08b82a..0ee03381 100644 --- a/src/ZoneCommon/Marking/BaseAssetMarker.cpp +++ b/src/ZoneCommon/Marking/BaseAssetMarker.cpp @@ -25,6 +25,9 @@ void BaseAssetMarker::MarkArray_ScriptString(scr_string_t* scriptStringArray, co void BaseAssetMarker::Mark_IndirectAssetRef(const asset_type_t assetType, const char* assetName) const { + if (!assetName) + return; + m_visitor.Visit_IndirectAssetRef(assetType, assetName); } diff --git a/src/ZoneCommon/Marking/BaseAssetMarker.h b/src/ZoneCommon/Marking/BaseAssetMarker.h index 6bf94227..2a0cd3f3 100644 --- a/src/ZoneCommon/Marking/BaseAssetMarker.h +++ b/src/ZoneCommon/Marking/BaseAssetMarker.h @@ -17,7 +17,7 @@ protected: const auto result = m_visitor.Visit_Dependency(AssetType::EnumEntry, AssetName(*asset)); if (result.has_value()) - asset = static_cast>(result->m_ptr); + asset = static_cast>((*result)->m_ptr); } void Mark_ScriptString(scr_string_t& scriptString) const; diff --git a/src/ZoneLoading/Loading/AssetInfoCollector.cpp b/src/ZoneLoading/Loading/AssetInfoCollector.cpp index c7bc50df..0f9dbeeb 100644 --- a/src/ZoneLoading/Loading/AssetInfoCollector.cpp +++ b/src/ZoneLoading/Loading/AssetInfoCollector.cpp @@ -49,7 +49,7 @@ std::vector AssetInfoCollector::GetIndirectAssetReferenc return assetReferences; } -std::optional AssetInfoCollector::Visit_Dependency(const asset_type_t assetType, const char* assetName) +std::optional AssetInfoCollector::Visit_Dependency(const asset_type_t assetType, const char* assetName) { auto* assetInfo = m_zone.m_pools->GetAsset(assetType, assetName); if (assetInfo == nullptr) diff --git a/src/ZoneLoading/Loading/AssetInfoCollector.h b/src/ZoneLoading/Loading/AssetInfoCollector.h index bd2234aa..7bb70fc2 100644 --- a/src/ZoneLoading/Loading/AssetInfoCollector.h +++ b/src/ZoneLoading/Loading/AssetInfoCollector.h @@ -18,7 +18,7 @@ public: [[nodiscard]] std::vector GetUsedScriptStrings() const; [[nodiscard]] std::vector GetIndirectAssetReferences() const; - std::optional Visit_Dependency(asset_type_t assetType, const char* assetName) override; + std::optional Visit_Dependency(asset_type_t assetType, const char* assetName) override; std::optional Visit_ScriptString(scr_string_t scriptString) override; void Visit_IndirectAssetRef(asset_type_t assetType, const char* assetName) override; diff --git a/src/ZoneWriting/Writing/AssetWriter.cpp b/src/ZoneWriting/Writing/AssetWriter.cpp index 79426cfc..70b93e02 100644 --- a/src/ZoneWriting/Writing/AssetWriter.cpp +++ b/src/ZoneWriting/Writing/AssetWriter.cpp @@ -17,6 +17,9 @@ 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); + const auto strValue = m_asset->m_zone->m_script_strings.CValue(scrString); return m_zone.m_script_strings.GetScriptString(strValue); }