From 9ecc3d06e84f31742cc1772436c36f0246324d79 Mon Sep 17 00:00:00 2001 From: Michael Oliver Date: Fri, 15 May 2026 11:48:33 +0100 Subject: [PATCH 1/2] fix(unlinker): respect minimal zone definition output --- src/Unlinking/Unlinker.cpp | 2 +- .../IW3/Zone/Definition/ZoneDefWriterIW3.cpp | 5 ++- .../IW3/Zone/Definition/ZoneDefWriterIW3.h | 2 +- .../IW4/Zone/Definition/ZoneDefWriterIW4.cpp | 5 ++- .../IW4/Zone/Definition/ZoneDefWriterIW4.h | 2 +- .../IW5/Zone/Definition/ZoneDefWriterIW5.cpp | 5 ++- .../IW5/Zone/Definition/ZoneDefWriterIW5.h | 2 +- .../T5/Zone/Definition/ZoneDefWriterT5.cpp | 5 ++- .../Game/T5/Zone/Definition/ZoneDefWriterT5.h | 2 +- .../T6/Zone/Definition/ZoneDefWriterT6.cpp | 5 ++- .../Game/T6/Zone/Definition/ZoneDefWriterT6.h | 2 +- .../Zone/Definition/ZoneDefWriter.cpp | 31 +++++++++++++++++-- .../Zone/Definition/ZoneDefWriter.h | 15 +++++++-- 13 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/Unlinking/Unlinker.cpp b/src/Unlinking/Unlinker.cpp index 79cc38ca..77781fcf 100644 --- a/src/Unlinking/Unlinker.cpp +++ b/src/Unlinking/Unlinker.cpp @@ -67,7 +67,7 @@ namespace } const auto* zoneDefWriter = IZoneDefWriter::GetZoneDefWriterForGame(zone.m_game_id); - zoneDefWriter->WriteZoneDef(zoneDefinitionFile, zone, m_args.m_use_gdt); + zoneDefWriter->WriteZoneDef(zoneDefinitionFile, zone, m_args.m_use_gdt, m_args.m_minimal_zone_def); zoneDefinitionFile.close(); diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp index be9c658e..f82de509 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp @@ -6,7 +6,7 @@ using namespace IW3; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h index 8bfe8f61..7cc56c55 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h @@ -8,6 +8,6 @@ namespace IW3 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace IW3 diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp index 805aa822..9d07f3f8 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp @@ -6,7 +6,7 @@ using namespace IW4; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h index e2f3bedc..4bfb0a6e 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h @@ -8,6 +8,6 @@ namespace IW4 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace IW4 diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp index 6c77ee31..51cc37d3 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp @@ -6,7 +6,7 @@ using namespace IW5; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h index 29f75f75..550b1dcc 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h @@ -8,6 +8,6 @@ namespace IW5 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace IW5 diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp index a079938d..2647a45b 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp @@ -6,7 +6,7 @@ using namespace T5; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h index 7dfb85b4..b7510e13 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h @@ -8,6 +8,6 @@ namespace T5 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace T5 diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp index dd0dabd0..aa3133bf 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp @@ -62,7 +62,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone } } -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -73,6 +73,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h index 842a7dd9..39709e55 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h @@ -8,6 +8,6 @@ namespace T6 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace T6 diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp index 2c032afe..35aa7f32 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp @@ -5,6 +5,7 @@ #include "Game/IW5/Zone/Definition/ZoneDefWriterIW5.h" #include "Game/T5/Zone/Definition/ZoneDefWriterT5.h" #include "Game/T6/Zone/Definition/ZoneDefWriterT6.h" +#include "Pool/XAssetInfo.h" #include @@ -25,7 +26,31 @@ const IZoneDefWriter* IZoneDefWriter::GetZoneDefWriterForGame(GameId game) return result; } -void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, const bool useGdt) const +AbstractZoneDefWriter::DependencyAssetLookup AbstractZoneDefWriter::CreateDependencyAssetLookup(const Zone& zone, const bool minimalZone) +{ + DependencyAssetLookup dependencyAssets; + + if (!minimalZone) + return dependencyAssets; + + for (const auto& asset : zone.m_pools) + { + for (const auto* dependency : asset->m_dependencies) + { + if (dependency != nullptr && dependency->m_zone == &zone) + dependencyAssets.emplace(dependency); + } + } + + return dependencyAssets; +} + +bool AbstractZoneDefWriter::ShouldWriteAsset(const XAssetInfoGeneric& asset, const DependencyAssetLookup& dependencyAssets) +{ + return dependencyAssets.empty() || !dependencyAssets.contains(&asset); +} + +void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, const bool useGdt, const bool minimalZone) const { ZoneDefinitionOutputStream out(stream); const auto* game = IGame::GetGameById(zone.m_game_id); @@ -42,5 +67,7 @@ void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, } WriteMetaData(out, zone); - WriteContent(out, zone); + + const auto dependencyAssets = CreateDependencyAssetLookup(zone, minimalZone); + WriteContent(out, zone, dependencyAssets); } diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h index 1458c1c7..6ec590bc 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h @@ -3,6 +3,10 @@ #include "Zone/Definition/ZoneDefinitionStream.h" #include "Zone/Zone.h" +#include + +class XAssetInfoGeneric; + class IZoneDefWriter { public: @@ -13,7 +17,7 @@ public: IZoneDefWriter& operator=(const IZoneDefWriter& other) = default; IZoneDefWriter& operator=(IZoneDefWriter&& other) noexcept = default; - virtual void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt) const = 0; + virtual void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt, bool minimalZone) const = 0; static const IZoneDefWriter* GetZoneDefWriterForGame(GameId game); }; @@ -24,9 +28,14 @@ protected: static constexpr auto META_DATA_KEY_GAME = "game"; static constexpr auto META_DATA_KEY_GDT = "gdt"; + using DependencyAssetLookup = std::unordered_set; + + static DependencyAssetLookup CreateDependencyAssetLookup(const Zone& zone, bool minimalZone); + static bool ShouldWriteAsset(const XAssetInfoGeneric& asset, const DependencyAssetLookup& dependencyAssets); + virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; - virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; + virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const = 0; public: - void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt) const override; + void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt, bool minimalZone) const override; }; From e824e9a9de5e87c00429acf50d3d3d5744a76a89 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Fri, 15 May 2026 15:35:23 +0100 Subject: [PATCH 2/2] chore: make DependencyAssetLookup a separate class --- .../IW3/Zone/Definition/ZoneDefWriterIW3.cpp | 4 +- .../IW3/Zone/Definition/ZoneDefWriterIW3.h | 2 +- .../IW4/Zone/Definition/ZoneDefWriterIW4.cpp | 4 +- .../IW4/Zone/Definition/ZoneDefWriterIW4.h | 2 +- .../IW5/Zone/Definition/ZoneDefWriterIW5.cpp | 4 +- .../IW5/Zone/Definition/ZoneDefWriterIW5.h | 2 +- .../T5/Zone/Definition/ZoneDefWriterT5.cpp | 4 +- .../Game/T5/Zone/Definition/ZoneDefWriterT5.h | 2 +- .../T6/Zone/Definition/ZoneDefWriterT6.cpp | 4 +- .../Game/T6/Zone/Definition/ZoneDefWriterT6.h | 2 +- .../Zone/Definition/ZoneDefWriter.cpp | 60 +++++++++++-------- .../Zone/Definition/ZoneDefWriter.h | 31 ++++++---- 12 files changed, 67 insertions(+), 54 deletions(-) diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp index f82de509..fc9bd9b0 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp @@ -6,7 +6,7 @@ using namespace IW3; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,7 +17,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { - if (!ShouldWriteAsset(*asset, dependencyAssets)) + if (!filter.ShouldWriteAsset(*asset)) continue; switch (asset->m_type) diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h index 7cc56c55..1ce0cce0 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h @@ -8,6 +8,6 @@ namespace IW3 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const override; }; } // namespace IW3 diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp index 9d07f3f8..f9d9d431 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp @@ -6,7 +6,7 @@ using namespace IW4; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,7 +17,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { - if (!ShouldWriteAsset(*asset, dependencyAssets)) + if (!filter.ShouldWriteAsset(*asset)) continue; switch (asset->m_type) diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h index 4bfb0a6e..43534de3 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h @@ -8,6 +8,6 @@ namespace IW4 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const override; }; } // namespace IW4 diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp index 51cc37d3..065c355f 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp @@ -6,7 +6,7 @@ using namespace IW5; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,7 +17,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { - if (!ShouldWriteAsset(*asset, dependencyAssets)) + if (!filter.ShouldWriteAsset(*asset)) continue; switch (asset->m_type) diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h index 550b1dcc..1c5360b6 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h @@ -8,6 +8,6 @@ namespace IW5 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const override; }; } // namespace IW5 diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp index 2647a45b..0cf08df2 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp @@ -6,7 +6,7 @@ using namespace T5; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,7 +17,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { - if (!ShouldWriteAsset(*asset, dependencyAssets)) + if (!filter.ShouldWriteAsset(*asset)) continue; switch (asset->m_type) diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h index b7510e13..77aa94a6 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h @@ -8,6 +8,6 @@ namespace T5 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const override; }; } // namespace T5 diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp index aa3133bf..4971e847 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp @@ -62,7 +62,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone } } -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -73,7 +73,7 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { - if (!ShouldWriteAsset(*asset, dependencyAssets)) + if (!filter.ShouldWriteAsset(*asset)) continue; switch (asset->m_type) diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h index 39709e55..b5483751 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h @@ -8,6 +8,6 @@ namespace T6 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const override; }; } // namespace T6 diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp index 35aa7f32..bb1a59b8 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp @@ -9,6 +9,38 @@ #include +namespace +{ + constexpr auto META_DATA_KEY_GAME = "game"; + constexpr auto META_DATA_KEY_GDT = "gdt"; +} // namespace + +ZoneDefFilter ZoneDefFilter::AllEntries() +{ + return ZoneDefFilter(); +} + +ZoneDefFilter ZoneDefFilter::WithOnlyRootAssets(const Zone& zone) +{ + ZoneDefFilter result; + + for (const auto& asset : zone.m_pools) + { + for (const auto* dependency : asset->m_dependencies) + { + if (dependency != nullptr && dependency->m_zone == &zone) + result.m_non_root_asset_lookup.emplace(dependency); + } + } + + return std::move(result); +} + +bool ZoneDefFilter::ShouldWriteAsset(const XAssetInfoGeneric& asset) const +{ + return m_non_root_asset_lookup.empty() || !m_non_root_asset_lookup.contains(&asset); +} + const IZoneDefWriter* IZoneDefWriter::GetZoneDefWriterForGame(GameId game) { static const IZoneDefWriter* zoneDefWriters[static_cast(GameId::COUNT)]{ @@ -26,30 +58,6 @@ const IZoneDefWriter* IZoneDefWriter::GetZoneDefWriterForGame(GameId game) return result; } -AbstractZoneDefWriter::DependencyAssetLookup AbstractZoneDefWriter::CreateDependencyAssetLookup(const Zone& zone, const bool minimalZone) -{ - DependencyAssetLookup dependencyAssets; - - if (!minimalZone) - return dependencyAssets; - - for (const auto& asset : zone.m_pools) - { - for (const auto* dependency : asset->m_dependencies) - { - if (dependency != nullptr && dependency->m_zone == &zone) - dependencyAssets.emplace(dependency); - } - } - - return dependencyAssets; -} - -bool AbstractZoneDefWriter::ShouldWriteAsset(const XAssetInfoGeneric& asset, const DependencyAssetLookup& dependencyAssets) -{ - return dependencyAssets.empty() || !dependencyAssets.contains(&asset); -} - void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, const bool useGdt, const bool minimalZone) const { ZoneDefinitionOutputStream out(stream); @@ -68,6 +76,6 @@ void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, WriteMetaData(out, zone); - const auto dependencyAssets = CreateDependencyAssetLookup(zone, minimalZone); - WriteContent(out, zone, dependencyAssets); + const auto filter = minimalZone ? ZoneDefFilter::WithOnlyRootAssets(zone) : ZoneDefFilter::AllEntries(); + WriteContent(out, zone, filter); } diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h index 6ec590bc..723da73e 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h @@ -1,11 +1,24 @@ #pragma once +#include "Pool/XAssetInfo.h" #include "Zone/Definition/ZoneDefinitionStream.h" #include "Zone/Zone.h" #include -class XAssetInfoGeneric; +class ZoneDefFilter +{ +public: + static ZoneDefFilter AllEntries(); + static ZoneDefFilter WithOnlyRootAssets(const Zone& zone); + + [[nodiscard]] bool ShouldWriteAsset(const XAssetInfoGeneric& asset) const; + +private: + ZoneDefFilter() = default; + + std::unordered_set m_non_root_asset_lookup; +}; class IZoneDefWriter { @@ -24,18 +37,10 @@ public: class AbstractZoneDefWriter : public IZoneDefWriter { -protected: - static constexpr auto META_DATA_KEY_GAME = "game"; - static constexpr auto META_DATA_KEY_GDT = "gdt"; - - using DependencyAssetLookup = std::unordered_set; - - static DependencyAssetLookup CreateDependencyAssetLookup(const Zone& zone, bool minimalZone); - static bool ShouldWriteAsset(const XAssetInfoGeneric& asset, const DependencyAssetLookup& dependencyAssets); - - virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; - virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const = 0; - public: void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt, bool minimalZone) const override; + +protected: + virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; + virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const = 0; };