Narrow observed daemon state to render view

This commit is contained in:
Meta Vens 2026-06-29 03:01:55 +01:00
commit 4487f894bf
9 changed files with 90 additions and 85 deletions

View file

@ -3300,7 +3300,7 @@ static void RequireEveRuntimeBootstrap(string root)
string.Join(", ", missingDaemonSurfaceCommandSymbols));
}
if (daemonSurfaceCommands.Contains("AetheriaRuntimeStateReader.TryReadObservedDaemonState", StringComparison.Ordinal) ||
if (daemonSurfaceCommands.Contains("AetheriaRuntimeStateReader.TryReadDaemonRenderView", StringComparison.Ordinal) ||
daemonSurfaceCommands.Contains("client.State.ReactiveDaemonFrame()", StringComparison.Ordinal) ||
daemonSurfaceCommands.Contains("TryReactiveDaemonSoaView(client)", StringComparison.Ordinal) ||
daemonSurfaceCommands.Contains("client.State.ReactiveZoneRender()", StringComparison.Ordinal) ||
@ -8133,7 +8133,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
"Packages",
"org.gamecult.aetheria.state",
"Runtime",
"AetheriaRuntimeObservedDaemonState.cs");
"AetheriaRuntimeDaemonRenderView.cs");
var daemonRuntimeDocumentTestsPath = Path.Combine(
root,
"Assets",
@ -8442,7 +8442,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
var observedDaemonState = File.ReadAllText(observedDaemonStatePath);
if (!observedDaemonState.Contains("public static bool TryCreateCurrent(", StringComparison.Ordinal) ||
!observedDaemonState.Contains("new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender)", StringComparison.Ordinal))
!observedDaemonState.Contains("new AetheriaRuntimeDaemonRenderView(currentFrame, currentSoaView, currentZoneRender)", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"Observed daemon state must compose current values from managed typed frame, SoA, and zone-render documents.");
@ -8502,7 +8502,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
".State.Starbridge.PlayerSeat(",
".State.DockingState.Latest(",
".State.DockingState.Reactive(",
"AetheriaRuntimeObservedDaemonState.ReadAsync(",
"AetheriaRuntimeDaemonRenderView.ReadAsync(",
".State.Daemon.LatestFrame.LatestAsync()",
".State.Daemon.LatestSoaView.LatestAsync()",
".State.Daemon.AuthorityPolicy.LatestAsync()",
@ -12049,7 +12049,7 @@ static void RequireAetheriaRuntimeVerseClientContract(string root)
"AetheriaRuntimeVerseClient still exposes daemon observation compatibility helpers; use AetheriaClient managed documents instead.");
}
if (stateRefResolver.Contains("TryReadObservedDaemonState", StringComparison.Ordinal) ||
if (stateRefResolver.Contains("TryReadDaemonRenderView", StringComparison.Ordinal) ||
stateRefResolver.Contains("TryReadDaemonSoaView(", StringComparison.Ordinal) ||
stateRefResolver.Contains("ResolveEveSurfaceStateRef(", StringComparison.Ordinal) ||
stateRefResolver.Contains("TryResolveEveSurfaceStateRef(", StringComparison.Ordinal) ||
@ -13141,7 +13141,7 @@ static void RequireMainMenuContinueRunState(string root)
{
"public sealed class AetheriaUnityObservedFrameApplier",
"public bool ApplyLatestZoneRender()",
"observer.LastObservedState?.ZoneRender",
"observer.LastRenderView?.ZoneRender",
"private bool TryRestoreEntityGraphFromZoneRender(",
"if (string.IsNullOrWhiteSpace(render.RunId))",
"Aetheria zone-render feed does not identify a run id.",
@ -14060,7 +14060,7 @@ static void RequireUnityObserverDoesNotTickLocalSimulation(string root)
{
"public sealed class AetheriaUnityObservedFrameApplier",
"public bool ApplyLatestZoneRender()",
"observer.LastObservedState?.ZoneRender",
"observer.LastRenderView?.ZoneRender",
"private bool TryRestoreEntityGraphFromZoneRender(",
"AetheriaRuntimeEntitySnapshotProjector.CreateSnapshots(runId, render.ZoneIndex, render.EntitySnapshots)",
".OrderBy(entity => entity.EntityIndex)",
@ -15714,7 +15714,7 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
"Shared runtime state-ref resolver still exposes file-backed entity snapshot reads; use daemon zone-render EntitySnapshots documents.");
}
if (runtimeStateRefResolver.Contains("TryReadObservedDaemonState", StringComparison.Ordinal) ||
if (runtimeStateRefResolver.Contains("TryReadDaemonRenderView", StringComparison.Ordinal) ||
runtimeStateRefResolver.Contains("TryReadDaemonSoaView(", StringComparison.Ordinal) ||
runtimeStateRefResolver.Contains("TryReadDaemonFrame(", StringComparison.Ordinal) ||
runtimeStateRefResolver.Contains("ResolveEveSurfaceStateRef(", StringComparison.Ordinal) ||
@ -15885,10 +15885,10 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
var aetheriaClientState = File.Exists(aetheriaClientStatePath)
? File.ReadAllText(aetheriaClientStatePath)
: throw new InvalidOperationException("Cannot verify daemon state acquisition; AetheriaClientState.cs is missing.");
var observedDaemonStatePath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeObservedDaemonState.cs");
var observedDaemonStatePath = Path.Combine(root, "Packages", "org.gamecult.aetheria.state", "Runtime", "AetheriaRuntimeDaemonRenderView.cs");
var observedDaemonState = File.Exists(observedDaemonStatePath)
? File.ReadAllText(observedDaemonStatePath)
: throw new InvalidOperationException("Cannot verify daemon state acquisition; AetheriaRuntimeObservedDaemonState.cs is missing.");
: throw new InvalidOperationException("Cannot verify daemon state acquisition; AetheriaRuntimeDaemonRenderView.cs is missing.");
var daemonRuntimeDocumentTestsPath = Path.Combine(root, "Assets", "Scripts", "Tests", "DaemonRuntimeDocumentTests.cs");
var daemonRuntimeDocumentTests = File.Exists(daemonRuntimeDocumentTestsPath)
? File.ReadAllText(daemonRuntimeDocumentTestsPath)
@ -16040,15 +16040,15 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
if (!observedFrameApplier.Contains("private AetheriaRuntimeZoneRenderDocument _lastZoneRender;", StringComparison.Ordinal) ||
!observedFrameApplier.Contains("ApplyLatestZoneRender()", StringComparison.Ordinal) ||
!observedFrameApplier.Contains("observer.LastObservedState?.ZoneRender", StringComparison.Ordinal) ||
!observedFrameApplier.Contains("observer.LastRenderView?.ZoneRender", StringComparison.Ordinal) ||
!observedDaemonState.Contains("public AetheriaRuntimeZoneRenderDocument ZoneRender { get; }", StringComparison.Ordinal) ||
!observedDaemonState.Contains("CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender", StringComparison.Ordinal) ||
!observedDaemonState.Contains("var currentZoneRender = zoneRender?.Current;", StringComparison.Ordinal) ||
!observedDaemonState.Contains("new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender)", StringComparison.Ordinal) ||
!observedDaemonState.Contains("new AetheriaRuntimeDaemonRenderView(currentFrame, currentSoaView, currentZoneRender)", StringComparison.Ordinal) ||
!daemonObserver.Contains("private CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> _daemonFrame;", StringComparison.Ordinal) ||
!daemonObserver.Contains("private CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument> _daemonSoaView;", StringComparison.Ordinal) ||
!daemonObserver.Contains("private CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> _zoneRender;", StringComparison.Ordinal) ||
!daemonObserver.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(", StringComparison.Ordinal))
!daemonObserver.Contains("AetheriaRuntimeDaemonRenderView.TryCreateCurrent(", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"Observed zone-render state acquisition must sample managed typed zone-render documents directly.");
@ -16122,8 +16122,8 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
aetheriaClient.Contains("State.CurrentObservedDaemon()", StringComparison.Ordinal) ||
aetheriaClient.Contains("State.ReactiveObservedDaemon()", StringComparison.Ordinal) ||
aetheriaClient.Contains("Aetheria() => State", StringComparison.Ordinal) ||
aetheriaClient.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(", StringComparison.Ordinal) ||
aetheriaClient.Contains("AetheriaRuntimeObservedDaemonState?", StringComparison.Ordinal) ||
aetheriaClient.Contains("AetheriaRuntimeDaemonRenderView.TryCreateCurrent(", StringComparison.Ordinal) ||
aetheriaClient.Contains("AetheriaRuntimeDaemonRenderView?", StringComparison.Ordinal) ||
aetheriaClient.Contains("observedState.TryCurrent(out var current)", StringComparison.Ordinal))
{
throw new InvalidOperationException(
@ -16160,8 +16160,8 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
"AetheriaClientState still exposes generic latest/reactive/watch or schema-string shortcuts instead of direct typed CultMesh document handles.");
}
if (aetheriaClientState.Contains("public AetheriaRuntimeObservedDaemonState? CurrentObservedDaemon(", StringComparison.Ordinal) ||
aetheriaClientState.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(frame, soaView, zoneRender", StringComparison.Ordinal))
if (aetheriaClientState.Contains("public AetheriaRuntimeDaemonRenderView? CurrentObservedDaemon(", StringComparison.Ordinal) ||
aetheriaClientState.Contains("AetheriaRuntimeDaemonRenderView.TryCreateCurrent(frame, soaView, zoneRender", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"AetheriaClientState must not expose one-shot observed daemon aggregation; command owners should hold managed typed daemon documents.");
@ -16185,11 +16185,11 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
string.Join(", ", missingManagedCommandFrameSymbols));
}
if (!daemonRuntimeDocumentTests.Contains("ManagedStateSamplesCurrentObservedDaemonFromReactiveDocuments()", StringComparison.Ordinal) ||
if (!daemonRuntimeDocumentTests.Contains("ManagedStateSamplesCurrentDaemonRenderViewFromReactiveDocuments()", StringComparison.Ordinal) ||
!daemonRuntimeDocumentTests.Contains("using var observedFrame = client.State.Document<AetheriaRuntimeDaemonFrameDocument>().Reactive();", StringComparison.Ordinal) ||
!daemonRuntimeDocumentTests.Contains("using var observedSoaView = client.State.Document<AetheriaRuntimeDaemonSoaViewDocument>().Reactive();", StringComparison.Ordinal) ||
!daemonRuntimeDocumentTests.Contains("using var observedZoneRender = client.State.Document<AetheriaRuntimeZoneRenderDocument>().Reactive();", StringComparison.Ordinal) ||
!daemonRuntimeDocumentTests.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(", StringComparison.Ordinal) ||
!daemonRuntimeDocumentTests.Contains("AetheriaRuntimeDaemonRenderView.TryCreateCurrent(", StringComparison.Ordinal) ||
daemonRuntimeDocumentTests.Contains("client.State.CurrentObservedDaemon()", StringComparison.Ordinal))
{
throw new InvalidOperationException(
@ -16205,7 +16205,7 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
"CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender",
"var currentFrame = frame?.Current;",
"var currentZoneRender = zoneRender?.Current;",
"new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender)"
"new AetheriaRuntimeDaemonRenderView(currentFrame, currentSoaView, currentZoneRender)"
};
var missingObservedDaemonStateSymbols = requiredObservedDaemonStateSymbols
.Where(symbol => !observedDaemonState.Contains(symbol, StringComparison.Ordinal))
@ -16289,14 +16289,14 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
"SoaViewStore.GetViewPath",
"state.LatestFrame.ReactiveAsync",
"state.LatestSoaView.ReactiveAsync",
"public static async Task<AetheriaRuntimeObservedDaemonState?> ReadAsync(",
"public static async Task<AetheriaRuntimeDaemonRenderView?> ReadAsync(",
"LatestObservedDaemonAsync(",
"LatestObservedDaemon()",
"public sealed class AetheriaRuntimeReactiveObservedDaemonState",
"ReactiveObservedDaemonAsync",
"ReactiveObservedDaemon(",
"TryCurrent(out AetheriaRuntimeObservedDaemonState? observed)",
"return new AetheriaRuntimeObservedDaemonState(frame, soaView);",
"TryCurrent(out AetheriaRuntimeDaemonRenderView? observed)",
"return new AetheriaRuntimeDaemonRenderView(frame, soaView);",
"AetheriaRuntimeRtsProjection.ProjectZoneRender(Frame)",
"zoneRender = null"
};
@ -16327,7 +16327,7 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
"public async Task<AetheriaRuntimePlayerSettingsSnapshot?> PlayerSettingsAsync()",
"public async Task<AetheriaRuntimeVerseHostSettingsSnapshot?> VerseHostSettingsAsync()",
"public async Task<System.Collections.Generic.IReadOnlyList<AetheriaRuntimeLoadoutTemplateSnapshot>> LoadoutTemplatesAsync()",
"public async Task<AetheriaRuntimeObservedDaemonState?> ObserveAsync()",
"public async Task<AetheriaRuntimeDaemonRenderView?> ObserveAsync()",
"public async Task<AetheriaRuntimeLoadoutTemplateCommit> LoadoutTemplateAsync(",
"scenario ??= await _verse.GetStarbridgeScenarioAsync()",
"session ??= await _verse.GetStarbridgeSessionAsync()",
@ -16406,28 +16406,28 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
if (!daemonObserver.Contains("AetheriaClient", StringComparison.Ordinal) ||
!daemonObserver.Contains("AetheriaUnityRuntimeClientProvider.ResolveClient(", StringComparison.Ordinal) ||
!daemonObserver.Contains("AetheriaRuntimeStateBoot.Inspect(AetheriaUnityRuntimePaths.GameDataDirectory)", StringComparison.Ordinal) ||
!daemonObserver.Contains("AetheriaRuntimeObservedDaemonState", StringComparison.Ordinal) ||
!daemonObserver.Contains("AetheriaRuntimeDaemonRenderView", StringComparison.Ordinal) ||
!daemonObserver.Contains("CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> _daemonFrame", StringComparison.Ordinal) ||
!daemonObserver.Contains("CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument> _daemonSoaView", StringComparison.Ordinal) ||
!daemonObserver.Contains("CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> _zoneRender", StringComparison.Ordinal) ||
!daemonObserver.Contains("_daemonFrame ??= state.Document<AetheriaRuntimeDaemonFrameDocument>().Reactive();", StringComparison.Ordinal) ||
!daemonObserver.Contains("_daemonSoaView ??= TryReactive<AetheriaRuntimeDaemonSoaViewDocument>(state);", StringComparison.Ordinal) ||
!daemonObserver.Contains("_zoneRender ??= state.Document<AetheriaRuntimeZoneRenderDocument>().Reactive();", StringComparison.Ordinal) ||
!daemonObserver.Contains("AetheriaRuntimeObservedDaemonState.TryCreateCurrent(", StringComparison.Ordinal) ||
!daemonObserver.Contains("DisposeObservedDaemonDocuments()", StringComparison.Ordinal))
!daemonObserver.Contains("AetheriaRuntimeDaemonRenderView.TryCreateCurrent(", StringComparison.Ordinal) ||
!daemonObserver.Contains("DisposeRenderViewDocuments()", StringComparison.Ordinal))
{
throw new InvalidOperationException(
"AetheriaDaemonObserver must sample observed daemon state through direct managed reactive daemon documents.");
"AetheriaDaemonObserver must sample daemon render views through direct managed reactive daemon documents.");
}
if (daemonObserver.Contains("AetheriaRuntimeStateReader.TryReadObservedDaemonState", StringComparison.Ordinal) ||
if (daemonObserver.Contains("AetheriaRuntimeStateReader.TryReadDaemonRenderView", StringComparison.Ordinal) ||
daemonObserver.Contains(".ReadAsync(client.State)", StringComparison.Ordinal) ||
daemonObserver.Contains("AetheriaRuntimeReactiveObservedDaemonState", StringComparison.Ordinal) ||
daemonObserver.Contains(".ReactiveObservedDaemon()", StringComparison.Ordinal) ||
daemonObserver.Contains("reactive.TryCurrent(out var observed)", StringComparison.Ordinal) ||
daemonObserver.Contains("AetheriaRuntimeObservedDaemonSession", StringComparison.Ordinal) ||
daemonObserver.Contains(".ObserveDaemon()", StringComparison.Ordinal) ||
daemonObserver.Contains("return new AetheriaRuntimeObservedDaemonState(frame, soaView, zoneRender);", StringComparison.Ordinal) ||
daemonObserver.Contains("return new AetheriaRuntimeDaemonRenderView(frame, soaView, zoneRender);", StringComparison.Ordinal) ||
daemonObserver.Contains("DisposeObservedDaemonSession()", StringComparison.Ordinal) ||
daemonObserver.Contains("DisposeReactiveObservedDaemonDocuments()", StringComparison.Ordinal))
{

View file

@ -64,7 +64,7 @@ public class ActionGameManager : MonoBehaviour
SetCurrentEntity = entity => CurrentEntity = entity,
GetViewDirection = () => _viewDirection,
SetViewDirection = direction => _viewDirection = direction,
ResolveZoneRender = () => ResolveDaemonObserver()?.LastObservedState?.ZoneRender,
ResolveZoneRender = () => ResolveDaemonObserver()?.LastRenderView?.ZoneRender,
ApplyActionBarBindings = _ => _actionBarPresentation?.ApplyLocalBindings(),
EnablePlayerInput = EnablePlayerInput,
DisablePlayerInput = DisablePlayerInput,

View file

@ -25,21 +25,21 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
private CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument> _daemonSoaView;
private CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> _zoneRender;
public AetheriaRuntimeObservedDaemonState LastObservedState { get; private set; }
public AetheriaRuntimeDaemonRenderView LastRenderView { get; private set; }
public AetheriaRuntimeDaemonObservationResult LastObservation { get; private set; }
public long LastFrameId => _cursor.LastFrameId;
public long LastSoaGeneration => _cursor.LastSoaGeneration;
public bool HasAuthoritativeState => LastObservedState != null && LastObservedState.IsAuthoritative;
public bool HasSoaView => LastObservedState != null && LastObservedState.HasSoaView;
public bool HasAuthoritativeState => LastRenderView != null && LastRenderView.IsAuthoritative;
public bool HasSoaView => LastRenderView != null && LastRenderView.HasSoaView;
public AetheriaRuntimeDaemonSoaViewIndex LastSoaIndex =>
LastObservedState?.SoaIndex ?? AetheriaRuntimeDaemonSoaViewIndex.Empty;
LastRenderView?.SoaIndex ?? AetheriaRuntimeDaemonSoaViewIndex.Empty;
public AetheriaDaemonSoaMemoryMap LastSoaMemoryMap => _soaMemoryMap;
public AetheriaDaemonRenderNativeView LastRenderNativeView => _renderNativeView;
public bool HasRenderNativeView => _renderNativeView.IsCreated;
public AetheriaClient Client => ResolveClient();
public AetheriaControl Control => Client.Control;
public event Action<AetheriaRuntimeObservedDaemonState, AetheriaRuntimeDaemonObservationResult> ObservedDaemonStateChanged;
public event Action<AetheriaRuntimeDaemonRenderView, AetheriaRuntimeDaemonObservationResult> DaemonRenderViewChanged;
private void Update()
{
@ -54,7 +54,7 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
public bool Poll()
{
var observed = ReadObservedDaemonState();
var observed = ReadDaemonRenderView();
if (observed == null)
{
LastObservation = _cursor.Observe(null);
@ -62,7 +62,7 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
}
var result = _cursor.Observe(observed);
LastObservedState = observed;
LastRenderView = observed;
LastObservation = result;
if (result.SoaViewChanged)
@ -72,7 +72,7 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
if (result.Changed)
{
ObservedDaemonStateChanged?.Invoke(observed, result);
DaemonRenderViewChanged?.Invoke(observed, result);
if (logChanges)
{
Debug.Log(
@ -87,24 +87,24 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
public void ResetObservation()
{
_cursor.Reset();
DisposeObservedDaemonDocuments();
DisposeRenderViewDocuments();
DisposeSoaMemoryMap();
LastObservedState = null;
LastRenderView = null;
LastObservation = null;
}
private void OnDisable()
{
DisposeObservedDaemonDocuments();
DisposeRenderViewDocuments();
DisposeSoaMemoryMap();
}
private AetheriaRuntimeObservedDaemonState ReadObservedDaemonState()
private AetheriaRuntimeDaemonRenderView ReadDaemonRenderView()
{
try
{
EnsureObservedDaemonDocuments();
return AetheriaRuntimeObservedDaemonState.TryCreateCurrent(
EnsureRenderViewDocuments();
return AetheriaRuntimeDaemonRenderView.TryCreateCurrent(
_daemonFrame,
_daemonSoaView,
_zoneRender,
@ -118,7 +118,7 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
}
}
private void EnsureObservedDaemonDocuments()
private void EnsureRenderViewDocuments()
{
if (_daemonFrame != null && _daemonSoaView != null && _zoneRender != null)
{
@ -162,7 +162,7 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
return AetheriaUnityRuntimeClientProvider.ResolveClient(stateBoot, clientId);
}
private void RemapSoaView(AetheriaRuntimeObservedDaemonState observed)
private void RemapSoaView(AetheriaRuntimeDaemonRenderView observed)
{
DisposeSoaMemoryMap();
if (observed == null || !observed.HasSoaView)
@ -198,7 +198,7 @@ public sealed class AetheriaDaemonObserver : MonoBehaviour
_soaMemoryMap = null;
}
private void DisposeObservedDaemonDocuments()
private void DisposeRenderViewDocuments()
{
_daemonFrame?.Dispose();
_daemonFrame = null;

View file

@ -60,7 +60,7 @@ public sealed class AetheriaUnityObservedFrameApplier
return false;
}
var render = observer.LastObservedState?.ZoneRender;
var render = observer.LastRenderView?.ZoneRender;
if (render == null)
{
return false;

View file

@ -206,7 +206,7 @@ public class DaemonRuntimeDocumentTests
using var catalogReactive = client.State.Document<AetheriaRuntimeCatalogSnapshot>().Reactive();
using var daemonFrameReactive = client.State.Document<AetheriaRuntimeDaemonFrameDocument>().Reactive();
using var daemonSoaViewReactive = client.State.Document<AetheriaRuntimeDaemonSoaViewDocument>().Reactive();
Assert.IsTrue(AetheriaRuntimeObservedDaemonState.TryCreateCurrent(
Assert.IsTrue(AetheriaRuntimeDaemonRenderView.TryCreateCurrent(
daemonFrameReactive,
daemonSoaViewReactive,
zoneRenderReactive,
@ -2151,11 +2151,11 @@ public class DaemonRuntimeDocumentTests
}
[Test]
public void ObservedDaemonStateReadsManagedFrameAndSoaDocuments()
public void DaemonRenderViewReadsManagedFrameAndSoaDocuments()
{
var statePath = Path.Combine(
Path.GetTempPath(),
"aetheria-observed-daemon-state-tests",
"aetheria-daemon-render-view-tests",
Path.GetRandomFileName(),
"state.cc");
var frame = AetheriaRuntimeDaemonFrameDocument.Create(
@ -2211,7 +2211,7 @@ public class DaemonRuntimeDocumentTests
using var observedFrame = client.State.Document<AetheriaRuntimeDaemonFrameDocument>().Reactive();
using var observedSoaView = client.State.Document<AetheriaRuntimeDaemonSoaViewDocument>().Reactive();
using var observedZoneRender = client.State.Document<AetheriaRuntimeZoneRenderDocument>().Reactive();
Assert.IsTrue(AetheriaRuntimeObservedDaemonState.TryCreateCurrent(
Assert.IsTrue(AetheriaRuntimeDaemonRenderView.TryCreateCurrent(
observedFrame,
observedSoaView,
observedZoneRender,
@ -2232,7 +2232,7 @@ public class DaemonRuntimeDocumentTests
}
[Test]
public void ManagedStateSamplesCurrentObservedDaemonFromReactiveDocuments()
public void ManagedStateSamplesCurrentDaemonRenderViewFromReactiveDocuments()
{
var statePath = Path.Combine(
Path.GetTempPath(),
@ -2269,7 +2269,7 @@ public class DaemonRuntimeDocumentTests
using var observedFrame = client.State.Document<AetheriaRuntimeDaemonFrameDocument>().Reactive();
using var observedSoaView = client.State.Document<AetheriaRuntimeDaemonSoaViewDocument>().Reactive();
using var observedZoneRender = client.State.Document<AetheriaRuntimeZoneRenderDocument>().Reactive();
var observed = AetheriaRuntimeObservedDaemonState.TryCreateCurrent(
var observed = AetheriaRuntimeDaemonRenderView.TryCreateCurrent(
observedFrame,
observedSoaView,
observedZoneRender,
@ -2287,11 +2287,11 @@ public class DaemonRuntimeDocumentTests
}
[Test]
public void ObservedDaemonStateReadsManagedFrameWithoutSoaDocument()
public void DaemonRenderViewReadsManagedFrameWithoutSoaDocument()
{
var statePath = Path.Combine(
Path.GetTempPath(),
"aetheria-observed-daemon-frame-only-tests",
"aetheria-daemon-render-view-frame-only-tests",
Path.GetRandomFileName(),
"state.cc");
var frame = AetheriaRuntimeDaemonFrameDocument.Create(
@ -2316,7 +2316,7 @@ public class DaemonRuntimeDocumentTests
using var observedFrame = client.State.Document<AetheriaRuntimeDaemonFrameDocument>().Reactive();
using var observedSoaView = client.State.Document<AetheriaRuntimeDaemonSoaViewDocument>().Reactive();
using var observedZoneRender = client.State.Document<AetheriaRuntimeZoneRenderDocument>().Reactive();
Assert.IsTrue(AetheriaRuntimeObservedDaemonState.TryCreateCurrent(
Assert.IsTrue(AetheriaRuntimeDaemonRenderView.TryCreateCurrent(
observedFrame,
observedSoaView,
observedZoneRender,
@ -2339,12 +2339,12 @@ public class DaemonRuntimeDocumentTests
public void ObservationCursorTracksFrameAndSoaGenerationChanges()
{
var cursor = new AetheriaRuntimeDaemonObservationCursor();
var observed = ObservedState(frameId: 10, soaGeneration: 20);
var observed = RenderView(frameId: 10, soaGeneration: 20);
var first = cursor.Observe(observed);
var second = cursor.Observe(observed);
var third = cursor.Observe(ObservedState(frameId: 11, soaGeneration: 20));
var fourth = cursor.Observe(ObservedState(frameId: 11, soaGeneration: 21));
var third = cursor.Observe(RenderView(frameId: 11, soaGeneration: 20));
var fourth = cursor.Observe(RenderView(frameId: 11, soaGeneration: 21));
Assert.IsTrue(first.Observed);
Assert.IsTrue(first.FrameChanged);
@ -2365,7 +2365,7 @@ public class DaemonRuntimeDocumentTests
{
var cursor = new AetheriaRuntimeDaemonObservationCursor();
cursor.Observe(ObservedState(frameId: 12, soaGeneration: 22));
cursor.Observe(RenderView(frameId: 12, soaGeneration: 22));
cursor.Reset();
var missing = cursor.Observe(null);
@ -2376,19 +2376,19 @@ public class DaemonRuntimeDocumentTests
}
[Test]
public void CommandClientSendsCommandAgainstObservedDaemonFrame()
public void CommandClientSendsCommandAgainstDaemonFrameDocument()
{
var statePath = Path.Combine(
Path.GetTempPath(),
"aetheria-daemon-command-client-tests",
Path.GetRandomFileName(),
"state.cc");
var observed = ObservedState(frameId: 33, soaGeneration: 44);
observed.Frame.SessionId = "session-command-client";
observed.Frame.Run.CurrentEntityKey = "entity:player";
var frame = DaemonFrame(frameId: 33);
frame.SessionId = "session-command-client";
frame.Run.CurrentEntityKey = "entity:player";
var client = new AetheriaRuntimeDaemonOperationClient(statePath, "unity-test", "unobserved-session");
var envelope = client.FireWeaponGroup(observed, 2);
var envelope = client.FireWeaponGroup(frame, 2);
Assert.AreEqual(AetheriaRuntimeDaemonCommandKinds.FireWeaponGroup, envelope.Kind);
Assert.AreEqual("unity-test", envelope.ClientId);
@ -2406,10 +2406,10 @@ public class DaemonRuntimeDocumentTests
"aetheria-daemon-command-client-tests",
Path.GetRandomFileName(),
"state.cc");
var observed = ObservedState(frameId: 34, soaGeneration: 45);
var frame = DaemonFrame(frameId: 34);
var client = new AetheriaRuntimeDaemonOperationClient(statePath, "", "session-default-client");
var envelope = client.SensorPing(observed);
var envelope = client.SensorPing(frame);
Assert.AreEqual(AetheriaRuntimeDaemonOperationClient.DefaultClientId, envelope.ClientId);
Assert.AreEqual(AetheriaRuntimeDaemonCommandKinds.SensorPing, envelope.Kind);
@ -4058,7 +4058,7 @@ public class DaemonRuntimeDocumentTests
}
[Test]
public void CommandClientCanSendWithoutObservedState()
public void CommandClientCanSendWithoutRenderView()
{
var statePath = Path.Combine(
Path.GetTempPath(),
@ -4271,15 +4271,9 @@ public class DaemonRuntimeDocumentTests
return null;
}
private static AetheriaRuntimeObservedDaemonState ObservedState(long frameId, long soaGeneration)
private static AetheriaRuntimeDaemonRenderView RenderView(long frameId, long soaGeneration)
{
var frame = AetheriaRuntimeDaemonFrameDocument.Create(
new AetheriaRuntimeRunCheckpointCommit { RunId = "cursor-run" },
"daemon",
"session",
frameId,
0,
0.02);
var frame = DaemonFrame(frameId);
var soaView = AetheriaRuntimeDaemonSoaViewDocument.Create(
"daemon",
"session",
@ -4293,12 +4287,23 @@ public class DaemonRuntimeDocumentTests
FrameId = frame.FrameId
};
return new AetheriaRuntimeObservedDaemonState(
return new AetheriaRuntimeDaemonRenderView(
frame,
soaView,
zoneRender);
}
private static AetheriaRuntimeDaemonFrameDocument DaemonFrame(long frameId)
{
return AetheriaRuntimeDaemonFrameDocument.Create(
new AetheriaRuntimeRunCheckpointCommit { RunId = "cursor-run" },
"daemon",
"session",
frameId,
0,
0.02);
}
private static void PublishLatestFrameThroughVerseClient(
string statePath,
AetheriaRuntimeDaemonFrameDocument frame)

View file

@ -47,7 +47,6 @@
<Analyzer Include="C:\Program Files\Unity\Hub\Editor\6000.4.2f1\Editor\Data\Tools\BuildPipeline\Unity.SourceGenerators\Unity.UIToolkit.SourceGenerator.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeObservedDaemonState.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeAssemblyInfo.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeEquippedItemDetailsSurfaceBuilder.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeLoadoutSnapshotProjector.cs" />
@ -71,6 +70,7 @@
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeStateBoot.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeVerseHostCommands.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeDaemonSurfaceCommands.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeDaemonRenderView.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimePlayerSettingsCommands.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaControl.cs" />
<Compile Include="Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeDaemonStateRefs.cs" />

View file

@ -38,7 +38,7 @@ namespace GameCult.Aetheria.State.Verse
public string LastDaemonId { get; private set; } = "";
public string LastSessionId { get; private set; } = "";
public AetheriaRuntimeDaemonObservationResult Observe(AetheriaRuntimeObservedDaemonState? observed)
public AetheriaRuntimeDaemonObservationResult Observe(AetheriaRuntimeDaemonRenderView? observed)
{
if (observed == null)
{

View file

@ -5,9 +5,9 @@ using GameCult.Mesh;
namespace GameCult.Aetheria.State.Verse
{
public sealed class AetheriaRuntimeObservedDaemonState
public sealed class AetheriaRuntimeDaemonRenderView
{
public AetheriaRuntimeObservedDaemonState(
public AetheriaRuntimeDaemonRenderView(
AetheriaRuntimeDaemonFrameDocument frame,
AetheriaRuntimeDaemonSoaViewDocument? soaView,
AetheriaRuntimeZoneRenderDocument zoneRender)
@ -30,7 +30,7 @@ namespace GameCult.Aetheria.State.Verse
CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument> frame,
CultMeshReactiveDocument<AetheriaRuntimeDaemonSoaViewDocument>? soaView,
CultMeshReactiveDocument<AetheriaRuntimeZoneRenderDocument> zoneRender,
out AetheriaRuntimeObservedDaemonState? observed)
out AetheriaRuntimeDaemonRenderView? observed)
{
observed = null;
try
@ -47,7 +47,7 @@ namespace GameCult.Aetheria.State.Verse
currentSoaView = null;
}
observed = new AetheriaRuntimeObservedDaemonState(currentFrame, currentSoaView, currentZoneRender);
observed = new AetheriaRuntimeDaemonRenderView(currentFrame, currentSoaView, currentZoneRender);
return true;
}
catch