From 70827d03b006ccac45c7deafd4ce98ed71eb70a9 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 29 Jun 2026 05:23:58 +0100 Subject: [PATCH] Build input settings surfaces directly --- Aetheria.State.Verify/Program.cs | 21 +++++++++--- .../UI/InputScreen/InputDisplayLayout.cs | 19 ++++------- ...heriaRuntimeInputSettingsSurfaceBuilder.cs | 33 ++++++++++--------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 01180f88b..991069a69 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -4228,7 +4228,6 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) "action.ApplyBindingOverride", "new InputAction(\"Aetheria Input Capture\")", "AetheriaRuntimeInputSettingsSurfaceBuilder.IsSupportedCapturePath(", - "AetheriaRuntimeInputSettingsSurfaceBuilder.Project(", "new AetheriaRuntimeObservedInputBinding(", "HideLegacyChildren()" }; @@ -4278,6 +4277,8 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) "request.Payload", "private static readonly string[] DefaultActionBarCandidatePaths", "private static bool IsSupportedCapturePath(string path)", + "ProjectSurfaceState(", + "AetheriaRuntimeInputSettingsSurfaceBuilder.Project(", "new AetheriaRuntimeInputSettingsSurfaceState(", "new AetheriaRuntimeInputBindingSurfaceState(", "new AetheriaRuntimeActionBarInputSurfaceState(", @@ -4319,10 +4320,11 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) "public static readonly IReadOnlyList DefaultActionBarCandidatePaths", "public static readonly IReadOnlyList DefaultActionBarCandidateInputPaths", "public static bool IsSupportedCapturePath(string path)", - "public static AetheriaRuntimeInputSettingsSurfaceState Project(", - "public static IReadOnlyList ProjectBindingInputs(", - "public static IReadOnlyList ProjectActionBarCandidates(", - "public static IReadOnlyList ProjectActionBarInputs(", + "public static AetheriaRuntimeSurfaceDocument Build(", + "private static AetheriaRuntimeInputSettingsSurfaceState ComposeState(", + "private static IReadOnlyList ComposeBindingInputs(", + "private static IReadOnlyList ComposeActionBarCandidates(", + "private static IReadOnlyList ComposeActionBarInputs(", "new SortedDictionary(StringComparer.Ordinal)", "public enum AetheriaRuntimeInputSettingsCommandKind", "public readonly struct AetheriaRuntimeInputSettingsSurfaceCommand", @@ -4348,6 +4350,15 @@ static void RequireRuntimeInputScreenUsesEveSurface(string root) string.Join(", ", missingBuilderSymbols)); } + if (builder.Contains("public static AetheriaRuntimeInputSettingsSurfaceState Project(", StringComparison.Ordinal) || + builder.Contains("public static IReadOnlyList ProjectBindingInputs(", StringComparison.Ordinal) || + builder.Contains("public static IReadOnlyList ProjectActionBarCandidates(", StringComparison.Ordinal) || + builder.Contains("public static IReadOnlyList ProjectActionBarInputs(", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + "Input-settings surface composition must stay behind Build(...); do not re-expose projection helpers as the public ergonomic path."); + } + var actionGameManagerPath = Path.Combine(root, "Assets", "Scripts", "Gameplay", "ActionGameManager.cs"); var actionGameManager = File.Exists(actionGameManagerPath) ? File.ReadAllText(actionGameManagerPath) diff --git a/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs b/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs index 4ccafcfb8..0f7da7a57 100644 --- a/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs +++ b/Assets/Scripts/UI/InputScreen/InputDisplayLayout.cs @@ -156,7 +156,13 @@ public class InputDisplayLayout : MonoBehaviour EnsureInputAsset(); EnsureCaptureAction(); - var document = AetheriaRuntimeInputSettingsSurfaceBuilder.Build(ProjectSurfaceState()); + var runtimeSettings = ResolvePlayerSettings(); + var document = AetheriaRuntimeInputSettingsSurfaceBuilder.Build( + ProjectObservedBindings(), + runtimeSettings?.ActionBarInputs ?? Array.Empty(), + capturePending: _captureBindingIndex >= 0 && !string.IsNullOrWhiteSpace(_captureActionName), + capturePrompt: BuildCapturePrompt(), + updatedAtUtc: DateTime.UtcNow.ToString("O")); _surfaceDocument = AetheriaEveUnitySurfaceHost.RenderRuntime( transform, @@ -167,17 +173,6 @@ public class InputDisplayLayout : MonoBehaviour _surfaceChrome); } - private AetheriaRuntimeInputSettingsSurfaceState ProjectSurfaceState() - { - var runtimeSettings = ResolvePlayerSettings(); - return AetheriaRuntimeInputSettingsSurfaceBuilder.Project( - ProjectObservedBindings(), - runtimeSettings?.ActionBarInputs ?? Array.Empty(), - capturePending: _captureBindingIndex >= 0 && !string.IsNullOrWhiteSpace(_captureActionName), - capturePrompt: BuildCapturePrompt(), - updatedAtUtc: DateTime.UtcNow.ToString("O")); - } - private IReadOnlyList ProjectObservedBindings() { if (Input == null) diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs index dbc6c7b90..4c0877695 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeInputSettingsSurfaceBuilder.cs @@ -151,27 +151,30 @@ namespace GameCult.Aetheria.State.Verse path.StartsWith("/", StringComparison.Ordinal)); } - public static AetheriaRuntimeInputSettingsSurfaceState Project( + public static AetheriaRuntimeSurfaceDocument Build( IEnumerable observedBindings, IEnumerable enabledActionBarInputPaths, bool capturePending, string capturePrompt, - string updatedAtUtc) + string updatedAtUtc, + long version = 1) { var observed = (observedBindings ?? Array.Empty()) .Where(binding => binding != null) .ToArray(); - return Project( - observed, - enabledActionBarInputPaths, - ProjectActionBarCandidates(observed, enabledActionBarInputPaths), - capturePending, - capturePrompt, - updatedAtUtc); + return Build( + ComposeState( + observed, + enabledActionBarInputPaths, + ComposeActionBarCandidates(observed, enabledActionBarInputPaths), + capturePending, + capturePrompt, + updatedAtUtc), + version); } - public static AetheriaRuntimeInputSettingsSurfaceState Project( + private static AetheriaRuntimeInputSettingsSurfaceState ComposeState( IEnumerable observedBindings, IEnumerable enabledActionBarInputPaths, IEnumerable actionBarCandidateInputPaths, @@ -180,14 +183,14 @@ namespace GameCult.Aetheria.State.Verse string updatedAtUtc) { return new AetheriaRuntimeInputSettingsSurfaceState( - ProjectBindingInputs(observedBindings), - ProjectActionBarInputs(enabledActionBarInputPaths, actionBarCandidateInputPaths), + ComposeBindingInputs(observedBindings), + ComposeActionBarInputs(enabledActionBarInputPaths, actionBarCandidateInputPaths), capturePending, capturePrompt, updatedAtUtc); } - public static IReadOnlyList ProjectBindingInputs( + private static IReadOnlyList ComposeBindingInputs( IEnumerable observedBindings) { return (observedBindings ?? Array.Empty()) @@ -206,7 +209,7 @@ namespace GameCult.Aetheria.State.Verse .ToArray(); } - public static IReadOnlyList ProjectActionBarCandidates( + private static IReadOnlyList ComposeActionBarCandidates( IEnumerable observedBindings, IEnumerable enabledInputPaths) { @@ -241,7 +244,7 @@ namespace GameCult.Aetheria.State.Verse return candidates; } - public static IReadOnlyList ProjectActionBarInputs( + private static IReadOnlyList ComposeActionBarInputs( IEnumerable enabledInputPaths, IEnumerable candidateInputPaths) {