Index: binaries/data/mods/public/simulation/data/territorymanager.rng =================================================================== --- binaries/data/mods/public/simulation/data/territorymanager.rng +++ binaries/data/mods/public/simulation/data/territorymanager.rng @@ -13,5 +13,8 @@ + + + Index: binaries/data/mods/public/simulation/data/territorymanager.xml =================================================================== --- binaries/data/mods/public/simulation/data/territorymanager.xml +++ binaries/data/mods/public/simulation/data/territorymanager.xml @@ -3,4 +3,5 @@ 4 0.75 0.85 + 2 Index: source/graphics/TerritoryTexture.cpp =================================================================== --- source/graphics/TerritoryTexture.cpp +++ source/graphics/TerritoryTexture.cpp @@ -145,7 +145,7 @@ PROFILE("recompute territory texture"); CmpPtr cmpTerritoryManager(m_Simulation, SYSTEM_ENTITY); - if (!cmpTerritoryManager) + if (!cmpTerritoryManager || !cmpTerritoryManager->IsVisible()) return; std::unique_ptr bitmap = std::make_unique(m_MapSize * m_MapSize * 4); Index: source/simulation2/components/CCmpTerritoryManager.cpp =================================================================== --- source/simulation2/components/CCmpTerritoryManager.cpp +++ source/simulation2/components/CCmpTerritoryManager.cpp @@ -128,7 +128,7 @@ m_EnableLineDebugOverlays = false; m_DirtyID = 1; m_DirtyBlinkingID = 1; - m_Visible = true; + m_ColorChanged = false; m_AnimTime = 0.0; @@ -140,6 +140,7 @@ CParamNode externalParamNode; CParamNode::LoadXML(externalParamNode, L"simulation/data/territorymanager.xml", "territorymanager"); + m_VisibilityStatus = static_cast(externalParamNode.GetChild("TerritoryManager").GetChild("VisibilityStatus").ToInt()); int impassableCost = externalParamNode.GetChild("TerritoryManager").GetChild("ImpassableCost").ToInt(); ENSURE(0 <= impassableCost && impassableCost <= 255); @@ -305,14 +306,22 @@ void SetVisibility(bool visible) override { - m_Visible = visible; + if (visible && m_VisibilityStatus == EVisibilityStatus::OFF) + return; + + m_VisibilityStatus = visible ? EVisibilityStatus::VISIBLE : EVisibilityStatus::HIDDEN; + } + + bool IsVisible() const override + { + return m_VisibilityStatus == EVisibilityStatus::VISIBLE; } void UpdateColors() override; private: - bool m_Visible; + EVisibilityStatus m_VisibilityStatus; }; REGISTER_COMPONENT_TYPE(TerritoryManager) @@ -696,7 +705,7 @@ void CCmpTerritoryManager::RenderSubmit(SceneCollector& collector, const CFrustum& frustum, bool culling) { - if (!m_Visible) + if (!IsVisible()) return; for (size_t i = 0; i < m_BoundaryLines.size(); ++i) Index: source/simulation2/components/ICmpTerritoryManager.h =================================================================== --- source/simulation2/components/ICmpTerritoryManager.h +++ source/simulation2/components/ICmpTerritoryManager.h @@ -31,6 +31,13 @@ class ICmpTerritoryManager : public IComponent { public: + enum class EVisibilityStatus + { + OFF = 0, + HIDDEN = 1, + VISIBLE = 2 + }; + /** * Returns whether the territory texture needs to be updated. */ @@ -105,6 +112,11 @@ */ virtual void UpdateColors() = 0; + /** + * Whether the territory lines are visible. + */ + virtual bool IsVisible() const = 0; + DECLARE_INTERFACE_TYPE(TerritoryManager) }; Index: source/simulation2/components/ICmpTerritoryManager.cpp =================================================================== --- source/simulation2/components/ICmpTerritoryManager.cpp +++ source/simulation2/components/ICmpTerritoryManager.cpp @@ -29,4 +29,5 @@ DEFINE_INTERFACE_METHOD("IsTerritoryBlinking", ICmpTerritoryManager, IsTerritoryBlinking) DEFINE_INTERFACE_METHOD("GetTerritoryPercentage", ICmpTerritoryManager, GetTerritoryPercentage) DEFINE_INTERFACE_METHOD("UpdateColors", ICmpTerritoryManager, UpdateColors) +DEFINE_INTERFACE_METHOD("IsVisible", ICmpTerritoryManager, IsVisible) END_INTERFACE_WRAPPER(TerritoryManager)