namespace AcDream.UI.Abstractions; /// /// Owns the set of live s and drives per-frame draw /// dispatch. The backend (Hexa.NET.ImGui in D.2a, custom in D.2b) implements /// this; GameWindow creates one at startup and registers panels. /// /// /// Does not call ImGui.NewFrame / ImGui.Render — those /// belong to the caller so GL-state ownership is unambiguous. Caller pattern: /// /// /// /// // per frame, render thread /// inputBridge.BeginFrame(size, dt); /// ImGui.NewFrame(); /// panelHost.RenderAll(ctx); /// ImGui.Render(); /// ImGuiImplOpenGL3.RenderDrawData(ImGui.GetDrawData()); /// /// public interface IPanelHost { /// Register a panel for per-frame rendering. Idempotent by . void Register(IPanel panel); /// Remove the panel with the matching id. No-op if not present. void Unregister(string panelId); /// /// Iterate every visible panel and call . Call /// order within a frame is the registration order; panels with /// set to false are skipped entirely. /// void RenderAll(PanelContext ctx); }