# UI Studio — dump-panel render sweep (2026-06-25) All 26 windows in `docs/research/2026-06-25-retail-ui-layout-dump.json` were rendered through the studio's dump LayoutSource (`AcDream.App ui-studio --dump --screenshot `) and read back as PNGs. Goal: verify the generic dump source renders every retail window, identify real render bugs vs. expected gaps. ## Verdict The generic dump source renders **all 26 panels with no crash**. Render fidelity tracks how much of a panel is **static chrome** (present in the dump, so it draws) vs **runtime content** (slots, stats, appraise text — NOT in the dump, so it can't draw). This is the dump's nature, not a studio bug. ## Per-panel status (read from `studio-shots/`) | Status | Panels | |--------|--------| | **Full / great** (frame + static content) | `vitals` (3 bars + heart/glyphs), `side_by_side_vitals`, `toolbar` (all spell/combat icons + backpack), `map`, `main_panel`, `radar` (disc), `character` (frame+tabs+scrollbar), `combat`, `powerbar`, `negative_effects`, `positive_effects`, `options`, `quests`, `social`, `spellbook`, `main_chat`, `floating_chat_1..4`, `environment_panel` | | **Partial** (chrome only; runtime content absent) | `inventory` — stone backdrop + top frame render, but the nested sub-window chrome (gm3DItemsUI / gmBackpackUI / paperdoll) is sparse and the slots are runtime-filled. **The one panel with a possible real gap — investigate the nested-layout / sub-window node handling.** | | **Blank** (runtime-only window, no static sprites in dump) | `examine` (appraise window — populated only on examine), and likely the small `indicators` / `smartbox` / `vitae` | ## Tooling shipped this sweep - `--screenshot ` headless mode (`f778b10`): render the loaded panel (dump or dat) to a PNG off-screen via `PanelFbo` + `glReadPixels` + ImageSharp, then exit. Hidden window (`IsVisible=false`). The autonomous self-verification primitive. - Contact-sheet montage via PowerShell `System.Drawing` (one image, 26 thumbs) — the cheap per-sweep overview (`studio-shots/_contact.png`, gitignored). ## Rect basis (confirmed in `DumpLayout`) Dump `rect` fields are ABSOLUTE retail screen coords; `DumpLayout` converts to parent-relative (`child.Left = child.Rect.X - parent.Rect.X`) and places the root at (0,0). Verified correct by the toolbar (icons land precisely) + vitals. ## Next (loop) 1. **Inventory nested chrome** — determine whether the sub-window content is missing because (a) those nodes are `Group`s with no static sprite (expected), or (b) `DumpLayout` isn't expanding a `base_layout_id` sub-layout reference (a fixable bug). Dump the inventory panel's node `widget_kind`/`rect`/`image_id` list and compare to what rendered. 2. Spot-confirm the remaining blanks (`indicators`/`smartbox`/`vitae`) are runtime-only. 3. The dump source is functionally complete as a static previewer; richer (live-data) previews are the dat-import + fixture path (the parked Task 4 bags/equip), not the dump path.