Use reactive documents for viewport rendering

This commit is contained in:
Meta Vens 2026-06-28 23:06:15 +01:00
commit 25744df4a1
4 changed files with 65 additions and 30 deletions

View file

@ -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<AetheriaRuntimeRtsViewportObject>())",
"_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<AetheriaRuntimeObjectsViewportDocument> _objectsViewport",
"CultMeshReactiveDocument<AetheriaRuntimeRenderSplatsViewportDocument> _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<AetheriaRuntimeObjectsViewportDocument> _objectsViewport",
"CultMeshReactiveDocument<AetheriaRuntimeRenderSplatsViewportDocument> _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<AetheriaRuntimeRenderSplatsViewportDocument> _renderSplatsViewport",
".ReactiveRenderSplats(viewport)",
"_renderSplatsViewport?.Current",
"ClearViewportDocument()"
};
@ -8017,13 +8033,22 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root)
string.Join(", ", missingRenderSplatViewportSourceSymbols));
}
if (renderSplatViewportSource.Contains("CultMeshReactiveDocument<AetheriaRuntimeRenderSplatsViewportDocument> _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<AetheriaRuntimeObjectsViewportDocument> _objectsViewport",
".ReactiveObjects(viewportBounds)",
"_objectsViewport?.Current",
"_objectsViewport?.Dispose()"
};
@ -8048,13 +8073,22 @@ static void RequireUnityViewportAndMapReadsUseManagedAccessors(string root)
string.Join(", ", missingZoneRendererViewportSymbols));
}
if (zoneRenderer.Contains("CultMeshReactiveDocument<AetheriaRuntimeObjectsViewportDocument> _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) ||

View file

@ -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<AetheriaRuntimeRenderSplatsViewportDocument> _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;

View file

@ -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<AetheriaRuntimeObjectsViewportDocument> _objectsViewport;
private CultMeshReactiveDocument<AetheriaRuntimeRenderSplatsViewportDocument> _renderSplatsViewport;
private float _nextViewportRefreshTime;
private readonly List<RawImage> _rtsIconPool = new List<RawImage>();
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)

View file

@ -123,7 +123,7 @@ public class ZoneRenderer : MonoBehaviour
private CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot> _catalog;
private CultMeshReactiveDocument<AetheriaRuntimeZoneContactsDocument> _zoneContacts;
private AetheriaRuntimeRtsViewportBounds _objectsViewportBounds;
private AetheriaRuntimeObjectsViewportSession _objectsViewport;
private CultMeshReactiveDocument<AetheriaRuntimeObjectsViewportDocument> _objectsViewport;
public Dictionary<int, (GameObject gravity, CompassIcon icon)> WormholeInstances = new Dictionary<int, (GameObject, CompassIcon)>();
private List<ItemPickup> _loot = new List<ItemPickup>();
@ -1246,7 +1246,7 @@ public class ZoneRenderer : MonoBehaviour
var nextObjectsViewport = ResolveClient()
.State
.Viewports
.ObserveObjects(viewportBounds);
.ReactiveObjects(viewportBounds);
_objectsViewport?.Dispose();
_objectsViewportBounds = viewportBounds;
_objectsViewport = nextObjectsViewport;