V0 Visual Baseline Correction — Blender+Godot art pass (do not merge, independent review) - #6
Conversation
Branch from frozen V0 a9a4230 into an isolated worktree. Records the Art PM ruling (scaffold passed, player-facing visual baseline failed), the stylized-warm-diorama direction, the Blender->GLB->Godot pipeline, the decoupled HUD policy (headline separate from the MOCK tag), the physical-bottleneck requirement, the non-goals, and the stop rule. Adds the correction directory structure and lets our original generated GLB kit be committed (scene needs it) while keeping the restricted-binary quarantine. Not M1. No backend integration. Target PR #5 -> prototype branch, unmerged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tools/blender/_bkit.py: shared procedural helpers + warm stylized palette; deterministic per-piece GLB export (origin at floor contact). build_furniture.py generates 8 FURN_ pieces (4-top/2-top tables, chair, booth, host stand, wait bench, service station, bus tub). kit_review.gd renders a warm-lit labelled grid of any generated GLB prefix for iteration. Verified: Blender 5.2 headless -> GLB -> Godot import -> warm render produces a coherent handcrafted furniture kit (beveled wood, muted cushions), a decisive improvement over the gray-box baseline. Generated GLBs committed (scene needs them); .blend not committed (regenerable from scripts). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
12 KIT_ pieces (grill, range w/ burners, fryer, prep, cold station, sink w/ basins+faucet, dishwasher, tall fridge, wire shelves, pass w/ heat-lamp bar, ticket rail w/ tickets, heat lamp). Recognizable stainless silhouettes, low-tri. Verified in a warm-lit review render. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9 CHAR_ pieces: parametric posed low-poly people (head/hair/torso/arms/legs/shoes). Roles read by colour + a second signal: cook (white+toque), server (blue+apron+tray), host (teal+clipboard), busser (green+bin), customers (varied skin/hair/clothing, sit/wait/ stand poses). Replaces capsules. kit_review.gd renders any GLB-prefix grid for iteration. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8 ENV_ (window, storefront door, sign, plant, wall art, pendant light, menu board, awning) + 8 PROP_ (clean/food/dirty plates, glass, bill folder, place setting, centerpiece, ticket strip) for physical state storytelling. export_all.py regenerates all 45 GLBs; validate_ exports.py checks tri count + floor origin (0 real issues; low-tri throughout). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Assemble the Blender kit into one believable, frame-filling floor plan (rear open kitchen, ~13x10 m, no dead space): stainless line + pass along the back wall, wood dining tables + chairs + booths, host stand/waiting/plants at the entrance, storefront windows + door + sign + awning. Warm dining light (pendant OmniLights + warm key) vs cooler kitchen task spot, ACES + SSAO, soft shadows. Hybrid-C camera tuned to fill the frame with both front and back of house visible. Verified: reads unmistakably as a small restaurant. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…graphy CorrectedView places characters and props per Mock snapshot so bottlenecks read PHYSICALLY, not via labels/gauges: seated guests + place settings/food/dirty-plate/bill-folder per table state; cooks at stations (a cluster at the congested grill); servers empty-handed at the pass (kitchen tell) vs plates piling under the heat lamp (FOH tell); tickets on the rail scale with kitchen pressure; a queue of guests at the host stand (host tell); busser at dirty tables. HUD decouples the scenario headline from the MOCK tag: Presentation (clock + aggregate pressure dots, no answer), Readability (subtle state pips), Debug (labels + queue numbers). Verified: kitchen vs FOH bottleneck look physically distinct in close-up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
reports/visual/v0-correction/: 14 screenshots (4 scenario overviews, 4 close-ups incl. kitchen vs FOH, HUD presentation/readability/debug, furniture/kitchen/character kit lineups), 3 before/after montages vs PR #4, a camera-orbit recording, and performance.csv. Corrected-scene perf on M3 Max (vsync off, richer scene + shadows): worst frame ~8.5 ms (~120 FPS), ~600 draw calls, ~305 MB VRAM - well above the 60 FPS target. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Correction doc set (BLENDER-PIPELINE, VISUAL-STYLE-GUIDE, ENVIRONMENT-KIT-STANDARD, CHARACTER-STYLE-GUIDE, ANIMATION-STANDARD, HUD-READABILITY-STANDARD, and the living CURRENT-STATE / NEXT-ACTION / DECISION-LOG) + the final report (sections A-N). Gate: Pass-with-notes / Continue (= recommend independent visual review; NOT human test, merge, backend integration, M1, or final art). Honest notes recorded, not hidden: static posed characters (no skeletal animation, the #1 gap), operational-storytelling scores 3 at overview, iteration depth 2-3 not 5, and the independent sub-agent critique failed on an API outage so the report carries a lead self-assessment. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ken by an M0 PR) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
HSpector1
left a comment
There was a problem hiding this comment.
Independent Visual Review — PR #6
A. Review identity
| PR | #6 — fix/v0-visual-baseline-correction → prototype/v0-3d-restaurant-sandbox |
| Commit reviewed | 2ef1bb19ee50ee8d436b65cc2935564b8eb82661 (matches origin PR head) |
| Method | Fresh clone /tmp/pr6-audit, read-only; project run; kit regenerated from scripts; 4 scenarios rendered; 3 HUD modes + before/after inspected; GLBs parsed |
| Environment | Godot 4.7.1-stable · Blender 5.2.0 LTS · Apple M3 Max · 1920×1080 |
| Reviewers | Lead + A Art/Composition · B Management-Readability · C Character/Animation · D Blender-Pipeline · E Tech/Perf/Scope. All High/Blocker items lead-confirmed. |
B. Executive decision
- Verdict: Conditional-Pass · Action: Continue → authorize the next animation-led visual correction. The environment is a genuine, coherent, reproducible base worth keeping; it is not finished.
- Human test: NOT authorized (static characters + overview-weak storytelling — §17 conditions met).
- Merge: Do not merge. Preserve the branch as a visual-development baseline (§18).
- M1 / backend integration / final art: not authorized.
The builder's self-gate of "Pass-with-notes" is not accepted as the art gate; independent evidence (below) puts it at Conditional-Pass — the primary "does it look like an early restaurant-management game?" bar is met, but operational storytelling at the default overview does not yet hold, and that is animation-gated.
C. Before → after (PR #4 vs PR #6, equivalent frames)
| Category | PR #4 | PR #6 | Material improvement? |
|---|---|---|---|
| Restaurant fantasy | 1 | 4 | Yes |
| Layout composition | 2 | 3 | Yes (right-side dead zone remains) |
| Character readability | 2 | 3.5 | Yes (roles read in close-up; static) |
| Kitchen recognizability | 2 | 4 | Yes |
| Dining-room recognizability | 2 | 4 | Yes |
| Operational storytelling | 3 | 3 | No gain at the default overview (close-up/meter-dependent) |
| Camera readability | 3 | 3.5 | Slight |
| Visual coherence | 2 | 4 | Yes |
| Screenshot appeal | 2 | 4 | Yes |
| HUD dependence | High | High (meter/pips at overview) | Lateral, not reduced |
| The "before" montage panels were verified genuine against the real PR#4 images (not a strawman). The question is not "is it better" — clearly yes — but "is it a good-enough foundation for the animated phase." Answer: yes, conditionally. |
D. Default-overview findings (presentation mode, headline hidden)
Per-scenario classification (reads physically at overview / with restrained overlay / only in close-up / only via debug / does not read):
| Scenario | Classification | Note |
|---|---|---|
| Healthy | reads with restrained overlay | calm scene + low pressure dots |
| Kitchen bottleneck | reads only in close-up | at overview: "busy + a cook line"; specific cause weak |
| FOH bottleneck | reads only in close-up | distinction from kitchen leans on the pressure meter |
| Host/seating | reads with restrained overlay | entrance-queue clump is a moderate silhouette tell |
Finding B-1 (High, confirmed): no bottleneck reads through physical staging at the default overview; the read relies on the aggregate pressure meter + close-ups. This matches the builder's honest 3/5 operational-storytelling score. Do not accept the attractive close-ups (20/21/23) as proof the management overview works — they are a different camera. |
E. Character & animation (the gate)
Finding C3 (BLOCKER, confirmed by glTF parse): all 9 CHAR_*.glb have skins=0, animations=0, no JOINTS_/WEIGHTS_ attributes — zero skeleton, zero skin, single static pose-baked mesh each. Roles read by colour+prop+pose in stills, but the poses label state; the operational story (buildup, servers waiting, congestion forming, tables turning) requires animation — no amount of extra static posing closes it. Skeletal animation is the #1 blocking requirement. The current meshes are separated posed limbs, not a neutral rig-ready base: the next round should re-author one canonical A-pose humanoid base + shared skeleton + skinning, then retarget the CC0 Universal Animation Library (already cleared, ~1:1). Effort is more than "just retarget" (base + skeleton + skin + retarget + Godot AnimationTree).
F. Environment (keep-worthy, with real notes)
- A-2 (High): the right ~third of the room stays under-dressed across all scenarios (empty right-wall booths; a framed picture on the open floor front-right). "Dead floor fixed" is over-claimed — a genuine dead zone persists at the hero camera.
- A-3 (Medium): materials are near-flat matte across the whole kit, not just steel — the stainless reads as painted cardboard (no metallic/spec/reflection); wood/stucco/tile share one matte look. The report's "flat-ish steel" understates this. Fixable with roughness/metallic, geometry stays.
- A-4 (Medium): the warm/cool lighting story is real in close-up but washes out at the overview, so the identity partly falls back on the HUD. Strengthen pendant-vs-kitchen contrast at overview.
- Verdict: KEEP — no from-scratch modeling/lighting redo needed; these are next-round dressing/material/lighting tasks.
G. HUD
A-5 / B-2 (High, confirmed): the three HUD-mode captures (30/31/32) differ only trivially at overview — the readability pips and debug labels/queue-numbers are not legibly visible at that scale, so the "3-mode ladder" in the report is not demonstrated by its own evidence. The MOCK-tag decoupling from the headline is correctly implemented. Re-capture 31/32 at a zoom where the pips/labels actually read, and treat at-overview physical storytelling (animation) as the real fix, not the HUD.
H. Blender pipeline
PASS-with-notes. Independently reproduced: export_all.py regenerates all 45 pieces from scripts (no .blend), identical name set, validate_exports 0 issues; a fresh render is byte-identical to the committed screenshot (deterministic; evidence genuine). .blend are correctly disposable; GLBs + .glb.import committed (aids reviewer determinism).
- D1 (High, confirmed): the docs' "12–72 tris/piece" is wrong for characters — measured 1588–1924 tris each (props/simple env are the low ones). Correct the figure (kit is still cheap, but the stated number is off ~27×).
- D2 (Medium): pin the exact exporter string embedded in the GLBs (
Khronos glTF Blender I/O v5.2.39) and reconcile "5.2.0 LTS" vs "5.2" to guarantee the byte-identity the pipeline relies on.
I. Performance
Adequate (not "strong"), scoped to one high-end GPU.
- E1 (Medium, confirmed):
corrected_perf.gdderives FPS fromget_process_delta_time()with an idle_process(vsync off,max_fps=0) — that is CPU main-loop cadence, not GPU render time. The report's "~120 FPS worst / far exceeds 60" overstates: reclassify as CPU-loop timings. - E7 (trustworthy): the RenderingServer counters are real and good — ~600 draw calls (fewer than PR #4 via joined meshes), 318k–479k primitives, ~305 MB VRAM, 131–158 visible meshes. The static scene is genuinely cheap on this GPU.
- E2 (High): the real perf unknown is animation cost (skinning + many AnimationPlayers), which does not exist yet. Prototype one rigged character and re-measure with a GPU-timed probe before committing.
J. Iteration-depth assessment
The builder's honest "2–3 cycles, not 5" is confirmed and the reports/visual/v0-correction/iterations/{layout,environment,characters,animation,lighting,hud,integration}/ folders are empty (only .gitkeep) — the per-loop iteration evidence the process requires was never archived. Underdeveloped as a result: the right-side dead zone, materials (whole-kit), overview storytelling, HUD-at-overview, and any layout/lighting alternatives comparison (only one layout was built; the 3-candidate Loop-A study was skipped). Honesty is not penalised; the immature areas are noted.
K. Next-phase recommendation
C — Combined, animation-led correction. The environment is strong enough to retain; animation is necessary and is the storytelling bottleneck; and the full scene still needs deeper integration (dead-space, materials, lighting-at-overview, HUD legibility). Not (A) alone (integration gaps remain) and not (B) alone (walls/materials polish without motion would not fix the overview story).
L. Proposed loop structure (≥10, animation-led)
Genuinely necessary: (1) re-author rig-ready character base + shared skeleton; (2) skinning/weights; (3) idle+walk locomotion + path movement (stop teleporting per beat); (4) server actions (carry/serve/wait-at-pass); (5) cook actions (grill/plate/overwhelmed); (6) customer actions (sit/eat/wait-impatient/leave); (7) busser+host actions (clean/seat/queue); (8) scenario choreography + congestion buildup; (9) layout+camera+right-side dead-space + composition; (10) materials (metallic/rough) + lighting-at-overview + HUD-legibility integration; (11) full healthy-service pass; (12) full bottleneck-storytelling pass. Loops 1–8 and 11–12 are the core; 9–10 fold in the §F/§G fixes.
M. Required corrections before the next honest visual gate
Scoped to enabling the animation-led round (not the human test): (1) rig-ready character base + skeleton + skinning; (2) at-overview physical storytelling via motion; (3) dress/re-frame the right-side dead zone; (4) real kit materials (metallic/rough); (5) lighting contrast that survives the overview; (6) re-capture the HUD ladder so the modes are demonstrable; (7) fix the doc tri-count + exporter-version pin; (8) a GPU-timed perf probe once animation exists; (9) actually archive per-loop iteration evidence.
N. Final gate
Verdict: Conditional-Pass
Action: Continue
Continue authorizes the next animation-led visual correction only. It does not authorize human testing, merging, backend integration, or M1.
O. Required Art PM decision
Confirm option (c) — the combined, animation-led correction — as the next round, ordered animation-first then deeper integration, over ≥10 genuinely-archived full-scene loops; keep PR #6 open/unmerged, human test still deferred. Secondary: decide whether to re-author the character base for rigging now (recommended) vs. attempt to rig the current posed meshes.
Independent review complete. Read-only; PR #6 not modified, not merged. No animation built, no human test run, no backend integration, no M1. The three M0 PRs and PR #4 are untouched.
V0 Visual Baseline Correction — Blender + Godot art pass
Isolated correction branch from the frozen V0
a9a4230. Presentation-only. Not M1, no backend integration.Before → After (equivalent camera / scenario / state)
Left = PR #4 debug baseline. Right = corrected scene.
What changed
tools/blender/): procedural Python (_bkit.py+build_{furniture,kitchen,characters,environment,props}.py,export_all.py,validate_exports.py) → 45 low-tri GLBs (assets/generated/) → Godot.1 m = 1 u;.blendregenerable (not committed), generated GLBs committed.MOCK / SCRIPTEDtag is independent of the headline.Performance (M3 Max, vsync off, 1920×1080)
Worst frame ~8.5 ms (~120 FPS), ~600 draw calls, ~305 MB VRAM — above the 60 FPS target on a far richer scene (fewer draw calls than PR #4, thanks to joined meshes). One machine, kit-not-final-art.
Honest limits (read before deciding)
Isolation & scope
Branch from
a9a4230; PR #4 and the M0 backend branches untouched; nothing merged. Onlyvisual/,docs/art/,reports/,tools/changed. All assets original Blender-generated (CC0-equivalent); no restricted binaries; no.blendcommitted. All §26 non-goals absent.Gate
Full detail:
reports/visual/v0-correction/V0-VISUAL-CORRECTION-REPORT.md. Reproduce:blender --background --python tools/blender/export_all.py -- --out visual/RestaurantVisualSandbox/assets/generatedthen openres://scenes/sandbox/Corrected.tscn.🤖 Generated with Claude Code