From fd780348853804e7b048d378985be6eb9465f621 Mon Sep 17 00:00:00 2001 From: Stan Date: Sun, 3 Nov 2024 00:05:26 +0100 Subject: [PATCH] Mod Interface: Enable setting territory visibility based on a patch by: aeonios `off` means that the territory visibility cannot be changed `hidden` means that it's hidden by default but can be enabled `visible` means it's visible by default --- .../simulation/data/territorymanager.rng | 7 +++++++ .../simulation/data/territorymanager.xml | 1 + .../mod/simulation/data/territorymanager.rng | 7 +++++++ .../mod/simulation/data/territorymanager.xml | 1 + source/graphics/TerritoryTexture.cpp | 4 ++-- .../components/CCmpTerritoryManager.cpp | 18 +++++++++++++++--- .../components/ICmpTerritoryManager.cpp | 3 ++- .../components/ICmpTerritoryManager.h | 7 ++++++- 8 files changed, 41 insertions(+), 7 deletions(-) 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) };