diff --git a/.gitignore b/.gitignore index 215c618b..3f6ee43f 100644 --- a/.gitignore +++ b/.gitignore @@ -90,3 +90,4 @@ C[€- # Junction to Claude Code per-project memory (Obsidian vault visibility) claude-memory +studio-shots/ diff --git a/docs/research/2026-06-25-studio-dump-panel-sweep.md b/docs/research/2026-06-25-studio-dump-panel-sweep.md new file mode 100644 index 00000000..36b5f0cf --- /dev/null +++ b/docs/research/2026-06-25-studio-dump-panel-sweep.md @@ -0,0 +1,45 @@ +# 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.