diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 56e8591c1..086d95727 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -2438,9 +2438,8 @@ static void RequireDaemonRenderQueryAuthority(string root) "FindAnyObjectByType()", "ResolveObjectsViewport(viewport)", "private AetheriaRuntimeObjectsViewportDocument ResolveObjectsViewport(AetheriaRuntimeXzRect viewport)", - ".ReactiveObjectsViewport(", - "\"unity-zone-renderer\"", - "_objectsViewport?.Current", + ".ZonePresentationDocuments(viewportBounds, \"unity-zone-renderer\")", + "_zonePresentationDocuments.CurrentObjectsViewport", "foreach (var entity in objects?.Objects ?? Array.Empty())", "_observedEntitySnapshotsByDaemonIndex.TryGetValue(entityIndex, out var entity)", "Loading entity {entity.Name} from daemon presentation query", @@ -2457,7 +2456,7 @@ static void RequireDaemonRenderQueryAuthority(string root) "foreach (var beltPose in _daemonAsteroidBeltPoses)", "beltPose.InstancePoses ?? Array.Empty()", "private void RefreshDaemonContactRows()", - ".ReactiveZoneContacts(\"unity-zone-renderer\")", + "_zonePresentationDocuments.CurrentContacts", "private void RefreshDaemonCompassMarkers()", "private void RefreshDaemonVisibleEntityInstances()", "PowerPulse(", @@ -7730,13 +7729,11 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "MapRenderer.cs")); var requiredMapRendererSharedDocumentSymbols = new[] { - "CultMeshReactiveDocument _objectsViewport", - "CultMeshReactiveDocument _renderSplatsViewport", + "AetheriaUnityRtsViewportDocuments _viewportDocuments", "ClearViewportCaches()", - "_objectsViewport?.Dispose()", - "_renderSplatsViewport?.Dispose()", - "_objectsViewport?.Current", - "_renderSplatsViewport?.Current", + "_viewportDocuments?.Dispose()", + "_viewportDocuments?.CurrentObjectsViewport", + "_viewportDocuments?.CurrentRenderSplatsViewport", "private void OnDestroy()" }; var missingMapRendererSharedDocumentSymbols = requiredMapRendererSharedDocumentSymbols @@ -7746,8 +7743,7 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) missingMapRendererSharedDocumentSymbols = missingMapRendererSharedDocumentSymbols .Concat(new[] { - ".ReactiveObjectsViewport(viewport,\"unity-map-renderer\")", - ".ReactiveRenderSplatsViewport(viewport,\"unity-map-renderer\")", + ".MapViewportDocuments(viewport,\"unity-map-renderer\")", "AetheriaUnityRuntimeClientProvider.CurrentPlayerSettings(\"unity-map-renderer\")" } .Select(CompactSource) @@ -7760,25 +7756,12 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) string.Join(", ", missingMapRendererSharedDocumentSymbols)); } - RequireReactiveTypedDocumentAccess( - mapRenderer, - "MapRenderer", - "AetheriaRuntimeObjectsViewportDocument", - "_objectsViewport", - ".ReactiveObjectsViewport(viewport,\"unity-map-renderer\")", - "AetheriaRuntimeObjectsViewportSession", - ".ObserveObjects(viewport)"); - RequireReactiveTypedDocumentAccess( - mapRenderer, - "MapRenderer", - "AetheriaRuntimeRenderSplatsViewportDocument", - "_renderSplatsViewport", - ".ReactiveRenderSplatsViewport(viewport,\"unity-map-renderer\")", - "AetheriaRuntimeRenderSplatsViewportSession", - ".ObserveRenderSplats(viewport)"); - var forbiddenMapRendererSharedDocumentSymbols = new[] { + "CultMeshReactiveDocument _objectsViewport", + "CultMeshReactiveDocument _renderSplatsViewport", + ".ReactiveObjectsViewport(viewport, \"unity-map-renderer\")", + ".ReactiveRenderSplatsViewport(viewport, \"unity-map-renderer\")", "AetheriaRuntimeObjectsViewportSession _objectsViewport", "AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", "CultMeshReactiveDocument", @@ -8054,12 +8037,11 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) "ZoneRenderer.cs")); var requiredZoneRendererSharedDocumentSymbols = new[] { - ".RuntimeState(\"unity-zone-renderer\")", - ".CurrentCatalog()", - "CultMeshReactiveDocument _zoneContacts", - ".ReactiveZoneContacts(\"unity-zone-renderer\")", - "_zoneContacts?.Dispose()", - "_zoneContacts?.Current", + ".CurrentCatalog(\"unity-zone-renderer\")", + "AetheriaUnityRtsViewportDocuments _zonePresentationDocuments", + ".ZonePresentationDocuments(", + "_zonePresentationDocuments?.Dispose()", + "_zonePresentationDocuments?.CurrentContacts", "private void OnDestroy()" }; var missingZoneRendererSharedDocumentSymbols = requiredZoneRendererSharedDocumentSymbols @@ -8072,16 +8054,13 @@ static void RequireUnitySharedDocumentAccessorErgonomics(string root) string.Join(", ", missingZoneRendererSharedDocumentSymbols)); } - RequireReactiveTypedDocumentAccess( - zoneRenderer, - "ZoneRenderer", - "AetheriaRuntimeZoneContactsDocument", - "_zoneContacts", - ".ReactiveZoneContacts(\"unity-zone-renderer\")", - "AetheriaRuntimeZoneContactsSession", - "ResolveClient().State.ObserveZoneContacts()"); var forbiddenZoneRendererSharedDocumentSymbols = new[] { + "CultMeshReactiveDocument _zoneContacts", + ".ReactiveZoneContacts(\"unity-zone-renderer\")", + "_zoneContacts?.Current", + "_zoneContacts?.Dispose()", + ".RuntimeState(\"unity-zone-renderer\")", "AetheriaRuntimeZoneContactsSession _zoneContacts", "ResolveClient().State.ObserveZoneContacts()", "CultMeshReactiveDocument", @@ -8190,19 +8169,19 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) "AetheriaUnityRenderSplatViewportSource.cs")); var requiredRenderSplatViewportSourceSymbols = new[] { - "CultMeshReactiveDocument _renderSplatsViewport", - "_renderSplatsViewport?.Current", + "AetheriaUnityRtsViewportDocuments _viewportDocuments", + "_viewportDocuments?.CurrentRenderSplatsViewport", "ClearViewportDocument()" }; var missingRenderSplatViewportSourceSymbols = requiredRenderSplatViewportSourceSymbols .Where(symbol => !renderSplatViewportSource.Contains(symbol, StringComparison.Ordinal)) .ToArray(); if (!CompactSource(renderSplatViewportSource).Contains( - ".ReactiveRenderSplatsViewport(viewport,\"unity-render-splat-viewport\")", + ".RenderSplatViewportDocuments(viewport,\"unity-render-splat-viewport\")", StringComparison.Ordinal)) { missingRenderSplatViewportSourceSymbols = missingRenderSplatViewportSourceSymbols - .Concat(new[] { ".ReactiveRenderSplatsViewport(viewport,\"unity-render-splat-viewport\")" }) + .Concat(new[] { ".RenderSplatViewportDocuments(viewport,\"unity-render-splat-viewport\")" }) .ToArray(); } if (missingRenderSplatViewportSourceSymbols.Length > 0 || @@ -8213,22 +8192,15 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) string.Join(", ", missingRenderSplatViewportSourceSymbols)); } - if (renderSplatViewportSource.Contains("AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", StringComparison.Ordinal) || + if (renderSplatViewportSource.Contains("CultMeshReactiveDocument _renderSplatsViewport", StringComparison.Ordinal) || + renderSplatViewportSource.Contains(".ReactiveRenderSplatsViewport(", StringComparison.Ordinal) || + renderSplatViewportSource.Contains("AetheriaRuntimeRenderSplatsViewportSession _renderSplatsViewport", StringComparison.Ordinal) || renderSplatViewportSource.Contains(".ObserveRenderSplats(viewport)", StringComparison.Ordinal)) { throw new InvalidOperationException( - "AetheriaUnityRenderSplatViewportSource still routes render-splats viewports through a session wrapper instead of a managed reactive typed document."); + "AetheriaUnityRenderSplatViewportSource still routes render-splats viewports through raw/session wrapper state instead of a managed viewport document."); } - RequireReactiveTypedDocumentAccess( - renderSplatViewportSource, - "AetheriaUnityRenderSplatViewportSource", - "AetheriaRuntimeRenderSplatsViewportDocument", - "_renderSplatsViewport", - ".ReactiveRenderSplatsViewport(viewport,\"unity-render-splat-viewport\")", - "AetheriaRuntimeRenderSplatsViewportSession", - ".ObserveRenderSplats(viewport)"); - var zoneRenderer = File.ReadAllText(Path.Combine( root, "Assets", @@ -8237,19 +8209,19 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) "ZoneRenderer.cs")); var requiredZoneRendererViewportSymbols = new[] { - "CultMeshReactiveDocument _objectsViewport", - "_objectsViewport?.Current", - "_objectsViewport?.Dispose()" + "AetheriaUnityRtsViewportDocuments _zonePresentationDocuments", + "_zonePresentationDocuments.CurrentObjectsViewport", + "_zonePresentationDocuments?.Dispose()" }; var missingZoneRendererViewportSymbols = requiredZoneRendererViewportSymbols .Where(symbol => !zoneRenderer.Contains(symbol, StringComparison.Ordinal)) .ToArray(); if (!CompactSource(zoneRenderer).Contains( - ".ReactiveObjectsViewport(viewportBounds,\"unity-zone-renderer\")", + ".ZonePresentationDocuments(viewportBounds,\"unity-zone-renderer\")", StringComparison.Ordinal)) { missingZoneRendererViewportSymbols = missingZoneRendererViewportSymbols - .Concat(new[] { ".ReactiveObjectsViewport(viewportBounds,\"unity-zone-renderer\")" }) + .Concat(new[] { ".ZonePresentationDocuments(viewportBounds,\"unity-zone-renderer\")" }) .ToArray(); } if (missingZoneRendererViewportSymbols.Length > 0 || @@ -8260,22 +8232,15 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root) string.Join(", ", missingZoneRendererViewportSymbols)); } - if (zoneRenderer.Contains("AetheriaRuntimeObjectsViewportSession _objectsViewport", StringComparison.Ordinal) || + if (zoneRenderer.Contains("CultMeshReactiveDocument _objectsViewport", StringComparison.Ordinal) || + zoneRenderer.Contains(".ReactiveObjectsViewport(", StringComparison.Ordinal) || + zoneRenderer.Contains("AetheriaRuntimeObjectsViewportSession _objectsViewport", StringComparison.Ordinal) || zoneRenderer.Contains(".ObserveObjects(viewportBounds)", StringComparison.Ordinal)) { throw new InvalidOperationException( - "ZoneRenderer still routes fallback objects viewports through a session wrapper instead of a managed reactive typed document."); + "ZoneRenderer still routes fallback objects viewports through raw/session wrapper state instead of a managed viewport document."); } - RequireReactiveTypedDocumentAccess( - zoneRenderer, - "ZoneRenderer", - "AetheriaRuntimeObjectsViewportDocument", - "_objectsViewport", - ".ReactiveObjectsViewport(viewportBounds,\"unity-zone-renderer\")", - "AetheriaRuntimeObjectsViewportSession", - ".ObserveObjects(viewportBounds)"); - Console.WriteLine("Viewport and map document accessors: Unity reads fixed map/contact state and parameterized viewport state through named managed typed documents"); } @@ -14823,8 +14788,7 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root) var compactSectorRenderer = CompactSource(sectorRenderer); var compactSectorMap = CompactSource(sectorMap); if (!mapRenderer.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal) || - !compactMapRenderer.Contains(".ReactiveObjectsViewport(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || - !compactMapRenderer.Contains(".ReactiveRenderSplatsViewport(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || + !compactMapRenderer.Contains(".MapViewportDocuments(viewport,\"unity-map-renderer\")", StringComparison.Ordinal) || !compactMapRenderer.Contains(CompactSource("AetheriaUnityRuntimeClientProvider.CurrentPlayerSettings(\"unity-map-renderer\")"), StringComparison.Ordinal) || !sectorRenderer.Contains("AetheriaUnityRuntimeClientProvider", StringComparison.Ordinal) || !sectorRenderer.Contains("AetheriaUnityRuntimeClientProvider.CurrentSectorMap(\"unity-sector-renderer\")", StringComparison.Ordinal) || @@ -16478,6 +16442,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root) "public static AetheriaRuntimeInventoryDocument CurrentInventory(int entityIndex, string runtimeId = \"\")", "public static CultMeshReactiveDocument ReactiveObjectsViewport(", "public static CultMeshReactiveDocument ReactiveRenderSplatsViewport(", + "public static AetheriaUnityRtsViewportDocuments MapViewportDocuments(", + "public static AetheriaUnityRtsViewportDocuments ZonePresentationDocuments(", + "public static AetheriaUnityRtsViewportDocuments RenderSplatViewportDocuments(", "public static AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame(string runtimeId = \"\")", "public static AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame(", "public static AetheriaUnityDaemonRenderDocuments DaemonRenderDocuments(", @@ -18971,56 +18938,6 @@ static bool ContainsUnitySettingsMember(string source, string memberName) source.Contains($"\nSettings.{memberName}", StringComparison.Ordinal); } -static void RequireReactiveTypedDocumentAccess( - string source, - string ownerName, - string documentType, - string fieldName, - string reactiveAccessor, - string forbiddenSessionType, - string forbiddenObserveAccessor) -{ - var compactSource = CompactSource(source); - var compactReactiveAccessor = CompactSource(reactiveAccessor); - var requiredSymbols = new[] - { - $"CultMeshReactiveDocument<{documentType}> {fieldName}", - $"{fieldName}?.Current", - $"{fieldName}?.Dispose()" - }; - var missingSymbols = requiredSymbols - .Where(symbol => !source.Contains(symbol, StringComparison.Ordinal)) - .ToArray(); - if (!string.IsNullOrWhiteSpace(compactReactiveAccessor) && - !compactSource.Contains(compactReactiveAccessor, StringComparison.Ordinal)) - { - missingSymbols = missingSymbols - .Concat(new[] { reactiveAccessor }) - .ToArray(); - } - if (missingSymbols.Length > 0) - { - throw new InvalidOperationException( - $"{ownerName} should read {documentType} through a managed reactive typed document: " + - string.Join(", ", missingSymbols)); - } - - var forbiddenSymbols = new[] - { - $"{forbiddenSessionType} {fieldName}", - forbiddenObserveAccessor - }; - var survivingSymbols = forbiddenSymbols - .Where(symbol => source.Contains(symbol, StringComparison.Ordinal)) - .ToArray(); - if (survivingSymbols.Length > 0) - { - throw new InvalidOperationException( - $"{ownerName} still routes {documentType} through a legacy session wrapper instead of the managed reactive typed document: " + - string.Join(", ", survivingSymbols)); - } -} - static string CompactSource(string source) { return string.Concat((source ?? "").Where(character => !char.IsWhiteSpace(character))); diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs b/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs index cbca2cc65..5ad76b995 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityRenderSplatViewportSource.cs @@ -1,6 +1,5 @@ using System; using GameCult.Aetheria.State.Verse; -using GameCult.Mesh; using UnityEngine; public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour @@ -27,8 +26,7 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour private bool renderInLateUpdate = true; private float _nextRefreshTime; - private AetheriaRuntimeRtsViewportBounds _viewport; - private CultMeshReactiveDocument _renderSplatsViewport; + private AetheriaUnityRtsViewportDocuments _viewportDocuments; public RenderTexture TargetTexture { @@ -65,7 +63,7 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour return false; RefreshDocument(false); - var document = _renderSplatsViewport?.Current; + var document = _viewportDocuments?.CurrentRenderSplatsViewport; if (document == null) return false; @@ -107,7 +105,7 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour private void RefreshDocument(bool force) { var viewport = ResolveViewportBounds(); - if (!force && _renderSplatsViewport != null && SameViewport(_viewport, viewport)) + if (!force && _viewportDocuments != null && _viewportDocuments.Matches(viewport)) return; if (!force && Time.unscaledTime < _nextRefreshTime) @@ -116,13 +114,10 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour _nextRefreshTime = Time.unscaledTime + Mathf.Max(0.02f, refreshIntervalSeconds); try { - var nextRenderSplatsViewport = AetheriaUnityRuntimeClientProvider - .ReactiveRenderSplatsViewport( - viewport, - "unity-render-splat-viewport"); + var nextDocuments = AetheriaUnityRuntimeClientProvider + .RenderSplatViewportDocuments(viewport, "unity-render-splat-viewport"); ClearViewportDocument(); - _viewport = viewport; - _renderSplatsViewport = nextRenderSplatsViewport; + _viewportDocuments = nextDocuments; } catch (Exception ex) { @@ -144,21 +139,8 @@ public sealed class AetheriaUnityRenderSplatViewportSource : MonoBehaviour private void ClearViewportDocument() { - _renderSplatsViewport?.Dispose(); - _renderSplatsViewport = null; - } - - private static bool SameViewport( - AetheriaRuntimeRtsViewportBounds left, - AetheriaRuntimeRtsViewportBounds right) - { - if (left == null || right == null) - return false; - - return Mathf.Approximately(left.MinX, right.MinX) && - Mathf.Approximately(left.MinY, right.MinY) && - Mathf.Approximately(left.MaxX, right.MaxX) && - Mathf.Approximately(left.MaxY, right.MaxY); + _viewportDocuments?.Dispose(); + _viewportDocuments = null; } } diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRtsViewportDocuments.cs b/Assets/Scripts/Gameplay/AetheriaUnityRtsViewportDocuments.cs new file mode 100644 index 000000000..3d1202a78 --- /dev/null +++ b/Assets/Scripts/Gameplay/AetheriaUnityRtsViewportDocuments.cs @@ -0,0 +1,100 @@ +using System; +using GameCult.Aetheria.State.Verse; +using GameCult.Mesh; + +public sealed class AetheriaUnityRtsViewportDocuments : IDisposable +{ + private AetheriaUnityRtsViewportDocuments( + AetheriaClientState state, + AetheriaRuntimeRtsViewportBounds viewport, + bool bindContacts, + bool bindObjects, + bool bindRenderSplats) + { + if (state == null) + throw new ArgumentNullException(nameof(state)); + if (viewport == null) + throw new ArgumentNullException(nameof(viewport)); + + Viewport = viewport; + Contacts = bindContacts ? state.ReactiveZoneContacts() : null; + ObjectsViewport = bindObjects ? state.ReactiveObjectsViewport(viewport) : null; + RenderSplatsViewport = bindRenderSplats ? state.ReactiveRenderSplatsViewport(viewport) : null; + } + + public AetheriaRuntimeRtsViewportBounds Viewport { get; } + public CultMeshReactiveDocument Contacts { get; } + public CultMeshReactiveDocument ObjectsViewport { get; } + public CultMeshReactiveDocument RenderSplatsViewport { get; } + + public AetheriaRuntimeZoneContactsDocument CurrentContacts => Contacts?.Current; + public AetheriaRuntimeObjectsViewportDocument CurrentObjectsViewport => ObjectsViewport?.Current; + public AetheriaRuntimeRenderSplatsViewportDocument CurrentRenderSplatsViewport => RenderSplatsViewport?.Current; + + public static AetheriaUnityRtsViewportDocuments OpenMap( + AetheriaClientState state, + AetheriaRuntimeRtsViewportBounds viewport) + { + return new AetheriaUnityRtsViewportDocuments( + state, + viewport, + bindContacts: false, + bindObjects: true, + bindRenderSplats: true); + } + + public static AetheriaUnityRtsViewportDocuments OpenZonePresentation( + AetheriaClientState state, + AetheriaRuntimeRtsViewportBounds viewport) + { + return new AetheriaUnityRtsViewportDocuments( + state, + viewport, + bindContacts: true, + bindObjects: true, + bindRenderSplats: false); + } + + public static AetheriaUnityRtsViewportDocuments OpenRenderSplats( + AetheriaClientState state, + AetheriaRuntimeRtsViewportBounds viewport) + { + return new AetheriaUnityRtsViewportDocuments( + state, + viewport, + bindContacts: false, + bindObjects: false, + bindRenderSplats: true); + } + + public bool Matches(AetheriaRuntimeRtsViewportBounds viewport) + { + return SameViewport(Viewport, viewport); + } + + public void Dispose() + { + Contacts?.Dispose(); + ObjectsViewport?.Dispose(); + RenderSplatsViewport?.Dispose(); + } + + public static bool SameViewport( + AetheriaRuntimeRtsViewportBounds left, + AetheriaRuntimeRtsViewportBounds right) + { + if (left == null || right == null) + return false; + + return Approximately(left.MinX, right.MinX) && + Approximately(left.MinY, right.MinY) && + Approximately(left.MaxX, right.MaxX) && + Approximately(left.MaxY, right.MaxY); + } + + private static bool Approximately(double left, double right) + { + var scale = Math.Max(1.0, Math.Max(Math.Abs(left), Math.Abs(right))); + return Math.Abs(left - right) <= scale * 1e-6; + } +} diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRtsViewportDocuments.cs.meta b/Assets/Scripts/Gameplay/AetheriaUnityRtsViewportDocuments.cs.meta new file mode 100644 index 000000000..1520ef38c --- /dev/null +++ b/Assets/Scripts/Gameplay/AetheriaUnityRtsViewportDocuments.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e763d94f902249349a0f897ef12bd185 diff --git a/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs b/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs index 0adb91a34..f96da17c3 100644 --- a/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs +++ b/Assets/Scripts/Gameplay/AetheriaUnityRuntimeClientProvider.cs @@ -175,6 +175,27 @@ public static class AetheriaUnityRuntimeClientProvider return RuntimeState(runtimeId).ReactiveRenderSplatsViewport(viewport); } + public static AetheriaUnityRtsViewportDocuments MapViewportDocuments( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return AetheriaUnityRtsViewportDocuments.OpenMap(RuntimeState(runtimeId), viewport); + } + + public static AetheriaUnityRtsViewportDocuments ZonePresentationDocuments( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return AetheriaUnityRtsViewportDocuments.OpenZonePresentation(RuntimeState(runtimeId), viewport); + } + + public static AetheriaUnityRtsViewportDocuments RenderSplatViewportDocuments( + AetheriaRuntimeRtsViewportBounds viewport, + string runtimeId = "") + { + return AetheriaUnityRtsViewportDocuments.OpenRenderSplats(RuntimeState(runtimeId), viewport); + } + public static AetheriaRuntimeDaemonFrameDocument CurrentDaemonFrame(string runtimeId = "") { return RuntimeState(runtimeId).CurrentDaemonFrame(); diff --git a/Assets/Scripts/UI/Menu/MapRenderer.cs b/Assets/Scripts/UI/Menu/MapRenderer.cs index c875f4805..1b0fbf2e3 100644 --- a/Assets/Scripts/UI/Menu/MapRenderer.cs +++ b/Assets/Scripts/UI/Menu/MapRenderer.cs @@ -7,7 +7,6 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using GameCult.Aetheria.State.Verse; -using GameCult.Mesh; using TMPro; using UnityEngine; using Unity.Mathematics; @@ -40,8 +39,7 @@ public class MapRenderer : MonoBehaviour private RenderTexture _mapTexture; private int2 _size; private bool _init; - private CultMeshReactiveDocument _objectsViewport; - private CultMeshReactiveDocument _renderSplatsViewport; + private AetheriaUnityRtsViewportDocuments _viewportDocuments; private float _nextViewportRefreshTime; private readonly List _rtsIconPool = new List(); @@ -126,12 +124,10 @@ public class MapRenderer : MonoBehaviour { var viewport = ResolveViewportBounds(); ClearViewportCaches(); - _objectsViewport = AetheriaUnityRuntimeClientProvider - .ReactiveObjectsViewport(viewport, "unity-map-renderer"); - _renderSplatsViewport = AetheriaUnityRuntimeClientProvider - .ReactiveRenderSplatsViewport(viewport, "unity-map-renderer"); + _viewportDocuments = AetheriaUnityRuntimeClientProvider + .MapViewportDocuments(viewport, "unity-map-renderer"); - var objectsViewport = _objectsViewport?.Current; + var objectsViewport = _viewportDocuments?.CurrentObjectsViewport; var zoneName = string.IsNullOrWhiteSpace(objectsViewport?.ZoneName) ? "Unknown" : objectsViewport.ZoneName; @@ -146,7 +142,7 @@ public class MapRenderer : MonoBehaviour private void RenderSplatLayers() { - var renderSplatsViewport = _renderSplatsViewport?.Current; + var renderSplatsViewport = _viewportDocuments?.CurrentRenderSplatsViewport; if (renderSplatsViewport == null) return; @@ -185,7 +181,7 @@ public class MapRenderer : MonoBehaviour if (RtsIconRoot == null) return; - var objects = _objectsViewport?.Current?.Objects ?? Array.Empty(); + var objects = _viewportDocuments?.CurrentObjectsViewport?.Objects ?? Array.Empty(); for (var i = 0; i < objects.Count; i++) { var icon = ResolveRtsIcon(i); @@ -244,7 +240,7 @@ public class MapRenderer : MonoBehaviour private Vector2 WorldToMapPosition(double worldX, double worldY) { - var viewport = _objectsViewport?.Current?.Viewport ?? ResolveViewportBounds(); + var viewport = _viewportDocuments?.CurrentObjectsViewport?.Viewport ?? ResolveViewportBounds(); var minX = Math.Min(viewport.MinX, viewport.MaxX); var maxX = Math.Max(viewport.MinX, viewport.MaxX); var minY = Math.Min(viewport.MinY, viewport.MaxY); @@ -329,10 +325,8 @@ public class MapRenderer : MonoBehaviour private void ClearViewportCaches() { - _objectsViewport?.Dispose(); - _renderSplatsViewport?.Dispose(); - _objectsViewport = null; - _renderSplatsViewport = null; + _viewportDocuments?.Dispose(); + _viewportDocuments = null; } private void OnDestroy() diff --git a/Assets/Scripts/Zone Display/ZoneRenderer.cs b/Assets/Scripts/Zone Display/ZoneRenderer.cs index ca08b2302..d8d7e8a96 100644 --- a/Assets/Scripts/Zone Display/ZoneRenderer.cs +++ b/Assets/Scripts/Zone Display/ZoneRenderer.cs @@ -8,7 +8,6 @@ using System.Collections.Generic; using System.Linq; using Cinemachine; using GameCult.Aetheria.State.Verse; -using GameCult.Mesh; using UnityEngine; using UnityEngine.Serialization; using Object = UnityEngine.Object; @@ -119,9 +118,7 @@ public class ZoneRenderer : MonoBehaviour Array.Empty(); private IReadOnlyList _zoneRenderBodies = Array.Empty(); - private CultMeshReactiveDocument _zoneContacts; - private AetheriaRuntimeRtsViewportBounds _objectsViewportBounds; - private CultMeshReactiveDocument _objectsViewport; + private AetheriaUnityRtsViewportDocuments _zonePresentationDocuments; public Dictionary WormholeInstances = new Dictionary(); private List _loot = new List(); @@ -1204,8 +1201,7 @@ public class ZoneRenderer : MonoBehaviour try { return AetheriaUnityRuntimeClientProvider - .RuntimeState("unity-zone-renderer") - .CurrentCatalog(); + .CurrentCatalog("unity-zone-renderer"); } catch (Exception ex) { @@ -1217,65 +1213,47 @@ public class ZoneRenderer : MonoBehaviour private AetheriaRuntimeZoneContactsDocument ResolveZoneContacts() { - if (_zoneContacts != null) - return _zoneContacts.Current; + if (_zonePresentationDocuments != null) + return _zonePresentationDocuments.CurrentContacts; try { - _zoneContacts = AetheriaUnityRuntimeClientProvider - .ReactiveZoneContacts("unity-zone-renderer"); + _zonePresentationDocuments = AetheriaUnityRuntimeClientProvider + .ZonePresentationDocuments(ToViewportBounds(ResolveDaemonRenderViewport()), "unity-zone-renderer"); } catch (Exception ex) { Debug.LogWarning($"Failed to bind Aetheria zone contacts for renderer target distances: {ex.Message}"); } - return _zoneContacts?.Current; + return _zonePresentationDocuments?.CurrentContacts; } private AetheriaRuntimeObjectsViewportDocument ResolveObjectsViewport(AetheriaRuntimeXzRect viewport) { var viewportBounds = ToViewportBounds(viewport); - if (_objectsViewport != null && SameViewport(_objectsViewportBounds, viewportBounds)) - return _objectsViewport.Current; + if (_zonePresentationDocuments != null && _zonePresentationDocuments.Matches(viewportBounds)) + return _zonePresentationDocuments.CurrentObjectsViewport; try { - var nextObjectsViewport = AetheriaUnityRuntimeClientProvider - .ReactiveObjectsViewport( - viewportBounds, - "unity-zone-renderer"); - _objectsViewport?.Dispose(); - _objectsViewportBounds = viewportBounds; - _objectsViewport = nextObjectsViewport; + var nextDocuments = AetheriaUnityRuntimeClientProvider + .ZonePresentationDocuments(viewportBounds, "unity-zone-renderer"); + _zonePresentationDocuments?.Dispose(); + _zonePresentationDocuments = nextDocuments; } catch (Exception ex) { Debug.LogWarning($"Failed to bind Aetheria objects viewport for zone renderer presentation: {ex.Message}"); } - return _objectsViewport?.Current; + return _zonePresentationDocuments?.CurrentObjectsViewport; } private void ClearClientCaches() { - _zoneContacts?.Dispose(); - _objectsViewport?.Dispose(); - _zoneContacts = null; - _objectsViewport = null; - } - - private static bool SameViewport( - AetheriaRuntimeRtsViewportBounds left, - AetheriaRuntimeRtsViewportBounds right) - { - if (left == null || right == null) - return false; - - return Mathf.Approximately(left.MinX, right.MinX) && - Mathf.Approximately(left.MinY, right.MinY) && - Mathf.Approximately(left.MaxX, right.MaxX) && - Mathf.Approximately(left.MaxY, right.MaxY); + _zonePresentationDocuments?.Dispose(); + _zonePresentationDocuments = null; } }