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; };