From 95e09dc241a69f54e89fb23e807e36e00dfbff77 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 21 Jun 2026 15:14:15 +0100 Subject: [PATCH] Render zone terrain from daemon gravity queries --- Aetheria.State.Verify/Program.cs | 28 ++++++++++++++++++++ Assets/Scripts/Gameplay/ActionGameManager.cs | 2 +- Assets/Scripts/Zone Display/ZoneRenderer.cs | 17 +++++++++--- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 7cc7ffb96..b1c157427 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -1788,6 +1788,11 @@ static void RequireDaemonRenderQueryAuthority(string root) ? File.ReadAllText(indirectRendererPath) : throw new InvalidOperationException("Cannot verify daemon render query authority; AetheriaDaemonIndirectRenderer.cs is missing."); + var zoneRendererPath = Path.Combine(root, "Assets", "Scripts", "Zone Display", "ZoneRenderer.cs"); + var zoneRenderer = File.Exists(zoneRendererPath) + ? File.ReadAllText(zoneRendererPath) + : throw new InvalidOperationException("Cannot verify daemon render query authority; ZoneRenderer.cs is missing."); + var canonicalSnapshotPath = Path.Combine(root, "Aetheria.State", "Documents", "AetheriaRuntimeStateDocuments.cs"); var canonicalSnapshot = File.Exists(canonicalSnapshotPath) ? File.ReadAllText(canonicalSnapshotPath) @@ -1866,6 +1871,29 @@ static void RequireDaemonRenderQueryAuthority(string root) "Unity's daemon indirect renderer must query daemon SoA render groups by camera bounds before lowering draw calls: " + string.Join(", ", missingRendererSymbols)); } + + if (zoneRenderer.Contains("Zone.GetHeight(", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "ZoneRenderer must evaluate gravity terrain from daemon render queries instead of the mirrored Unity Zone height evaluator."); + } + + var requiredZoneRendererSymbols = new[] + { + "private AetheriaRuntimeZoneSnapshotCommit _daemonZoneSnapshot;", + "public void LoadZone(Zone zone, AetheriaRuntimeZoneSnapshotCommit daemonZone = null)", + "_daemonZoneSnapshot = daemonZone;", + "AetheriaRuntimeDaemonRenderQueries.EvaluateGravityTerrainHeight(" + }; + var missingZoneRendererSymbols = requiredZoneRendererSymbols + .Where(symbol => !zoneRenderer.Contains(symbol, StringComparison.Ordinal)) + .ToArray(); + if (missingZoneRendererSymbols.Length > 0) + { + throw new InvalidOperationException( + "ZoneRenderer must lower daemon-authored gravity terrain snapshots instead of recomputing render height through Zone: " + + string.Join(", ", missingZoneRendererSymbols)); + } } static void RequireTypedZoneConstructionKeys(string root) diff --git a/Assets/Scripts/Gameplay/ActionGameManager.cs b/Assets/Scripts/Gameplay/ActionGameManager.cs index ce3fcbe3a..75a19b5ad 100644 --- a/Assets/Scripts/Gameplay/ActionGameManager.cs +++ b/Assets/Scripts/Gameplay/ActionGameManager.cs @@ -2067,7 +2067,7 @@ public class ActionGameManager : MonoBehaviour Zone.Log = s => Debug.Log($"Zone: {s}"); - ZoneRenderer.LoadZone(Zone); + ZoneRenderer.LoadZone(Zone, daemonZone); if (CurrentEntity != null) { diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index 86a263e2e..ac0601004 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -85,6 +85,7 @@ public class ZoneRenderer : MonoBehaviour private List _zoneSubscriptions = new List(); private PlanetObject[] _suns; private bool _showAsteroidUI; + private AetheriaRuntimeZoneSnapshotCommit _daemonZoneSnapshot; public Dictionary WormholeInstances = new Dictionary(); private List _loot = new List(); @@ -181,10 +182,11 @@ public class ZoneRenderer : MonoBehaviour _transposer = SceneCamera.GetCinemachineComponent(); } - public void LoadZone(Zone zone) + public void LoadZone(Zone zone, AetheriaRuntimeZoneSnapshotCommit daemonZone = null) { ClearZone(); Zone = zone; + _daemonZoneSnapshot = daemonZone; SectorBrushes.localScale = zone.Radius * 2 * Vector3.one; SlimeGravityCamera.orthographicSize = zone.Radius; SlimeRenderer.ZoneRadius = zone.Radius; @@ -470,7 +472,7 @@ public class ZoneRenderer : MonoBehaviour foreach (var (key, belt) in Zone.AsteroidBelts) { - var height = Zone.GetHeight(belt.OrbitPosition); + var height = GetTerrainHeight(belt.OrbitPosition); if(isVisible(new Bounds( new Vector3(belt.OrbitPosition.x,height,belt.OrbitPosition.y), new Vector3(belt.Radius * 2,100,belt.Radius * 2)))) @@ -504,7 +506,7 @@ public class ZoneRenderer : MonoBehaviour { var planetInstance = Zone.PlanetInstances[planet.Key]; var p = Zone.GetOrbitPosition(planetInstance.OrbitKey); - var height = Zone.GetHeight(p); + var height = GetTerrainHeight(p); if (-height > maxDepth) maxDepth = -height; planet.Value.transform.position = new Vector3(p.x, 0, p.y); planet.Value.Body.transform.localPosition = new Vector3(0, height + planetInstance.BodyRadius * 2, 0); @@ -562,6 +564,15 @@ public class ZoneRenderer : MonoBehaviour // MinimapTintQuad.transform.position = gravPos - Vector3.up*10; } + private float GetTerrainHeight(float2 position) + { + return (float)AetheriaRuntimeDaemonRenderQueries.EvaluateGravityTerrainHeight( + _daemonZoneSnapshot, + position.x, + position.y, + Zone?.Time ?? 0); + } + public void DestroyLoot(ItemPickup loot) { _loot.Remove(loot);