diff --git a/binaries/data/mods/_test.sim/simulation/data/territorymanager.rng b/binaries/data/mods/_test.sim/simulation/data/territorymanager.rng
index 6dcfd82beb..a1ce6e7b70 100644
--- a/binaries/data/mods/_test.sim/simulation/data/territorymanager.rng
+++ b/binaries/data/mods/_test.sim/simulation/data/territorymanager.rng
@@ -19,5 +19,12 @@
+
+
+ off
+ hidden
+ visible
+
+
diff --git a/binaries/data/mods/_test.sim/simulation/data/territorymanager.xml b/binaries/data/mods/_test.sim/simulation/data/territorymanager.xml
index 0ec15c6335..4b41c1cb93 100644
--- a/binaries/data/mods/_test.sim/simulation/data/territorymanager.xml
+++ b/binaries/data/mods/_test.sim/simulation/data/territorymanager.xml
@@ -3,4 +3,5 @@
4
0.75
0.85
+ visible
diff --git a/binaries/data/mods/mod/simulation/data/territorymanager.rng b/binaries/data/mods/mod/simulation/data/territorymanager.rng
index 87e0fdac41..23117a65d0 100644
--- a/binaries/data/mods/mod/simulation/data/territorymanager.rng
+++ b/binaries/data/mods/mod/simulation/data/territorymanager.rng
@@ -13,5 +13,12 @@
+
+
+ off
+ hidden
+ visible
+
+
diff --git a/binaries/data/mods/mod/simulation/data/territorymanager.xml b/binaries/data/mods/mod/simulation/data/territorymanager.xml
index 0ec15c6335..4b41c1cb93 100644
--- a/binaries/data/mods/mod/simulation/data/territorymanager.xml
+++ b/binaries/data/mods/mod/simulation/data/territorymanager.xml
@@ -3,4 +3,5 @@
4
0.75
0.85
+ visible
diff --git a/source/graphics/TerritoryTexture.cpp b/source/graphics/TerritoryTexture.cpp
index 3699efd039..98cb3a0e29 100644
--- a/source/graphics/TerritoryTexture.cpp
+++ b/source/graphics/TerritoryTexture.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2022 Wildfire Games.
+/* Copyright (C) 2024 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -147,7 +147,7 @@ void CTerritoryTexture::RecomputeTexture(Renderer::Backend::IDeviceCommandContex
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);
diff --git a/source/simulation2/components/CCmpTerritoryManager.cpp b/source/simulation2/components/CCmpTerritoryManager.cpp
index 25927702ff..b6e2463899 100644
--- a/source/simulation2/components/CCmpTerritoryManager.cpp
+++ b/source/simulation2/components/CCmpTerritoryManager.cpp
@@ -128,7 +128,6 @@ public:
m_EnableLineDebugOverlays = false;
m_DirtyID = 1;
m_DirtyBlinkingID = 1;
- m_Visible = true;
m_ColorChanged = false;
m_AnimTime = 0.0;
@@ -144,6 +143,11 @@ public:
int impassableCost = externalParamNode.GetChild("TerritoryManager").GetChild("ImpassableCost").ToInt();
ENSURE(0 <= impassableCost && impassableCost <= 255);
m_ImpassableCost = (u8)impassableCost;
+
+ const std::string& visibilityStatus = externalParamNode.GetChild("TerritoryManager").GetChild("VisibilityStatus").ToString();
+ m_Enabled = visibilityStatus != "off";
+ m_Visible = m_Enabled && visibilityStatus == "visible";
+
m_BorderThickness = externalParamNode.GetChild("TerritoryManager").GetChild("BorderThickness").ToFixed().ToFloat();
m_BorderSeparation = externalParamNode.GetChild("TerritoryManager").GetChild("BorderSeparation").ToFixed().ToFloat();
}
@@ -305,14 +309,22 @@ public:
void SetVisibility(bool visible) override
{
+ if (!m_Enabled)
+ return;
+
m_Visible = visible;
}
+ bool IsVisible() const override
+ {
+ return m_Enabled && m_Visible;
+ }
+
void UpdateColors() override;
private:
-
bool m_Visible;
+ bool m_Enabled;
};
REGISTER_COMPONENT_TYPE(TerritoryManager)
@@ -716,7 +728,7 @@ void CCmpTerritoryManager::Interpolate(float frameTime, float UNUSED(frameOffset
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)
diff --git a/source/simulation2/components/ICmpTerritoryManager.cpp b/source/simulation2/components/ICmpTerritoryManager.cpp
index 6a9d096eb0..b82a4b63d1 100644
--- a/source/simulation2/components/ICmpTerritoryManager.cpp
+++ b/source/simulation2/components/ICmpTerritoryManager.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2021 Wildfire Games.
+/* Copyright (C) 2024 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -29,4 +29,5 @@ DEFINE_INTERFACE_METHOD("SetTerritoryBlinking", ICmpTerritoryManager, SetTerrito
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)
diff --git a/source/simulation2/components/ICmpTerritoryManager.h b/source/simulation2/components/ICmpTerritoryManager.h
index 8d622bb955..deabfb1a39 100644
--- a/source/simulation2/components/ICmpTerritoryManager.h
+++ b/source/simulation2/components/ICmpTerritoryManager.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2020 Wildfire Games.
+/* Copyright (C) 2024 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -105,6 +105,11 @@ public:
*/
virtual void UpdateColors() = 0;
+ /**
+ * Whether the territory lines are visible.
+ */
+ virtual bool IsVisible() const = 0;
+
DECLARE_INTERFACE_TYPE(TerritoryManager)
};