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>
35 lines
1.2 KiB
C#
35 lines
1.2 KiB
C#
namespace AcDream.App.Rendering;
|
|
|
|
internal interface IRenderWeatherFramePhase
|
|
{
|
|
void Tick(double deltaSeconds);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Preserves the accepted pre-world order after the GPU/resource transaction:
|
|
/// begin optional developer UI, advance render-time weather, then hand the
|
|
/// completed preparation to the world phase.
|
|
/// </summary>
|
|
internal sealed class RenderFramePreparationController : IRenderFrameResourcePhase
|
|
{
|
|
private readonly IRenderFrameResourcePhase _resources;
|
|
private readonly IDevToolsFrameLifecycle? _devTools;
|
|
private readonly IRenderWeatherFramePhase _weather;
|
|
|
|
public RenderFramePreparationController(
|
|
IRenderFrameResourcePhase resources,
|
|
IDevToolsFrameLifecycle? devTools,
|
|
IRenderWeatherFramePhase weather)
|
|
{
|
|
_resources = resources ?? throw new ArgumentNullException(nameof(resources));
|
|
_devTools = devTools;
|
|
_weather = weather ?? throw new ArgumentNullException(nameof(weather));
|
|
}
|
|
|
|
public void Prepare(RenderFrameInput input)
|
|
{
|
|
_resources.Prepare(input);
|
|
_devTools?.BeginFrame((float)input.DeltaSeconds);
|
|
_weather.Tick(input.DeltaSeconds);
|
|
}
|
|
}
|