Use canonical Eve surface documents

This commit is contained in:
Meta Vens 2026-07-01 15:26:48 +01:00
commit 380b2d9f71
16 changed files with 98 additions and 154 deletions

View file

@ -1,5 +1,6 @@
using GameCult.Aetheria.State.Verse;
using GameCult.Mesh;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
namespace Aetheria.State.Unity;

View file

@ -919,8 +919,9 @@ static void RequireSharedEvePackagesImportedFromEveRepo(string root)
if (!runtimeCultCacheDocumentStore.Contains("CultMesh.OperationBindingRecord(command.Operation)", StringComparison.Ordinal) ||
!runtimeCultCacheDocumentStore.Contains("CultMesh.OperationBindingRecord(", StringComparison.Ordinal) ||
!runtimeCultCacheDocumentStore.Contains("routeDescription).ToBinding()", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("new GameCult.Mesh.EveSurfaceCommandTemplate(command.Operation)", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("new EveUiCommandTemplate(command.Operation)", StringComparison.Ordinal) ||
runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurface", StringComparison.Ordinal) ||
runtimeCultCacheDocumentStore.Contains("new CultMeshOperationBindingDescriptor(", StringComparison.Ordinal) ||
runtimeSurfaceDocuments.Contains("new CultMeshOperationBindingDescriptor(", StringComparison.Ordinal))
{
@ -3347,7 +3348,7 @@ static void RequireEveRuntimeBootstrap(string root)
".EveSurfaceDocument(surfaceId)",
"?.Reactive()",
"AetheriaEveRuntimeUnityHooks.TryCreateStateRefResolver(",
"CultMeshReactiveDocument<MeshEveSurfaceDocument>",
"CultMeshReactiveDocument<EveSurfaceDocument>",
"ResolveReactiveDaemonSurfaceState(",
"DisposeReactiveSurfaceState()",
"AetheriaRuntimeSurfaceDocuments.ToEveSurfaceDocument(",
@ -8717,7 +8718,7 @@ static void RequireAetheriaManagedStateAccessorsCoverDomainDocuments(string root
"public CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> Catalog { get; }",
"public CultMeshDocumentHandle<AetheriaRuntimePlayerSettingsDocument> PlayerSettings { get; }",
"public static bool TryResolveEveSurface(",
"public CultMeshDocumentHandle<MeshEveSurfaceDocument>? EveSurfaceDocument(",
"public CultMeshDocumentHandle<EveSurfaceDocument>? EveSurfaceDocument(",
"public CultMeshDocumentHandle<AetheriaRuntimeRtsViewportDocument> RtsViewport(",
"public CultMeshDocumentHandle<AetheriaRuntimeObjectsViewportDocument> ObjectsViewport(",
"public CultMeshDocumentHandle<AetheriaRuntimeGravityViewportDocument> GravityViewport(",
@ -11551,11 +11552,12 @@ static void RequireDaemonVersePublication(string root)
"Daemon Eve surface state lowering still lives in Aetheria.State projector chaff instead of the runtime surface documents.");
}
if (!runtimeSurfaceDocuments.Contains("public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurfaceCommandTemplate", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurfaceComponent", StringComparison.Ordinal))
if (!runtimeSurfaceDocuments.Contains("public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("new EveUiCommandTemplate(command.Operation)", StringComparison.Ordinal) ||
!runtimeSurfaceDocuments.Contains("new EveUiSurfaceComponent(", StringComparison.Ordinal) ||
runtimeSurfaceDocuments.Contains("GameCult.Mesh.EveSurface", StringComparison.Ordinal))
{
throw new InvalidOperationException("Runtime surface documents no longer lower daemon surfaces into portable CultMesh Eve surface documents.");
throw new InvalidOperationException("Runtime surface documents no longer lower daemon surfaces into canonical Eve surface documents published through CultMesh.");
}
if (!daemonDocuments.Contains("AetheriaRuntimeDaemonCommandKinds", StringComparison.Ordinal))
@ -12350,10 +12352,10 @@ static void RequireUnityRuntimeCatalogClientUsesManagedDocument(string root)
var requiredSymbols = new[]
{
"using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;",
"using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;",
"CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> catalog",
"public CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> Catalog",
"public CultMeshDocumentHandle<MeshEveSurfaceDocument>? EveSurfaceDocument(",
"public CultMeshDocumentHandle<EveSurfaceDocument>? EveSurfaceDocument(",
"AetheriaClientEveSurface.Game => GameSurface",
"AetheriaClientEveSurface.Editor => EditorSurface"
};
@ -12370,7 +12372,7 @@ static void RequireUnityRuntimeCatalogClientUsesManagedDocument(string root)
var requiredVerseClientSymbols = new[]
{
"BootstrapCatalogDocument(",
"Document<MeshEveSurfaceDocument>(",
"Document<EveSurfaceDocument>(",
"AetheriaRuntimeVerseRecordKeys.DaemonGameSurface",
"AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface"
};
@ -12562,7 +12564,7 @@ static void RequireAetheriaRuntimeVerseClientContract(string root)
if (File.Exists(surfaceStatePath))
{
throw new InvalidOperationException(
"AetheriaRuntimeEveSurfaceState.cs is legacy surface-state cruft; daemon UI surfaces must publish GameCult.Mesh.EveSurfaceDocument.");
"AetheriaRuntimeEveSurfaceState.cs is legacy surface-state cruft; daemon UI surfaces must publish GameCult.Eve.Surface.EveSurfaceDocument.");
}
var requiredClientSymbols = new[]
@ -12585,7 +12587,7 @@ static void RequireAetheriaRuntimeVerseClientContract(string root)
"public static CultRecordKey StarbridgeSessionSummary",
"new CultRecordKey(\"daemon:aetheria.starbridge.session.latest.v1\")",
"Document<AetheriaRuntimeVerseAuthorityPolicyDocument>(",
"typeof(MeshEveSurfaceDocument)",
"typeof(EveSurfaceDocument)",
"private AetheriaClientState? _aetheriaState",
"private CultMeshReactiveDocument<AetheriaRuntimeDaemonFrameDocument>? _managedDaemonFrame",
"private CultMeshReactiveDocument<AetheriaRuntimeCatalogSnapshot>? _managedCatalog",
@ -16715,9 +16717,9 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
var requiredSurfaceDocumentSymbols = new[]
{
"public static class AetheriaRuntimeSurfaceDocuments",
"public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)",
"public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)",
"public static EveUiSurfaceDocument ToEveSurfaceDocument(AetheriaRuntimeSurfaceDocument document)",
"public static EveUiSurfaceDocument ToEveSurfaceDocument(GameCult.Mesh.EveSurfaceDocument document)",
"public static EveUiSurfaceDocument ToEveSurfaceDocument(EveUiSurfaceDocument document)",
"public static EveUiSurfaceDocument ResolveStateRefs(",
"CultMeshStateRefResolver? stateRefResolver",
"ResolvePropRefs(props, resolveStateRef)",
@ -17059,11 +17061,11 @@ static void RequireRuntimeStateReaderOwnsUnityStateAcquisition(string root)
"public CultMeshDocumentHandle<AetheriaRuntimeVerseAuthorityPolicyDocument> AuthorityPolicy { get; }",
"public CultMeshDocumentHandle<AetheriaRuntimeDaemonFrameDocument> DaemonFrame { get; }",
"public CultMeshDocumentHandle<AetheriaRuntimeDaemonSoaViewDocument> DaemonSoaView { get; }",
"using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;",
"public CultMeshDocumentHandle<MeshEveSurfaceDocument> GameSurface { get; }",
"public CultMeshDocumentHandle<MeshEveSurfaceDocument> GameTuiSurface { get; }",
"public CultMeshDocumentHandle<MeshEveSurfaceDocument> EditorSurface { get; }",
"public CultMeshDocumentHandle<MeshEveSurfaceDocument> EditorTuiSurface { get; }",
"using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;",
"public CultMeshDocumentHandle<EveSurfaceDocument> GameSurface { get; }",
"public CultMeshDocumentHandle<EveSurfaceDocument> GameTuiSurface { get; }",
"public CultMeshDocumentHandle<EveSurfaceDocument> EditorSurface { get; }",
"public CultMeshDocumentHandle<EveSurfaceDocument> EditorTuiSurface { get; }",
"public CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> Catalog { get; }",
"public CultMeshDocumentHandle<AetheriaRuntimeLoadoutTemplatesDocument> LoadoutTemplates { get; }",
"public CultMeshDocumentHandle<AetheriaRuntimePlayerSettingsDocument> PlayerSettings { get; }",

View file

@ -1,6 +1,7 @@
using Aetheria.State.Documents;
using GameCult.Caching;
using GameCult.Aetheria.State.Verse;
using GameCult.Eve.Surface;
using GameCult.Mesh;
using GameCult.Networking;

View file

@ -1,6 +1,7 @@
using Aetheria.State.Documents;
using GameCult.Aetheria.State.Verse;
using GameCult.Mesh;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
namespace Aetheria.State;

View file

@ -4,9 +4,11 @@ using System.Linq;
using Aetheria.State.Documents;
using GameCult.Aetheria.State.Verse;
using GameCult.Mesh;
using EveSurfaceComponent = GameCult.Mesh.EveSurfaceComponent;
using EveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;
using EveSurfaceTree = GameCult.Mesh.EveSurfaceTree;
using EveCommandTemplate = GameCult.Eve.Surface.EveCommandTemplate;
using EveStyleToken = GameCult.Eve.Surface.EveStyleToken;
using EveSurfaceComponent = GameCult.Eve.Surface.EveSurfaceComponent;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
using EveSurfaceTree = GameCult.Eve.Surface.EveSurfaceTree;
namespace Aetheria.State;
@ -91,10 +93,10 @@ public static class AetheriaEveSurfaceDocuments
"card",
[("title", "Corporations")],
Node("aetheria.catalog.corporation.rows", "inspector.kv", [], corporations))),
Array.Empty<EveSurfaceStyleToken>()),
Array.Empty<EveStyleToken>()),
new[]
{
new EveSurfaceCommandTemplate(refreshCommand.ToBinding())
new EveCommandTemplate(refreshCommand.ToBinding())
});
}
@ -175,10 +177,10 @@ public static class AetheriaEveSurfaceDocuments
("runtime", runtimeSession?.RuntimeId ?? ""),
("started", runtimeSession?.StartedAtUtc ?? ""),
("lastSeen", runtimeSession?.LastSeenAtUtc ?? "")))),
Array.Empty<EveSurfaceStyleToken>()),
Array.Empty<EveStyleToken>()),
new[]
{
new EveSurfaceCommandTemplate(refreshCommand.ToBinding())
new EveCommandTemplate(refreshCommand.ToBinding())
});
}

