refactor(render): compose render frame orchestrator

Move the accepted draw transaction and failure recovery behind typed frame-phase owners so GameWindow only supplies immutable frame input. Preserve retail draw order, make ImGui/bootstrap shutdown ownership explicit, and restore exact text-render GL state on failures.\n\nCo-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-22 08:03:49 +02:00
parent 28e1cf8029
commit 9d7df1bfc5
25 changed files with 1675 additions and 279 deletions

View file

@ -325,7 +325,7 @@ public sealed class WorldRenderFrameBuilderTests
}
[Fact]
public void World_scene_uses_the_typed_builder_and_game_window_releases_it_before_render_owners()
public void World_scene_uses_the_typed_builder_and_orchestrator_owns_its_local_composition()
{
string gameWindow = GameWindowSource();
string worldScene = File.ReadAllText(Path.Combine(
@ -341,6 +341,14 @@ public sealed class WorldRenderFrameBuilderTests
Assert.DoesNotContain("private void UpdateSunFromSky(", gameWindow, StringComparison.Ordinal);
Assert.DoesNotContain("private void UpdateSkyPes(", gameWindow, StringComparison.Ordinal);
Assert.DoesNotContain("private static float ParseEnvFloat(", gameWindow, StringComparison.Ordinal);
Assert.DoesNotContain(
"private AcDream.App.Rendering.WorldRenderFrameBuilder?",
gameWindow,
StringComparison.Ordinal);
Assert.DoesNotContain(
"private AcDream.App.Rendering.SkyPesFrameController?",
gameWindow,
StringComparison.Ordinal);
AssertAppearsInOrder(
worldScene,
"_alpha.BeginFrame();",
@ -350,9 +358,10 @@ public sealed class WorldRenderFrameBuilderTests
"NormalWorldDrawn: true");
AssertAppearsInOrder(
gameWindow,
"_worldSceneRenderer = null;",
"_worldRenderFrameBuilder = null;",
"_skyPesFrame = null;",
"var skyPesFrame = new AcDream.App.Rendering.SkyPesFrameController(",
"var worldRenderFrameBuilder =",
"new AcDream.App.Rendering.RenderFrameOrchestrator(",
"_renderFrameOrchestrator = null;",
"new(\"equipped children\"",
"new(\"effect network state\"",
"new(\"audio\"",