From f1b1c8eedce08ba2b6e39f51be3c747bd805fb94 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 13:50:35 +0000 Subject: [PATCH 1/2] Initial plan From 2d17f16fdc630065adfa9719d6b7ee12b082e330 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 24 Apr 2026 13:52:36 +0000 Subject: [PATCH 2/2] Fix stale content in phase-2-headless-adapter-development.md Agent-Logs-Url: https://github.com/JohnLudlow/GameEngineAdapter/sessions/c444098d-c593-4060-b5ca-f0e8ddc3951e Co-authored-by: JohnLudlow <1769289+JohnLudlow@users.noreply.github.com> --- .../phase-2-headless-adapter-development.md | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/docs/plans/phase-2-headless-adapter-development.md b/docs/plans/phase-2-headless-adapter-development.md index 230cb37..fcf3012 100644 --- a/docs/plans/phase-2-headless-adapter-development.md +++ b/docs/plans/phase-2-headless-adapter-development.md @@ -87,11 +87,11 @@ Implement a `HeadlessAdapter` and its providers that simulate all engine operati #### Technical details - **HeadlessAdapter**: Implements `IEngineAdapter`. Composes headless providers for rendering, input, UI, assets, and audio. Currently returns `EngineCapabilities` (including `ContractVersion`) from the `Capabilities` property. -- **HeadlessRenderProvider**: Implements `IRenderProvider`. Records all render commands (`SubmitSprite`, `SubmitText`, `SubmitMesh`) to an in-memory list for later inspection. `BeginFrame` returns a `FrameScope`; `EndFrame` and `Present` are no-ops. +- **HeadlessRenderProvider**: Implements `IRenderProvider`. Records all render commands (`SubmitSprite`, `SubmitText`, `SubmitMesh`) to separate typed lists per draw type (`RecordedSprites`, `RecordedTexts`, `RecordedMeshes`) for later inspection. `BeginFrame` returns a `FrameScope`; `EndFrame` and `Present` are no-ops. - **HeadlessInputProvider**: Implements `IInputProvider`. Provides deterministic, scriptable input state via methods such as `ScriptKeyDown`, `ScriptKeyUp`, and `ScriptMousePosition`. - **HeadlessUserInterfaceProvider**: Implements `IUserInterfaceProvider`. Currently empty (pending final UI provider contract). - **HeadlessAssetProvider**: Implements `IAssetProvider`. Manages asset cache and lifecycle state in memory without actual file or resource access. Composes a `HeadlessAssetLoader` (implementing `IAssetLoader`) that returns stub assets for any requested identifier. -- **HeadlessAudioPlayer**: Implements `IAudioPlayer`. Records calls (`Play`, `Stop`, `SetVolume`) for test assertion. +- **HeadlessAudioPlayer**: Implements `IAudioPlayer`. Records calls (`StartPlayback`, `StopPlayback`, `SetVolume`) for test assertion. #### Phase requirements @@ -119,7 +119,7 @@ using JohnLudlow.GameEngineAdapter.Core; /// /// Simulates engine operations for headless, deterministic testing. -/// Records all provider calls for verification. +/// Exposes provider instances; individual providers may record their own calls for verification. /// public sealed class HeadlessAdapter : IEngineAdapter { @@ -182,40 +182,31 @@ public sealed class HeadlessAdapter : IEngineAdapter ``` ```csharp -namespace JohnLudlow.GameEngineAdapter.Headless; - -using JohnLudlow.GameEngineAdapter.Core; +// src/GameEngineAdapter.Headless/HeadlessRenderProvider.cs -/// -/// Records render commands for verification without GPU interaction. -/// public sealed class HeadlessRenderProvider : IRenderProvider { - private readonly List _recordedCommands = []; + private readonly List _recordedSprites = []; + private readonly List _recordedTexts = []; + private readonly List _recordedMeshes = []; - /// Gets the list of recorded render commands. - public IReadOnlyList RecordedCommands => _recordedCommands; + public IReadOnlyList RecordedSprites => _recordedSprites; + public IReadOnlyList RecordedTexts => _recordedTexts; + public IReadOnlyList RecordedMeshes => _recordedMeshes; - /// public FrameScope BeginFrame(in CameraDescriptor camera) => new(); - - /// - public void SubmitSprite(in SpriteDrawDto dto) => _recordedCommands.Add(dto); - - /// - public void SubmitText(in TextDrawDto dto) => _recordedCommands.Add(dto); - - /// - public void SubmitMesh(in MeshDrawDto dto) => _recordedCommands.Add(dto); - - /// + public void SubmitSprite(in SpriteDrawDto dto) => _recordedSprites.Add(dto); + public void SubmitText(in TextDrawDto dto) => _recordedTexts.Add(dto); + public void SubmitMesh(in MeshDrawDto dto) => _recordedMeshes.Add(dto); public void EndFrame() { } - - /// public void Present() { } - /// Clears all recorded commands. - public void Clear() => _recordedCommands.Clear(); + public void Clear() + { + _recordedSprites.Clear(); + _recordedTexts.Clear(); + _recordedMeshes.Clear(); + } } ```