View file

@ -8,6 +8,7 @@ using GameCult.Caching.MessagePack;
using GameCult.Mesh;
using GameCult.Networking;
using R3;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
namespace Aetheria.State;

View file

@ -75,7 +75,7 @@ First implementation footholds now exist in CultLib:
- `E:/Projects/CultLib/src/GameCult.Mesh/CultMeshPrimitives.cs` also exposes fluent operation/query context builders, with `CultMesh.OperationContextFor(...)` and `CultMesh.QueryContextFor(...)` entrypoints. Application code should read like a typed Verse call, not like manual transport setup.
- `E:/Projects/CultLib/src/GameCult.Geometry/CultGeometryPrimitives.cs` defines shared `CultVec2`, `CultVec3`, `CultRect`, `CultCircle`, and `CultSphere` values for query and physics contracts.
- `E:/Projects/CultLib/packages/cultmesh-ts/src/index.ts` now exposes TS `CultMeshVec2`, `CultMeshRect`, `CultMeshViewportRequest`, `CultMeshQuerySurface`, `CultMeshQueryContext`, `CultMeshOperationHandle`, `CultMeshOperationContext`, `CultMeshOperationPayload`, `CultMeshDocumentHandle`, `CultMeshDocumentCatalog`, `CultMeshCollectionHandle`, `CultMeshStatePointer`, `CultMeshStateBindingDescriptor`, `CultMeshOperationBindingDescriptor`, `CultMeshOperationInvocationDescriptor`, native slice descriptors, authority claims, route hints, fluent context builders, and handle helpers like `CultMesh.rectFromBounds(...)`, `CultMesh.viewportRequest(...)`, `CultMesh.query(...)`, `CultMesh.querySource(...)`, `CultMesh.operation(...)`, `CultMesh.document(...)`, `CultMesh.documents(...)`, `CultMesh.collection(...)`, `CultMesh.operationPayload(...)`, `CultMesh.statePointer(...)`, `CultMesh.stateBinding(...)`, `CultMesh.operationBinding(...)`, `CultMesh.operationInvocation(...)`, `CultMesh.nativeSliceView(...)`, `CultMesh.operationContextFor(...)`, and `CultMesh.queryContextFor(...)`.
- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimePlayerSettingsSurfaceBuilder.cs` and `GameCult.Mesh.EveSurfaceDocument` now expose component state bindings as CultMesh-owned portable binding records. Eve no longer owns a parallel live binding DTO, and Aetheria no longer owns a parallel persisted Eve surface state. Aetheria can build runtime surface source data, then publishes the shared CultMesh surface document before renderers lower it.
- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimePlayerSettingsSurfaceBuilder.cs` builds Aetheria runtime surface source data, then lowers it to the canonical `GameCult.Eve.Surface.EveSurfaceDocument` published through CultMesh. CultMesh owns state and operation binding descriptors; Eve owns the surface document and CultUI composition model. Mesh no longer defines a parallel Eve surface DTO.
- `E:/Projects/Eve/packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs` also exposes component `EmbeddedDocuments` as first-class CultUI slots. Aetheria runtime surfaces mirror that shape with `AetheriaRuntimeEmbeddedDocumentSlot`, so daemon-owned UI can compose nested synced surfaces such as inventory dropdowns without a Unity-only model, facade, or projector.
- Aetheria and Eve live command templates now carry `CultMeshOperationBindingDescriptor`. Eve command requests carry `CultMeshOperationInvocationDescriptor` plus `CultMeshOperationPayload`, so renderer click/change events preserve operation id, schema, route hint, idempotency, and scalar field reads as shared CultMesh metadata. Legacy `command`, `label`, `transport`, and string payload fields remain compatibility projections and persisted DTO fields, but the live API no longer exposes raw command-string/dictionary constructors; controls point at typed CultMesh operations and renderers build requests from shared CultMesh primitives.
- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeDaemonOperationsClient.cs` is now a typed operation handle surface that returns `CultMeshOperationReceipt` from semantic verbs such as `SetMoveVector`, `SetTarget`, `DockNearest`, and inventory transfers. The lower-level daemon command envelope remains an internal transport wrapper, but public client code should receive shared CultMesh receipts, not Aetheria-specific command envelopes.

View file

@ -13,7 +13,7 @@ using EveSurfaceCommandRequest = GameCult.Eve.Surface.EveSurfaceCommandRequest;
using EveSurfaceComponent = GameCult.Eve.Surface.EveSurfaceComponent;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
using EveSurfaceTree = GameCult.Eve.Surface.EveSurfaceTree;
using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
public class DaemonRuntimeDocumentTests
{
@ -4351,25 +4351,25 @@ public class DaemonRuntimeDocumentTests
.GetAwaiter()
.GetResult();
client
.MutableDocument<MeshEveSurfaceDocument>(
.MutableDocument<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonGameSurface)
.ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.GameSurface))
.GetAwaiter()
.GetResult();
client
.MutableDocument<MeshEveSurfaceDocument>(
.MutableDocument<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface)
.ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.GameTuiSurface))
.GetAwaiter()
.GetResult();
client
.MutableDocument<MeshEveSurfaceDocument>(
.MutableDocument<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface)
.ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.EditorSurface))
.GetAwaiter()
.GetResult();
client
.MutableDocument<MeshEveSurfaceDocument>(
.MutableDocument<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonEditorTuiSurface)
.ReplaceAsync(AetheriaRuntimeSurfaceDocuments.ToPortableSurface(result.EditorTuiSurface))
.GetAwaiter()

View file

@ -47,6 +47,7 @@
<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="E:\Projects\Eve\packages\org.gamecult.eve.surface\Runtime\EveSurfaceBuilder.cs" />
<Compile Include="E:\Projects\Eve\packages\org.gamecult.eve.surface\Runtime\EveSurfaceDocument.cs" />
<None Include="E:\Projects\Eve\packages\org.gamecult.eve.surface\Runtime\GameCult.Eve.Surface.asmdef" />
<Reference Include="Unity.Cecil.Awesome">
@ -97,6 +98,9 @@
<Reference Include="GameCult.Caching">
<HintPath>E:\Projects\Brokkr\surfaces\unity\Packages\com.gamecult.brokkr\Plugins\CultMesh\GameCult.Caching.dll</HintPath>
</Reference>
<Reference Include="MessagePack.Annotations">
<HintPath>E:\Projects\Brokkr\surfaces\unity\Packages\com.gamecult.brokkr\Plugins\CultMesh\MessagePack.Annotations.dll</HintPath>
</Reference>
<Reference Include="QuickGraph">
<HintPath>E:\Projects\Aetheria\Assets\Plugins\QuickGraph.dll</HintPath>
</Reference>

View file

@ -5,7 +5,7 @@ using GameCult.Eve.Surface;
using GameCult.Mesh;
using UnityEngine;
using UnityEngine.UIElements;
using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
#nullable enable
@ -36,7 +36,7 @@ namespace GameCult.Aetheria.EveRuntime
private string _mountedSurfaceId = "";
private long _mountedSurfaceVersion = -1;
private string _mountedSurfaceUpdatedAtUtc = "";
private CultMeshReactiveDocument<MeshEveSurfaceDocument>? _reactiveSurfaceState;
private CultMeshReactiveDocument<EveSurfaceDocument>? _reactiveSurfaceState;
private string _reactiveSurfaceStatePath = "";
private string _reactiveSurfaceId = "";
private static readonly AetheriaEveUnitySurfaceChrome RootOnlyChrome = new AetheriaEveUnitySurfaceChrome
@ -141,14 +141,14 @@ namespace GameCult.Aetheria.EveRuntime
"unity-eve-surface-presenter"));
}
private MeshEveSurfaceDocument? ReadDaemonSurfaceState(
private EveSurfaceDocument? ReadDaemonSurfaceState(
AetheriaRuntimeStateBootReport stateBoot)
{
var reactive = ResolveReactiveDaemonSurfaceState(stateBoot);
return reactive?.Current;
}
private CultMeshReactiveDocument<MeshEveSurfaceDocument>? ResolveReactiveDaemonSurfaceState(
private CultMeshReactiveDocument<EveSurfaceDocument>? ResolveReactiveDaemonSurfaceState(
AetheriaRuntimeStateBootReport stateBoot)
{
if (_reactiveSurfaceState != null &&
@ -169,7 +169,7 @@ namespace GameCult.Aetheria.EveRuntime
return _reactiveSurfaceState;
}
private CultMeshReactiveDocument<MeshEveSurfaceDocument>? CreateReactiveDaemonSurfaceState(
private CultMeshReactiveDocument<EveSurfaceDocument>? CreateReactiveDaemonSurfaceState(
AetheriaRuntimeStateBootReport stateBoot)
{
try

View file

@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using GameCult.Mesh;
using MessagePack;
using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
#nullable enable
@ -42,10 +42,10 @@ namespace GameCult.Aetheria.State.Verse
CultMeshDocumentHandle<AetheriaRuntimeVerseAuthorityPolicyDocument> authorityPolicy,
CultMeshDocumentHandle<AetheriaRuntimeDaemonFrameDocument> daemonFrame,
CultMeshDocumentHandle<AetheriaRuntimeDaemonSoaViewDocument> daemonSoaView,
CultMeshDocumentHandle<MeshEveSurfaceDocument> gameSurface,
CultMeshDocumentHandle<MeshEveSurfaceDocument> gameTuiSurface,
CultMeshDocumentHandle<MeshEveSurfaceDocument> editorSurface,
CultMeshDocumentHandle<MeshEveSurfaceDocument> editorTuiSurface,
CultMeshDocumentHandle<EveSurfaceDocument> gameSurface,
CultMeshDocumentHandle<EveSurfaceDocument> gameTuiSurface,
CultMeshDocumentHandle<EveSurfaceDocument> editorSurface,
CultMeshDocumentHandle<EveSurfaceDocument> editorTuiSurface,
CultMeshDocumentHandle<AetheriaRuntimeCatalogSnapshot> catalog,
CultMeshDocumentHandle<AetheriaRuntimeLoadoutTemplatesDocument> loadoutTemplates,
CultMeshDocumentHandle<AetheriaRuntimePlayerSettingsDocument> playerSettings,
@ -127,13 +127,13 @@ namespace GameCult.Aetheria.State.Verse
public CultMeshDocumentHandle<AetheriaRuntimeLoadoutTemplatesDocument> LoadoutTemplates { get; }
public CultMeshDocumentHandle<MeshEveSurfaceDocument> GameSurface { get; }
public CultMeshDocumentHandle<EveSurfaceDocument> GameSurface { get; }
public CultMeshDocumentHandle<MeshEveSurfaceDocument> GameTuiSurface { get; }
public CultMeshDocumentHandle<EveSurfaceDocument> GameTuiSurface { get; }
public CultMeshDocumentHandle<MeshEveSurfaceDocument> EditorSurface { get; }
public CultMeshDocumentHandle<EveSurfaceDocument> EditorSurface { get; }
public CultMeshDocumentHandle<MeshEveSurfaceDocument> EditorTuiSurface { get; }
public CultMeshDocumentHandle<EveSurfaceDocument> EditorTuiSurface { get; }
public CultMeshDocumentHandle<AetheriaRuntimePlayerSettingsDocument> PlayerSettings { get; }
@ -191,7 +191,7 @@ namespace GameCult.Aetheria.State.Verse
return false;
}
public CultMeshDocumentHandle<MeshEveSurfaceDocument>? EveSurfaceDocument(
public CultMeshDocumentHandle<EveSurfaceDocument>? EveSurfaceDocument(
string? surfaceId)
{
if (!TryResolveEveSurface(surfaceId, out var surface))

View file

@ -333,13 +333,13 @@ namespace GameCult.Aetheria.State.Verse
.ToArray());
}
private static GameCult.Mesh.EveSurfaceBuilder MainMenuSurface(
private static GameCult.Eve.Surface.EveSurfaceBuilder MainMenuSurface(
string surfaceId,
string title,
string updatedAtUtc,
long version)
{
var builder = GameCult.Mesh.EveSurface.Create(surfaceId)
var builder = GameCult.Eve.Surface.EveSurface.Create(surfaceId)
.Provider(ProviderId, ProviderKind)
.Version(version)
.UpdatedAtUtc(updatedAtUtc);

View file

@ -369,28 +369,28 @@ namespace GameCult.Aetheria.State.Verse
public static class AetheriaRuntimeSurfaceDocuments
{
public static GameCult.Mesh.EveSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)
public static EveUiSurfaceDocument ToPortableSurface(AetheriaRuntimeSurfaceDocument document)
{
if (document == null) throw new ArgumentNullException(nameof(document));
return new GameCult.Mesh.EveSurfaceDocument(
return new EveUiSurfaceDocument(
document.ProviderId,
document.ProviderKind,
document.Title,
document.Version,
document.UpdatedAtUtc,
new GameCult.Mesh.EveSurfaceTree(
new EveUiSurfaceTree(
document.Surface.Id,
ToPortableComponent(document.Surface.Root),
ToEveSurfaceComponent(document.Surface.Root),
document.Surface.Styles
.Select(style => new GameCult.Mesh.EveSurfaceStyleToken(style.Name, style.Value))
.Select(style => new EveUiStyleToken(style.Name, style.Value))
.ToArray()),
document.Commands
.Select(command => new GameCult.Mesh.EveSurfaceCommandTemplate(command.Operation))
.Select(command => new EveUiCommandTemplate(command.Operation))
.ToArray());
}
public static AetheriaRuntimeSurfaceDocument FromPortableSurface(GameCult.Mesh.EveSurfaceDocument document)
public static AetheriaRuntimeSurfaceDocument FromPortableSurface(EveUiSurfaceDocument document)
{
if (document == null) throw new ArgumentNullException(nameof(document));
@ -408,7 +408,7 @@ namespace GameCult.Aetheria.State.Verse
.ToArray()),
document.Commands
.Select(command => new AetheriaRuntimeSurfaceCommandTemplate(
FromPortableOperation(command.Operation)))
command.Operation))
.ToArray());
}
@ -417,18 +417,18 @@ namespace GameCult.Aetheria.State.Verse
return ToEveSurfaceDocument(document, null);
}
public static EveUiSurfaceDocument ToEveSurfaceDocument(GameCult.Mesh.EveSurfaceDocument document)
public static EveUiSurfaceDocument ToEveSurfaceDocument(EveUiSurfaceDocument document)
{
return ToEveSurfaceDocument(document, null);
}
public static EveUiSurfaceDocument ToEveSurfaceDocument(
GameCult.Mesh.EveSurfaceDocument document,
EveUiSurfaceDocument document,
CultMeshStateRefResolver? stateRefResolver)
{
if (document == null) throw new ArgumentNullException(nameof(document));
return ToEveSurfaceDocument(FromPortableSurface(document), stateRefResolver);
return ResolveStateRefs(document, stateRefResolver);
}
public static EveUiSurfaceDocument ToEveSurfaceDocument(
@ -437,25 +437,7 @@ namespace GameCult.Aetheria.State.Verse
{
if (document == null) throw new ArgumentNullException(nameof(document));
var surface = new EveUiSurfaceDocument(
"surface-state",
"gamecult.eve.surface.v1",
document.ProviderId,
document.ProviderKind,
document.Title,
document.Version,
document.UpdatedAtUtc,
new EveUiSurfaceTree(
document.Surface.Id,
ToEveSurfaceComponent(document.Surface.Root),
document.Surface.Styles
.Select(style => new EveUiStyleToken(style.Name, style.Value))
.ToArray()),
document.Commands
.Select(command => new EveUiCommandTemplate(command.Operation))
.ToArray());
return ResolveStateRefs(surface, stateRefResolver);
return ResolveStateRefs(ToPortableSurface(document), stateRefResolver);
}
public static EveUiSurfaceDocument ResolveStateRefs(
@ -533,6 +515,12 @@ namespace GameCult.Aetheria.State.Verse
return binding;
}
private static CultMeshStateBindingDescriptor FromPortableStateBinding(
CultMeshStateBindingDescriptor binding)
{
return binding;
}
private static EveUiSurfaceComponent ResolveStateRefs(
EveUiSurfaceComponent component,
Func<string, string> resolveStateRef)
@ -562,7 +550,7 @@ namespace GameCult.Aetheria.State.Verse
return resolved;
}
private static AetheriaRuntimeSurfaceComponent FromPortableComponent(GameCult.Mesh.EveSurfaceComponent component)
private static AetheriaRuntimeSurfaceComponent FromPortableComponent(EveUiSurfaceComponent component)
{
return new AetheriaRuntimeSurfaceComponent(
component.Id,
@ -574,71 +562,14 @@ namespace GameCult.Aetheria.State.Verse
}
private static AetheriaRuntimeEmbeddedDocumentSlot FromPortableEmbeddedDocumentSlot(
GameCult.Mesh.EveEmbeddedDocumentSlot slot)
EveUiEmbeddedDocumentSlot slot)
{
return new AetheriaRuntimeEmbeddedDocumentSlot(
slot.SlotId,
slot.DocumentId,
slot.SchemaId,
slot.PresentationKind,
FromPortableRoute(slot.RouteHint));
}
private static CultMeshStateBindingDescriptor FromPortableStateBinding(
GameCult.Mesh.EveSurfaceStateBinding binding)
{
return CultMesh.StateBindingRecord(
binding.TargetProp,
binding.PointerId,
binding.SourceId,
binding.SchemaId,
binding.RouteHint.Kind,
binding.RouteHint.Description).ToBinding();
}
private static CultMeshOperationBindingDescriptor FromPortableOperation(
GameCult.Mesh.EveSurfaceOperationBinding operation)
{
return CultMesh.OperationBindingRecord(
operation.OperationId,
operation.Label,
operation.SchemaId,
operation.RouteHint.Kind,
operation.RouteHint.Description).ToBinding();
}
private static CultMeshRouteHint FromPortableRoute(GameCult.Mesh.EveSurfaceRouteHint route)
{
return new CultMeshRouteRecord(route.Kind, route.Description).ToRoute(CultMeshRouteHint.Automatic);
}
private static GameCult.Mesh.EveSurfaceComponent ToPortableComponent(AetheriaRuntimeSurfaceComponent component)
{
var props = new Dictionary<string, string>(component.Props, StringComparer.Ordinal);
AetheriaRuntimeSurfaceStateBindings.AddPointerProps(props, component.StateBindings);
return new GameCult.Mesh.EveSurfaceComponent(
component.Id,
component.Kind,
props,
component.Children.Select(ToPortableComponent).ToArray(),
component.StateBindings
.Select(GameCult.Mesh.EveSurfaceStateBinding.FromDescriptor)
.ToArray(),
component.EmbeddedDocuments
.Select(ToPortableEmbeddedDocumentSlot)
.ToArray());
}
private static GameCult.Mesh.EveEmbeddedDocumentSlot ToPortableEmbeddedDocumentSlot(
AetheriaRuntimeEmbeddedDocumentSlot slot)
{
return new GameCult.Mesh.EveEmbeddedDocumentSlot(
slot.SlotId,
slot.DocumentId,
slot.SchemaId,
slot.PresentationKind,
GameCult.Mesh.EveSurfaceRouteHint.FromRoute(slot.RouteHint));
slot.RouteHint);
}
private static void ResolvePropRefs(

View file

@ -10,7 +10,7 @@ using GameCult.Mesh;
using GameCult.Networking;
using R3;
using EveUiCommandRequest = GameCult.Eve.Surface.EveSurfaceCommandRequest;
using MeshEveSurfaceDocument = GameCult.Mesh.EveSurfaceDocument;
using EveSurfaceDocument = GameCult.Eve.Surface.EveSurfaceDocument;
#nullable enable
@ -122,7 +122,7 @@ namespace GameCult.Aetheria.State.Verse
typeof(AetheriaRuntimePlayerSettingsDocument),
typeof(AetheriaRuntimeVerseHostSettingsDocument),
typeof(AetheriaRuntimeSurfaceDocument),
typeof(MeshEveSurfaceDocument),
typeof(EveSurfaceDocument),
typeof(AetheriaRuntimeDaemonCommandDocument),
typeof(AetheriaRuntimeEveCommandDocument)
};
@ -421,13 +421,13 @@ namespace GameCult.Aetheria.State.Verse
latestFrameDocument,
Document<AetheriaRuntimeDaemonSoaViewDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonSoaViewLatest),
Document<MeshEveSurfaceDocument>(
Document<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonGameSurface),
Document<MeshEveSurfaceDocument>(
Document<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface),
Document<MeshEveSurfaceDocument>(
Document<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface),
Document<MeshEveSurfaceDocument>(
Document<EveSurfaceDocument>(
AetheriaRuntimeVerseRecordKeys.DaemonEditorTuiSurface),
catalogDocument,
loadoutTemplatesDocument,

View file

@ -134,11 +134,12 @@ The daemon already publishes game and editor Eve surface records at these keys:
`AetheriaRuntimeVerseRecordKeys` exposes those keys and
`AetheriaRuntimeVerseClient` exposes typed reads, mutable state pointers, and
`WatchRecord<GameCult.Mesh.EveSurfaceDocument>(CultRecordKey)` subscriptions for
all four. The Eve surface document contract lives in CultMesh because Eve is the
UI projection language, not an Aetheria persisted-state owner. A Unity client,
`WatchRecord<GameCult.Eve.Surface.EveSurfaceDocument>(CultRecordKey)`
subscriptions for all four. Eve owns the surface document and composition DSL;
CultMesh owns the transport, typed handles, state refs, operation bindings, and
route hints that let clients observe and invoke that surface. A Unity client,
terminal client, daemon inspector, or later non-C# runtime binding lowers the
same published `GameCult.Mesh.EveSurfaceDocument`. The existing Eve Unity
runtime host can keep resolving Aetheria state refs automatically; it should
consume those refs as part of lowering the shared surface, not as a separate
authority path.
same published `GameCult.Eve.Surface.EveSurfaceDocument`. The existing Eve Unity
runtime host can keep resolving Aetheria state refs automatically; it consumes
those refs as part of lowering the shared surface, not as a separate authority
path.

View file

@ -314,7 +314,7 @@ Work on Unity thin-client migration:
Work on Eve/CultUI surfaces:
- `GameCult.Mesh.EveSurfaceDocument` for daemon-published CultUI/Eve surfaces
- `GameCult.Eve.Surface.EveSurfaceDocument` for daemon-published CultUI/Eve surfaces
- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeSurfaceDocuments.cs`
- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeEveCommandClient.cs`
- `Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntime*SurfaceBuilder.cs`