namespace AcDream.App.Rendering; internal interface IRenderWeatherFramePhase { void Tick(double deltaSeconds); } /// /// Optional per-frame developer-presentation hook. Its one production /// implementation (the ImGui developer-tools frontend) was removed at /// Campaign V slice V11; the interface survives as the seam a follow-up /// re-homing Settings/Debug onto the retained UI will implement, and every /// current caller already treats it as optional (null-conditional). /// internal interface IDevToolsFrameLifecycle : IRenderFrameFailureRecovery { void BeginFrame(float deltaSeconds); void Render(double deltaSeconds, int viewportWidth, int viewportHeight); } /// /// 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. /// 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); } }