From 25744df4a167ff1dc78e58f392eb7f0cb19f4b14 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 28 Jun 2026 23:06:15 +0100 Subject: [PATCH] Use reactive documents for viewport rendering --- Aetheria.State.Verify/Program.cs | 78 +++++++++++++------ .../AetheriaUnityRenderSplatViewportSource.cs | 5 +- Assets/Scripts/UI/Menu/MapRenderer.cs | 8 +- Assets/Scripts/Zone Display/ZoneRenderer.cs | 4 +- 4 files changed, 65 insertions(+), 30 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 3d53b108d..a3113b452 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -2434,7 +2434,7 @@ static void RequireDaemonRenderQueryAuthority(string root) ".Viewports", "ResolveObjectsViewport(viewport)", "private AetheriaRuntimeObjectsViewportDocument ResolveObjectsViewport(AetheriaRuntimeXzRect viewport)", - ".ObserveObjects(viewportBounds)", + ".ReactiveObjects(viewportBounds)", "_objectsViewport?.Current", "foreach (var entity in objects?.Objects ?? Array.Empty())", "_observedEntitySnapshotsByDaemonIndex.TryGetValue(entityIndex, out var entity)", @@ -7550,10 +7550,10 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "MapRenderer.cs")); var requiredMapRendererSharedDocumentSymbols = new[] { - "AetheriaRuntimeObjectsViewportSession _objectsViewport", - "AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", - ".ObserveObjects(viewport)", - ".ObserveRenderSplats(viewport)", + "CultMeshReactiveDocument _objectsViewport", + "CultMeshReactiveDocument _renderSplatsViewport", + ".ReactiveObjects(viewport)", + ".ReactiveRenderSplats(viewport)", ".Settings", "ClearViewportCaches()", "_objectsViewport?.Dispose()", @@ -7572,6 +7572,22 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) string.Join(", ", missingMapRendererSharedDocumentSymbols)); } + RequireReactiveTypedDocumentAccess( + mapRenderer, + "MapRenderer", + "AetheriaRuntimeObjectsViewportDocument", + "_objectsViewport", + ".ReactiveObjects(viewport)", + "AetheriaRuntimeObjectsViewportSession", + ".ObserveObjects(viewport)"); + RequireReactiveTypedDocumentAccess( + mapRenderer, + "MapRenderer", + "AetheriaRuntimeRenderSplatsViewportDocument", + "_renderSplatsViewport", + ".ReactiveRenderSplats(viewport)", + "AetheriaRuntimeRenderSplatsViewportSession", + ".ObserveRenderSplats(viewport)"); RequireReactiveTypedDocumentAccess( mapRenderer, "MapRenderer", @@ -7583,10 +7599,10 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) var forbiddenMapRendererSharedDocumentSymbols = new[] { - "CultMeshReactiveDocument _objectsViewport", - "CultMeshReactiveDocument _renderSplatsViewport", - ".ReactiveObjects(viewport)", - ".ReactiveRenderSplats(viewport)" + "AetheriaRuntimeObjectsViewportSession _objectsViewport", + "AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", + ".ObserveObjects(viewport)", + ".ObserveRenderSplats(viewport)" }; var mapRendererRawDocumentHits = forbiddenMapRendererSharedDocumentSymbols .Where(symbol => mapRenderer.Contains(symbol, StringComparison.Ordinal)) @@ -7594,7 +7610,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) if (mapRendererRawDocumentHits.Length > 0) { throw new InvalidOperationException( - "MapRenderer still owns raw viewport/settings CultMesh documents instead of managed sessions: " + + "MapRenderer still routes viewport documents through session wrappers instead of managed reactive typed documents: " + string.Join(", ", mapRendererRawDocumentHits)); } @@ -8001,8 +8017,8 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) "AetheriaUnityRenderSplatViewportSource.cs")); var requiredRenderSplatViewportSourceSymbols = new[] { - "AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", - ".ObserveRenderSplats(viewport)", + "CultMeshReactiveDocument _renderSplatsViewport", + ".ReactiveRenderSplats(viewport)", "_renderSplatsViewport?.Current", "ClearViewportDocument()" }; @@ -8017,13 +8033,22 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) string.Join(", ", missingRenderSplatViewportSourceSymbols)); } - if (renderSplatViewportSource.Contains("CultMeshReactiveDocument _renderSplatsViewport", StringComparison.Ordinal) || - renderSplatViewportSource.Contains(".ReactiveRenderSplats(viewport)", StringComparison.Ordinal)) + if (renderSplatViewportSource.Contains("AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", StringComparison.Ordinal) || + renderSplatViewportSource.Contains(".ObserveRenderSplats(viewport)", StringComparison.Ordinal)) { throw new InvalidOperationException( - "AetheriaUnityRenderSplatViewportSource still owns a raw render-splats CultMesh document instead of AetheriaRuntimeRenderSplatsViewportSession."); + "AetheriaUnityRenderSplatViewportSource still routes render-splats viewports through a session wrapper instead of a managed reactive typed document."); } + RequireReactiveTypedDocumentAccess( + renderSplatViewportSource, + "AetheriaUnityRenderSplatViewportSource", + "AetheriaRuntimeRenderSplatsViewportDocument", + "_renderSplatsViewport", + ".ReactiveRenderSplats(viewport)", + "AetheriaRuntimeRenderSplatsViewportSession", + ".ObserveRenderSplats(viewport)"); + var zoneRenderer = File.ReadAllText(Path.Combine( root, "Assets", @@ -8032,8 +8057,8 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) "ZoneRenderer.cs")); var requiredZoneRendererViewportSymbols = new[] { - "AetheriaRuntimeObjectsViewportSession _objectsViewport", - ".ObserveObjects(viewportBounds)", + "CultMeshReactiveDocument _objectsViewport", + ".ReactiveObjects(viewportBounds)", "_objectsViewport?.Current", "_objectsViewport?.Dispose()" }; @@ -8048,13 +8073,22 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) string.Join(", ", missingZoneRendererViewportSymbols)); } - if (zoneRenderer.Contains("CultMeshReactiveDocument _objectsViewport", StringComparison.Ordinal) || - zoneRenderer.Contains(".ReactiveObjects(viewportBounds)", StringComparison.Ordinal)) + if (zoneRenderer.Contains("AetheriaRuntimeObjectsViewportSession _objectsViewport", StringComparison.Ordinal) || + zoneRenderer.Contains(".ObserveObjects(viewportBounds)", StringComparison.Ordinal)) { throw new InvalidOperationException( - "ZoneRenderer still owns a raw objects viewport CultMesh document instead of AetheriaRuntimeObjectsViewportSession."); + "ZoneRenderer still routes fallback objects viewports through a session wrapper instead of a managed reactive typed document."); } + RequireReactiveTypedDocumentAccess( + zoneRenderer, + "ZoneRenderer", + "AetheriaRuntimeObjectsViewportDocument", + "_objectsViewport", + ".ReactiveObjects(viewportBounds)", + "AetheriaRuntimeObjectsViewportSession", + ".ObserveObjects(viewportBounds)"); + Console.WriteLine("Viewport and map document accessors: Unity reads map, contact, viewport, and current-entity state through named managed accessors"); } @@ -13899,8 +13933,8 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root) if (!mapRenderer.Contains("AetheriaUnityRuntimeClientProvider.ResolveClient(", StringComparison.Ordinal) || !mapRenderer.Contains(".Viewports", StringComparison.Ordinal) || - !mapRenderer.Contains(".ObserveObjects(viewport)", StringComparison.Ordinal) || - !mapRenderer.Contains(".ObserveRenderSplats(viewport)", StringComparison.Ordinal) || + !mapRenderer.Contains(".ReactiveObjects(viewport)", StringComparison.Ordinal) || + !mapRenderer.Contains(".ReactiveRenderSplats(viewport)", StringComparison.Ordinal) || !mapRenderer.Contains(".Settings", StringComparison.Ordinal) || !mapRenderer.Contains(".ReactivePlayer()", StringComparison.Ordinal) || !sectorRenderer.Contains("AetheriaUnityRuntimeClientProvider.ResolveClient(", StringComparison.Ordinal) || diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs b/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs index 634a7884f..543eed377 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs @@ -1,5 +1,6 @@ using System; using GameCult.Aetheria.State.Verse; +using GameCult.Mesh; using UnityEngine; public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour @@ -27,7 +28,7 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour private float _nextRefreshTime; private AetheriaRuntimeRtsViewportBounds _viewport; - private AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport; + private CultMeshReactiveDocument _renderSplatsViewport; public RenderTexture TargetTexture { @@ -118,7 +119,7 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour var nextRenderSplatsViewport = ResolveClient() .State .Viewports - .ObserveRenderSplats(viewport); + .ReactiveRenderSplats(viewport); ClearViewportDocument(); _viewport = viewport; _renderSplatsViewport = nextRenderSplatsViewport; diff --git a/Assets/Scripts/UI/Menu/MapRenderer.cs b/Assets/Scripts/UI/Menu/MapRenderer.cs index add6e1530..f03146068 100644 --- a/Assets/Scripts/UI/Menu/MapRenderer.cs +++ b/Assets/Scripts/UI/Menu/MapRenderer.cs @@ -40,8 +40,8 @@ public class MapRenderer : MonoBehaviour private RenderTexture _mapTexture; private int2 _size; private bool _init; - private AetheriaRuntimeObjectsViewportSession _objectsViewport; - private AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport; + private CultMeshReactiveDocument _objectsViewport; + private CultMeshReactiveDocument _renderSplatsViewport; private float _nextViewportRefreshTime; private readonly List _rtsIconPool = new List(); private string _clientStatePath = ""; @@ -132,11 +132,11 @@ public class MapRenderer : MonoBehaviour _objectsViewport = client .State .Viewports - .ObserveObjects(viewport); + .ReactiveObjects(viewport); _renderSplatsViewport = client .State .Viewports - .ObserveRenderSplats(viewport); + .ReactiveRenderSplats(viewport); var objectsViewport = _objectsViewport?.Current; var zoneName = string.IsNullOrWhiteSpace(objectsViewport?.ZoneName) diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index 7563987cf..9e853b846 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -123,7 +123,7 @@ public class ZoneRenderer : MonoBehaviour private CultMeshReactiveDocument _catalog; private CultMeshReactiveDocument _zoneContacts; private AetheriaRuntimeRtsViewportBounds _objectsViewportBounds; - private AetheriaRuntimeObjectsViewportSession _objectsViewport; + private CultMeshReactiveDocument _objectsViewport; public Dictionary WormholeInstances = new Dictionary(); private List _loot = new List(); @@ -1246,7 +1246,7 @@ public class ZoneRenderer : MonoBehaviour var nextObjectsViewport = ResolveClient() .State .Viewports - .ObserveObjects(viewportBounds); + .ReactiveObjects(viewportBounds); _objectsViewport?.Dispose(); _objectsViewportBounds = viewportBounds; _objectsViewport = nextObjectsViewport;