Build input settings surfaces directly

This commit is contained in:
Meta Vens 2026-06-29 05:23:58 +01:00
commit 70827d03b0
3 changed files with 41 additions and 32 deletions

View file

@ -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<string> DefaultActionBarCandidatePaths",
"public static readonly IReadOnlyList<AetheriaRuntimeInputPathSurfaceLabel> DefaultActionBarCandidateInputPaths",
"public static bool IsSupportedCapturePath(string path)",
"public static AetheriaRuntimeInputSettingsSurfaceState Project(",
"public static IReadOnlyList<AetheriaRuntimeInputBindingSurfaceState> ProjectBindingInputs(",
"public static IReadOnlyList<AetheriaRuntimeInputPathSurfaceLabel> ProjectActionBarCandidates(",
"public static IReadOnlyList<AetheriaRuntimeActionBarInputSurfaceState> ProjectActionBarInputs(",
"public static AetheriaRuntimeSurfaceDocument Build(",
"private static AetheriaRuntimeInputSettingsSurfaceState ComposeState(",
"private static IReadOnlyList<AetheriaRuntimeInputBindingSurfaceState> ComposeBindingInputs(",
"private static IReadOnlyList<AetheriaRuntimeInputPathSurfaceLabel> ComposeActionBarCandidates(",
"private static IReadOnlyList<AetheriaRuntimeActionBarInputSurfaceState> ComposeActionBarInputs(",
"new SortedDictionary<string, string>(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<AetheriaRuntimeInputBindingSurfaceState> ProjectBindingInputs(", StringComparison.Ordinal) ||
builder.Contains("public static IReadOnlyList<AetheriaRuntimeInputPathSurfaceLabel> ProjectActionBarCandidates(", StringComparison.Ordinal) ||
builder.Contains("public static IReadOnlyList<AetheriaRuntimeActionBarInputSurfaceState> 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)

View file

@ -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<string>(),
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<string>(),
capturePending: _captureBindingIndex >= 0 && !string.IsNullOrWhiteSpace(_captureActionName),
capturePrompt: BuildCapturePrompt(),
updatedAtUtc: DateTime.UtcNow.ToString("O"));
}
private IReadOnlyList<AetheriaRuntimeObservedInputBinding> ProjectObservedBindings()
{
if (Input == null)

View file

@ -151,27 +151,30 @@ namespace GameCult.Aetheria.State.Verse
path.StartsWith("<Mouse>/", StringComparison.Ordinal));
}
public static AetheriaRuntimeInputSettingsSurfaceState Project(
public static AetheriaRuntimeSurfaceDocument Build(
IEnumerable<AetheriaRuntimeObservedInputBinding> observedBindings,
IEnumerable<string> enabledActionBarInputPaths,
bool capturePending,
string capturePrompt,
string updatedAtUtc)
string updatedAtUtc,
long version = 1)
{
var observed = (observedBindings ?? Array.Empty<AetheriaRuntimeObservedInputBinding>())
.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<AetheriaRuntimeObservedInputBinding> observedBindings,
IEnumerable<string> enabledActionBarInputPaths,
IEnumerable<AetheriaRuntimeInputPathSurfaceLabel> 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<AetheriaRuntimeInputBindingSurfaceState> ProjectBindingInputs(
private static IReadOnlyList<AetheriaRuntimeInputBindingSurfaceState> ComposeBindingInputs(
IEnumerable<AetheriaRuntimeObservedInputBinding> observedBindings)
{
return (observedBindings ?? Array.Empty<AetheriaRuntimeObservedInputBinding>())
@ -206,7 +209,7 @@ namespace GameCult.Aetheria.State.Verse
.ToArray();
}
public static IReadOnlyList<AetheriaRuntimeInputPathSurfaceLabel> ProjectActionBarCandidates(
private static IReadOnlyList<AetheriaRuntimeInputPathSurfaceLabel> ComposeActionBarCandidates(
IEnumerable<AetheriaRuntimeObservedInputBinding> observedBindings,
IEnumerable<string> enabledInputPaths)
{
@ -241,7 +244,7 @@ namespace GameCult.Aetheria.State.Verse
return candidates;
}
public static IReadOnlyList<AetheriaRuntimeActionBarInputSurfaceState> ProjectActionBarInputs(
private static IReadOnlyList<AetheriaRuntimeActionBarInputSurfaceState> ComposeActionBarInputs(
IEnumerable<string> enabledInputPaths,
IEnumerable<AetheriaRuntimeInputPathSurfaceLabel> candidateInputPaths)
{