From aad0710444f166d352deea70c377a3e19ee891dd Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 21:52:45 +0100 Subject: [PATCH] Route Aetheria Unity scene through Eve live transport --- .../Tests/DaemonRuntimeDocumentTests.cs | 13 +++-- .../AetheriaEveUnitySceneProviderBridge.cs | 45 +++++++++++++++++ .../AetheriaEveUnitySceneProviderComponent.cs | 49 ++++++++++++++++++- 3 files changed, 100 insertions(+), 7 deletions(-) diff --git a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs index efa473425..bd8ed0fa9 100644 --- a/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs +++ b/Assets/Scripts/Tests/DaemonRuntimeDocumentTests.cs @@ -2832,7 +2832,7 @@ public class DaemonRuntimeDocumentTests } [Test] - public void GenericEveUnityRuntimePresentsAetheriaDaemonPlayableWorldThroughProviderBridge() + public void GenericEveUnityRuntimePresentsAetheriaDaemonPlayableWorldThroughLiveProviderTransport() { var statePath = Path.Combine( Path.GetTempPath(), @@ -2884,19 +2884,22 @@ public class DaemonRuntimeDocumentTests AetheriaRuntimeDaemonGameSurfaceBuilder.SurfaceId, "unity-scene-playable-test"); bridge.Refresh(); + using var liveBridge = new EveUnitySceneLiveProviderBridge(bridge); var sceneSink = new RecordingPlayableWorldSceneSink(); using var runtime = new EveUnityPlayableWorldRuntime( - bridge, - bridge, + liveBridge, + liveBridge, sceneSink, - bridge, - bridge); + liveBridge, + liveBridge); EveUnitySceneCommandReceipt observedReceipt = null; runtime.ReceiptAvailable += receipt => observedReceipt = receipt; var presentation = runtime.Connect(); + Assert.AreEqual("aetheria-cultmesh-cultcache-transport", liveBridge.TransportKind); + Assert.AreEqual(AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest.ToString(), liveBridge.AssetManifestPointer); Assert.AreEqual(1, presentation.ActiveEntities); Assert.AreEqual(1, sceneSink.Upserts.Count); Assert.IsNotNull(runtime.ActiveWorld); diff --git a/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderBridge.cs b/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderBridge.cs index 9e69e782c..368299052 100644 --- a/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderBridge.cs +++ b/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderBridge.cs @@ -13,6 +13,7 @@ using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument; namespace GameCult.Aetheria.EveRuntime { public sealed class AetheriaEveUnitySceneProviderBridge : + IEveUnitySceneLiveProviderTransport, IEveUnitySceneProviderSurfaceDocumentSource, IEveUnityPlayableWorldAssetManifestDocumentSource, IEveUnitySceneCommandSink, @@ -44,27 +45,66 @@ namespace GameCult.Aetheria.EveRuntime "aetheria.daemon"); } + public string TransportKind => "aetheria-cultmesh-cultcache-transport"; + + public string SurfacePointer => CurrentDocument.SourcePointer; + + public string AssetManifestPointer => CurrentDocumentManifest.ManifestRef; + public string SinkKind => "aetheria-daemon-command-boundary"; public string ManifestRef => CurrentDocumentManifest.ManifestRef; public EveUnitySceneProviderSurfaceDocument CurrentDocument { get; private set; } + EveUnitySceneProviderSurfaceDocument IEveUnitySceneLiveProviderTransport.CurrentSurfaceDocument => + CurrentDocument; + EveUnityPlayableWorldAssetManifestDocument IEveUnityPlayableWorldAssetManifestDocumentSource.CurrentDocument => CurrentDocumentManifest; + EveUnityPlayableWorldAssetManifestDocument IEveUnitySceneLiveProviderTransport.CurrentAssetManifestDocument => + CurrentDocumentManifest; + public EveUnityPlayableWorldAssetManifestDocument CurrentDocumentManifest { get; private set; } public event Action? DocumentAvailable; public event Action? ReceiptAvailable; + event Action IEveUnitySceneLiveProviderTransport.SurfaceDocumentAvailable + { + add => DocumentAvailable += value; + remove => DocumentAvailable -= value; + } + event Action IEveUnityPlayableWorldAssetManifestDocumentSource.DocumentAvailable { add => AssetManifestDocumentAvailable += value; remove => AssetManifestDocumentAvailable -= value; } + event Action IEveUnitySceneLiveProviderTransport.AssetManifestDocumentAvailable + { + add => AssetManifestDocumentAvailable += value; + remove => AssetManifestDocumentAvailable -= value; + } + + event Action IEveUnitySceneLiveProviderTransport.CommandReceiptAvailable + { + add => ReceiptAvailable += value; + remove => ReceiptAvailable -= value; + } + + public void Connect() + { + Refresh(); + } + + public void Disconnect() + { + } + public void Refresh() { var stateBoot = ResolveStateBoot(); @@ -106,6 +146,11 @@ namespace GameCult.Aetheria.EveRuntime ReceiptAvailable?.Invoke(ToReceipt(request, envelope)); } + public void SubmitCommand(EveSurfaceCommandRequest request) + { + Submit(request); + } + public void Dispose() { } diff --git a/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderComponent.cs b/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderComponent.cs index 1e4b3a820..949fabb44 100644 --- a/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderComponent.cs +++ b/Packages/org.gamecult.aetheria.eve-runtime/Runtime/AetheriaEveUnitySceneProviderComponent.cs @@ -9,7 +9,7 @@ using UnityEngine; namespace GameCult.Aetheria.EveRuntime { public sealed class AetheriaEveUnitySceneProviderComponent : - MonoBehaviour, + EveUnitySceneLiveProviderTransportBehaviour, IEveUnitySceneProviderSurfaceDocumentSource, IEveUnityPlayableWorldAssetManifestDocumentSource, IEveUnitySceneCommandSink, @@ -24,6 +24,18 @@ namespace GameCult.Aetheria.EveRuntime private AetheriaEveUnitySceneProviderBridge? _bridge; + public override string TransportKind => Bridge.TransportKind; + + public override string SurfacePointer => Bridge.SurfacePointer; + + public override string AssetManifestPointer => Bridge.AssetManifestPointer; + + public override EveUnitySceneProviderSurfaceDocument CurrentSurfaceDocument => + ((IEveUnitySceneLiveProviderTransport)Bridge).CurrentSurfaceDocument; + + public override EveUnityPlayableWorldAssetManifestDocument CurrentAssetManifestDocument => + ((IEveUnitySceneLiveProviderTransport)Bridge).CurrentAssetManifestDocument; + public string SinkKind => Bridge.SinkKind; public string ManifestRef => ((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).ManifestRef; @@ -39,19 +51,47 @@ namespace GameCult.Aetheria.EveRuntime remove => Bridge.DocumentAvailable -= value; } + public override event Action SurfaceDocumentAvailable + { + add => ((IEveUnitySceneLiveProviderTransport)Bridge).SurfaceDocumentAvailable += value; + remove => ((IEveUnitySceneLiveProviderTransport)Bridge).SurfaceDocumentAvailable -= value; + } + public event Action? ReceiptAvailable { add => Bridge.ReceiptAvailable += value; remove => Bridge.ReceiptAvailable -= value; } + public override event Action CommandReceiptAvailable + { + add => ((IEveUnitySceneLiveProviderTransport)Bridge).CommandReceiptAvailable += value; + remove => ((IEveUnitySceneLiveProviderTransport)Bridge).CommandReceiptAvailable -= value; + } + event Action IEveUnityPlayableWorldAssetManifestDocumentSource.DocumentAvailable { add => ((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).DocumentAvailable += value; remove => ((IEveUnityPlayableWorldAssetManifestDocumentSource)Bridge).DocumentAvailable -= value; } - public void Refresh() + public override event Action AssetManifestDocumentAvailable + { + add => ((IEveUnitySceneLiveProviderTransport)Bridge).AssetManifestDocumentAvailable += value; + remove => ((IEveUnitySceneLiveProviderTransport)Bridge).AssetManifestDocumentAvailable -= value; + } + + public override void Connect() + { + Bridge.Connect(); + } + + public override void Disconnect() + { + Bridge.Disconnect(); + } + + public override void Refresh() { Bridge.Refresh(); } @@ -61,6 +101,11 @@ namespace GameCult.Aetheria.EveRuntime Bridge.Submit(request); } + public override void SubmitCommand(EveSurfaceCommandRequest request) + { + Bridge.SubmitCommand(request); + } + public void Dispose() { _bridge?.Dispose();