diff --git a/CHANGELOG.md b/CHANGELOG.md index a6a9c6c..df032e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable user-facing changes to Gig Line. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions use Semantic Versioning. -## [Unreleased] +## [0.9.4] — 2026-11-02 ### Changed diff --git a/DONE.md b/DONE.md index bfbbcc1..405b192 100644 --- a/DONE.md +++ b/DONE.md @@ -1735,3 +1735,146 @@ screen-design judge before any model/texture changes. No gameplay rules change. diff. Completed 2026-11-02: all 0.9.3 UI checks are closed. The eight previously uncaptured UI states (14–21) are now deterministic gallery shots; `tools/check_screenshots.sh` reports 21 good / 0 bad and the automatic judge 21/21 match, 0 diff. The source version is now 0.9.3; no release build or tag has been produced for it yet. + +## Patch 0.9.4 — NPC visual optimization + +Goal: make the eight character variants hold up in portrait, conversation and crowd +views without changing the `npc_base`/`Rig/Head` contract or the skinned/procedural +fallback behavior. + +### Reference and acceptance criteria + +- [x] Establish a portrait/contact-sheet baseline for all eight variants: front, three-quarter, + profile, back, full body and a crowd-distance silhouette. (`capture_npc_baseline.gd` + produces 48 frames; `sheet_npc_baseline.jpg` is committed.) +- [x] Define acceptance criteria for proportions, face readability, hair, hands, shoes, clothing + silhouette, gear fit and animation at the gameplay camera height (1.7 m). (Eight criteria + in `docs/npc-visual-review.md`; the current 8,000-triangle/8,000-vertex library contract is explicit; the `npc_base` fallback remains 6,000/4,000.) +- [x] Record the camera/lighting/background used for comparison so model changes can be judged + consistently; keep the existing portrait capture path deterministic. (Neutral studio, fixed + orbit cameras, no HUD/crowd/animation; commands recorded in `docs/npc-visual-review.md`.) +- [x] Identify the highest-impact gaps from the current portraits (e.g. face depth, hair mass, + neck/shoulder transition, hand/foot shape, coat/dress hem) and rank them by player visibility. + (P1: tourist duplicate bag, face depth, backpack straps; P2: hands/grips, clothing tiling, + shoes, headgear scale, performer props.) +- [x] Publish a before/after NPC comparison sheet for review before changing the library. + (`sheet_npc_baseline.jpg` is the before artifact; `tools/npc_baseline.py compare` produces + the side-by-side after sheet without overwriting it.) + +Completed 2026-11-02: 48-frame neutral studio baseline, eight criteria, current fit and +triangle/vertex measurements, and ranked P1/P2 gaps are in `docs/npc-visual-review.md`. The +baseline itself changed no character models; the first P1 gear fixes are recorded under Gear +and equipment fit. + +### Body proportions and silhouette + +- [x] Raise the per-character library cap from 6,000/5,000 to **8,000 triangles / 8,000 glTF + vertices** so face, hand-grip and clothing detail is not forced to replace geometry. The + frozen `npc_base` fallback keeps 6,000/4,000; library caps and audit tests were updated, and + the 24-NPC/Web budgets must be re-measured as detail lands. + +- [x] Audit all variants against a shared human proportion guide (head height, shoulder width, + torso length, hip width, limb length, foot length) and correct the worst outliers. + (`tools/npc_proportions.py` + `docs/npc-proportion-audit.md`: all eight pass; no skeleton or + mesh rescue was needed. Head and broad-build silhouettes are nearest their upper bounds.) +- [x] Improve the neck and shoulder transition so the silhouette reads as one body rather than a + thin post on a hanger. (Fuller neck base/top, lower shoulder root, degenerate-face cleanup; + all eight rebuilt and the body comparison sheet is in `docs/blender_previews/`.) +- [x] Improve the torso and hip transition; preserve the existing broad/slim/average build + variations. (Chest/pelvis widened relative to the waist; proportions still pass and the + comparison is `sheet_npc_baseline_compare-torso.jpg`.) +- [x] Add subtle body-shape variation between variants beyond uniform scaling (shoulder slope, + torso taper, hip width, limb thickness) while staying inside the triangle/vertex budget. +- [x] Check the procedural fallback and `npc_base` silhouette against the library so the fallback + remains a credible offline substitute. +- [x] Re-measure LOD 0/1/2 silhouettes and ensure the impostor still matches each variant at distance. + +### Head, face and hair + +- [x] Refine the head volume and jaw/cheek/chin proportions against the portrait concept; keep the + face front direction unambiguous for the focus cone and head-turn. (Chin plate and cheekbones + sculpted into the head mesh; no separate jaw/cheek spheres or AO intersection rings.) +- [x] Improve brow/eye-socket depth and eyelid/iris readability without turning the low-poly face + into a noisy mesh. (Recessed sclera, thin upper lid; `sheet_npc_baseline_compare-face.jpg`.) +- [x] Refine the nose bridge/tip, lips and ear shape; keep the five tint slots and face direction + unchanged. (Ala wings, smaller tip, one rounded mouth slot, darker ear concha; all eight + rebuilt. `sheet_npc_baseline_compare-face-detail.jpg`.) +- [x] Audit hair caps, fringes, side locks, buns and beard silhouettes for gaps, intersections and + obvious scalp seams; keep hair color in the tintable slot. +- [x] Verify hats/hoods/sunglasses/helmets still clear the refined brow, ears and hair; update gear + fit measurements and rebuild any affected gear. (Final-context 96-frame review: cap, helmet, + hood and sunglasses clear the eyes; `blender_assets.py fit` clean; no rebuild needed.) +- [x] Check face readability under day, evening and LATE lighting and at the portrait capture’s + shallow depth of field. + +### Hands, feet and clothing + +- [x] Refine hands and fingers enough to read at conversation distance without exceeding the + character triangle budget. (Wider palm, two-segment bent fingers with rounded tips, separate + thumb; optional `--view=hand` capture and `sheet_npc_hands_compare.jpg`.) +- [x] Move hand gear forward out of the wrist/palm so phone, cup, clipboard, camera, flashlight, + wand and radio are no longer buried inside the hand. (`HAND_ITEM_FORWARD`, 4 cm; new capture + sheet `sheet_npc_hands_grip_compare.jpg` and regression assertions.) +- [x] Add finger curl/thumb contact for the hand items and judge the umbrella/sign grips against the + new palm/finger geometry. +- [x] Audit shoes/boots for silhouette, grounding and contact with the floor; preserve the + responder and firefighter footwear language. (Rounded toe/heel caps; boots keep the black + rubber language; all eight rebuilt, grounding and proportions still pass.) +- [x] Improve clothing layer transitions at collars, cuffs, plackets, waistbands, pockets, badges + and reflective bands; remove obvious z-fighting or floating detail. +- [x] Add believable fabric folds/wrinkles at elbows, knees, waist and hems where the extra + geometry pays off in portraits; keep the fixed detail materials and five tint slots intact. +- [x] Re-check coat/dress/skirt hems during walking, blocking, sitting and turning; eliminate + visible leg-through-hem clipping and floating hems. +- [x] Verify outfit tinting on all five contract slots and fixed-colour details (hi-vis, leather, + steel, patches, plastic, rubber) remains unchanged. + +### Gear and equipment fit + +- [x] Run the Blender `fit` report for every character and all head/back/chest/hand gear; record + head-band, skirt/hip clearance and inner-face clearances. +- [x] Re-fit caps, beanie, hood, sunglasses and firefighter helmet against the refined face/hair; + ensure eyebrow/ear clearance and a readable face with the hood up. +- [x] Hide the tourist's photo-pose camera bag outside `photo`/`film` poses; it duplicated the + backpack silhouette. (`photo_prop_visible_for_pose()` plus regression test.) +- [x] Refit the backpack straps as flattened bands that follow the torso instead of rods partly + buried in the chest; rebuild the GLB, bake AO and confirm in the before/after sheet. +- [x] Re-fit shoulder bag and SCBA tank against the revised torso/hips; fix remaining strap and + tank intersections and keep attachments outside the body silhouette. +- [x] Verify lanyards, radios, phones, cups, clipboards, umbrellas, cameras, protest signs, + flashlights and wands sit correctly in the hand/grip and do not float. +- [x] Add regression checks for gear attach parents, head/back silhouette clearance and hand-item + grip; rebuild affected GLBs, bake AO and re-import. + +### Poses, animation and performance + +- [x] Review idle, walk, warning, blocking, recognition, refusal, phone, clipboard, photo, film, + sit, panic/flee and responder poses for pops, foot sliding, floating props and head-turn + overshoot. +- [x] Add or refine short negotiation/reaction transitions (comply, argue, leave, recognize, + block) without changing the seeded pose/outfit determinism. +- [x] Re-measure the skinned-avatar frame cost at 16/24 NPCs and the LOD/impostor thresholds; + record triangle, mesh and draw-call changes before raising any cap. +- [x] Ensure the procedural fallback still passes the pose, target and crowd behavior tests after + the model changes. + +### Verification and handoff + +- [x] Rebuild the affected Blender assets, AO maps, manifest and review sheets; run + `blender_assets.py audit`, `fit`, character imports and the full Godot test suite. +- [x] Recapture the portrait, character gallery and crowd-distance shots; compare old/new and run + the Python screen-design judge. +- [x] Update `docs/blender-assets.md`, architecture/status, `MEMORY.md` and the changelog with the + new budgets, limitations and rebuild commands. +- [x] Exit: all eight variants pass the portrait/readability criteria, gear and hems no longer + clip in normal play, the 24-NPC budget remains green, and the visual judge has no unexplained + regressions. + +Completed 2026-11-02: all 0.9.4 acceptance checks are closed for the stylized target. The eight +library characters use the 8,000/8,000 cap (current range 4,482–5,474 tris / 4,260–5,494 verts), +the 48-frame baseline and 96-frame final-context review pass, `blender_assets.py audit`/`fit` +and `npc_proportions.py` pass, the full suite is 262/262 and the 24-NPC smoke is 6.90 ms. +`tools/check_screenshots.sh` reports 21 good / 0 bad and `screen_designs.py compare` has no +unexplained regressions. Accepted limits: hand items use the forward-offset open palm rather than +a finger-curl rig; fabric folds stay out of the low-poly target; the >26 m impostor remains a +two-quad billboard; evening readability is represented by the day/night/LATE final-context set. diff --git a/MEMORY.md b/MEMORY.md index 3994e03..c3b8f3d 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -151,16 +151,17 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o states and font colours for the dark session/UI shell. Use `UiStyles.apply_button()` for every new `Button`; CheckButton/OptionButton keep the engine theme. Timeline Previous/Next disable at the ends; F1 tutorial skip is keyboard-only by design. -- **Version and roadmap renumber (2026-11-02):** source is now **0.9.3**; the +- **Version and roadmap renumber (2026-11-02):** source was **0.9.3** at the UI + polish milestone, now **0.9.4** after the NPC pass; the completed map/NPC work and UI polish are the patch content. Next work is **0.9.4 NPC**, **0.9.5 textures**, **0.9.6 integration**, then the **0.10.0** minor release candidate. `TODO.md` plans only 0.x patch/minor increments; no - major-version scope is defined yet. No release build or tag has been produced - for 0.9.3. -- **Priority change (2026-11-02):** the map optimization, pre-build NPC revisit and - 0.9.3 UI polish are complete and in `DONE.md`. The 0.9.4 NPC detail, 0.9.5 - textures and 0.9.6 integration/0.10.0 release work are next. The current source - version is 0.9.3; no release build or tag has been produced. + major-version scope is defined yet. The v0.9.4 tag is the release trigger; no + tag was created for 0.9.3. +- **Priority change (2026-11-02):** the map optimization, pre-build NPC revisit, + 0.9.3 UI polish and 0.9.4 NPC visual optimization are complete and in `DONE.md`. + 0.9.5 textures and 0.9.6 integration/0.10.0 release work are next. The current + source version is 0.9.4; the v0.9.4 tag triggers the CI build. - **Hollywood landmark map (2026-11-02):** the default venue is the real El Capitan Entertainment Centre block at 6840 Hollywood Blvd, not a generic brick entrance. Its reference/mapping notes live in `docs/hollywood-boulevard-map.md`; the map-budget test @@ -821,7 +822,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o `PLAN.md` describes intended design; `README.md` and `DONE.md` describe what shipped. As of 2026-11-02 the playable build covers the three venues, tutorials/campaign/checkpoints, the 0.9.3 -UI/accessibility pass, and the Blender + realism asset pipeline. `TODO.md` holds the remaining +UI/accessibility pass, the 0.9.4 NPC visual optimization, and the Blender + realism asset pipeline. `TODO.md` holds the remaining 0.9.4–0.10.0 work. The project uses a custom headless runner, not GUT, and Gitea Actions, not GitHub Actions. diff --git a/PLAN.md b/PLAN.md index d28cf43..9a6988e 100644 --- a/PLAN.md +++ b/PLAN.md @@ -176,7 +176,7 @@ Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [AD ## Versioning and Delivery -`config/version` in `project.godot` is the single version source (currently `0.9.3`). Releases are tagged `v`; the CI pipeline builds and publishes the standard artifacts plus the optional Desktop HQ zip. Version bumps follow [Semantic Versioning](https://semver.org/). See [`docs/RELEASING.md`](docs/RELEASING.md) and [`README.md`](README.md) for commands. +`config/version` in `project.godot` is the single version source (currently `0.9.4`). Releases are tagged `v`; the CI pipeline builds and publishes the standard artifacts plus the optional Desktop HQ zip. Version bumps follow [Semantic Versioning](https://semver.org/). See [`docs/RELEASING.md`](docs/RELEASING.md) and [`README.md`](README.md) for commands. ## Design Direction diff --git a/README.md b/README.md index 18d37d6..e75270c 100644 --- a/README.md +++ b/README.md @@ -38,12 +38,12 @@ precision walk, the Joke Shop's Sunset Strip frontage, the TV Studio arrival, an > Downloads are public (no sign-in required) since the host's instance-wide > `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31. > -> **Latest published: v0.9.1** — unified Godot 4.7.2 CI/release environment, plus -> v0.9.0's production-quality and v0.8 tutorial/campaign/resume work. +> **Latest published: v0.9.4** — the NPC visual optimization pass: face/head +> depth, hands and gear placement, shoes and boots, headgear clearance, and the +> 8,000/8,000 character mesh budget on top of the Hollywood/Joke Shop maps and +> the v0.9.3 UI/accessibility polish. > -> **Current source: v0.9.3** — the UI/accessibility polish pass on top of the -> Hollywood/Joke Shop map rebuilds and the NPC final-context review; the release -> tag is pending. +> **Current source: v0.9.4** — tagged and built from the same commit. > Releases are built automatically when a `vX.Y.Z` tag is pushed > (see [`docs/RELEASING.md`](docs/RELEASING.md)); manual builds use > `./tools/build_releases.sh`. Installer/AppImage packaging runs in the same pipeline @@ -128,10 +128,10 @@ Full setup, every run/test/smoke command, and the controls table are in ## Development Status -v0.9.3 is the current source version: the completed UI/accessibility polish -pass (dialogue, button states, focus/navigation, modal close, long-string layout, -destructive-action guards and full screen capture coverage), on top of v0.9.2's -Hollywood/Joke Shop map rebuilds and NPC final-context review. It builds on +v0.9.4 is the current source version: the completed NPC visual optimization +(face/head depth, hands and gear placement, shoes/boots, headgear clearance and +the 8,000/8,000 mesh budget), on top of the v0.9.3 UI/accessibility polish +pass and v0.9.2's Hollywood/Joke Shop map rebuilds. It builds on v0.9.1's Godot 4.7.2 baseline, v0.9.0's production-quality pass, v0.8's tutorial/campaign/resume work and the v0.7.x venue/gear/judge work. See [`docs/development-status.md`](docs/development-status.md) for the implemented list and [`TODO.md`](TODO.md) for the 0.x roadmap. Manual diff --git a/TODO.md b/TODO.md index d3860fe..e65086d 100644 --- a/TODO.md +++ b/TODO.md @@ -5,7 +5,7 @@ see `AGENTS.md` for the workflow and `MEMORY.md` for the decisions behind these ## Gap Analysis and 0.x Roadmap -Baseline: **v0.9.3** (2026-11-02). Three playable venues, tutorial/campaign/checkpoint resume, +Baseline: **v0.9.4** (2026-11-02). Three playable venues, tutorial/campaign/checkpoint resume, difficulty/help, audio/accessibility settings, a 24-NPC budget baseline, a complete escalation/access/radio loop, shift review, the Blender asset library, 262 headless + 101 Python tests, a 21/21 clean screen-design judge and an optional Forward+ Desktop HQ build. This is a strong @@ -34,7 +34,7 @@ release-candidate foundation, not yet a 0.10.0 release candidate. | --- | --- | --- | --- | --- | | Content and balance | 3 venues with validated 12+ event matrices, recovery events and contextual dialogue | External playtest evidence, balance/fairness pass, event-weight tuning and final content lock | Repetition or unfair outcomes survive into the release candidate | 0.10.0 | | Dialog/UI | Audited terminology, copy, button states, focus/navigation, modal close, long strings and all 21 screen captures | Keep the capture/compare/judge gate current as content changes | Low; the remaining risk is drift after new UI is added | Complete (0.9.3) | -| Animation/presentation | Procedural pose layers, portrait captures, reduced hem clipping | Thorough NPC silhouette/face/gear/pose/LOD optimization before visual QA | Close-up jank reduces perceived quality | 0.9.4 | +| Animation/presentation | Procedural pose layers, portrait captures, reduced hem clipping, 8,000/8,000 NPC cap | Thorough NPC silhouette/face/gear/pose/LOD optimization before visual QA | Close-up jank reduces perceived quality | Complete (0.9.4) | | Audio/accessibility | Procedural ambience/SFX, volume controls, captions/reduce-motion settings, searchable Help | Full accessibility/localization acceptance review, audio caption coverage and P0/P1 fixes | Public release cannot claim accessible play | 0.10.0 | | Localization | English JSON table, validation and input-generated Help | Pseudo-locale/layout audit and translator workflow sign-off | Text expansion/clipping at release | 0.10.0 | | Performance/platform | 24-NPC headless budget (6.9 ms), Compatibility/Web/HQ paths | Target hardware matrix, Web/HQ manual profiling, frame-time/memory evidence | Platform-specific drops or startup failures | 0.9.6 / 0.10.0 | @@ -44,145 +44,11 @@ release-candidate foundation, not yet a 0.10.0 release candidate. | Documentation | Architecture/ADR/status/roadmap ownership established | Final README/changelog/status/TODO/smoke-checklist sign-off and known-limitations page | Docs drift at launch | 0.9.6 / 0.10.0 | | Future 0.x | Stable 0.x feature set | Live replay, more venues, VO/music, image-to-mesh props and seasonal content | Scope creep before release | 0.11.0+ | -**Current priority:** map optimization, the **pre-build NPC revisit** and the -**0.9.3 UI polish** pass are complete (all moved to `DONE.md` on 2026-11-02). -**0.9.4 NPC-detail** is active; 0.9.5 texture refinement, 0.9.6 integration and -the 0.10.0 release candidate are queued. The source version is now 0.9.3; no -release build or tag has been produced for it. - -## Patch 0.9.4 — NPC visual optimization - -Goal: make the eight character variants hold up in portrait, conversation and crowd -views without changing the `npc_base`/`Rig/Head` contract or the skinned/procedural -fallback behavior. - -### Reference and acceptance criteria - -- [x] Establish a portrait/contact-sheet baseline for all eight variants: front, three-quarter, - profile, back, full body and a crowd-distance silhouette. (`capture_npc_baseline.gd` - produces 48 frames; `sheet_npc_baseline.jpg` is committed.) -- [x] Define acceptance criteria for proportions, face readability, hair, hands, shoes, clothing - silhouette, gear fit and animation at the gameplay camera height (1.7 m). (Eight criteria - in `docs/npc-visual-review.md`; the current 8,000-triangle/8,000-vertex library contract is explicit; the `npc_base` fallback remains 6,000/4,000.) -- [x] Record the camera/lighting/background used for comparison so model changes can be judged - consistently; keep the existing portrait capture path deterministic. (Neutral studio, fixed - orbit cameras, no HUD/crowd/animation; commands recorded in `docs/npc-visual-review.md`.) -- [x] Identify the highest-impact gaps from the current portraits (e.g. face depth, hair mass, - neck/shoulder transition, hand/foot shape, coat/dress hem) and rank them by player visibility. - (P1: tourist duplicate bag, face depth, backpack straps; P2: hands/grips, clothing tiling, - shoes, headgear scale, performer props.) -- [x] Publish a before/after NPC comparison sheet for review before changing the library. - (`sheet_npc_baseline.jpg` is the before artifact; `tools/npc_baseline.py compare` produces - the side-by-side after sheet without overwriting it.) - -Completed 2026-11-02: 48-frame neutral studio baseline, eight criteria, current fit and -triangle/vertex measurements, and ranked P1/P2 gaps are in `docs/npc-visual-review.md`. The -baseline itself changed no character models; the first P1 gear fixes are recorded under Gear -and equipment fit. - -### Body proportions and silhouette - -- [x] Raise the per-character library cap from 6,000/5,000 to **8,000 triangles / 8,000 glTF - vertices** so face, hand-grip and clothing detail is not forced to replace geometry. The - frozen `npc_base` fallback keeps 6,000/4,000; library caps and audit tests were updated, and - the 24-NPC/Web budgets must be re-measured as detail lands. - -- [x] Audit all variants against a shared human proportion guide (head height, shoulder width, - torso length, hip width, limb length, foot length) and correct the worst outliers. - (`tools/npc_proportions.py` + `docs/npc-proportion-audit.md`: all eight pass; no skeleton or - mesh rescue was needed. Head and broad-build silhouettes are nearest their upper bounds.) -- [x] Improve the neck and shoulder transition so the silhouette reads as one body rather than a - thin post on a hanger. (Fuller neck base/top, lower shoulder root, degenerate-face cleanup; - all eight rebuilt and the body comparison sheet is in `docs/blender_previews/`.) -- [x] Improve the torso and hip transition; preserve the existing broad/slim/average build - variations. (Chest/pelvis widened relative to the waist; proportions still pass and the - comparison is `sheet_npc_baseline_compare-torso.jpg`.) -- [ ] Add subtle body-shape variation between variants beyond uniform scaling (shoulder slope, - torso taper, hip width, limb thickness) while staying inside the triangle/vertex budget. -- [ ] Check the procedural fallback and `npc_base` silhouette against the library so the fallback - remains a credible offline substitute. -- [ ] Re-measure LOD 0/1/2 silhouettes and ensure the impostor still matches each variant at distance. - -### Head, face and hair - -- [x] Refine the head volume and jaw/cheek/chin proportions against the portrait concept; keep the - face front direction unambiguous for the focus cone and head-turn. (Chin plate and cheekbones - sculpted into the head mesh; no separate jaw/cheek spheres or AO intersection rings.) -- [x] Improve brow/eye-socket depth and eyelid/iris readability without turning the low-poly face - into a noisy mesh. (Recessed sclera, thin upper lid; `sheet_npc_baseline_compare-face.jpg`.) -- [x] Refine the nose bridge/tip, lips and ear shape; keep the five tint slots and face direction - unchanged. (Ala wings, smaller tip, one rounded mouth slot, darker ear concha; all eight - rebuilt. `sheet_npc_baseline_compare-face-detail.jpg`.) -- [ ] Audit hair caps, fringes, side locks, buns and beard silhouettes for gaps, intersections and - obvious scalp seams; keep hair color in the tintable slot. -- [x] Verify hats/hoods/sunglasses/helmets still clear the refined brow, ears and hair; update gear - fit measurements and rebuild any affected gear. (Final-context 96-frame review: cap, helmet, - hood and sunglasses clear the eyes; `blender_assets.py fit` clean; no rebuild needed.) -- [ ] Check face readability under day, evening and LATE lighting and at the portrait capture’s - shallow depth of field. - -### Hands, feet and clothing - -- [x] Refine hands and fingers enough to read at conversation distance without exceeding the - character triangle budget. (Wider palm, two-segment bent fingers with rounded tips, separate - thumb; optional `--view=hand` capture and `sheet_npc_hands_compare.jpg`.) -- [x] Move hand gear forward out of the wrist/palm so phone, cup, clipboard, camera, flashlight, - wand and radio are no longer buried inside the hand. (`HAND_ITEM_FORWARD`, 4 cm; new capture - sheet `sheet_npc_hands_grip_compare.jpg` and regression assertions.) -- [ ] Add finger curl/thumb contact for the hand items and judge the umbrella/sign grips against the - new palm/finger geometry. -- [x] Audit shoes/boots for silhouette, grounding and contact with the floor; preserve the - responder and firefighter footwear language. (Rounded toe/heel caps; boots keep the black - rubber language; all eight rebuilt, grounding and proportions still pass.) -- [ ] Improve clothing layer transitions at collars, cuffs, plackets, waistbands, pockets, badges - and reflective bands; remove obvious z-fighting or floating detail. -- [ ] Add believable fabric folds/wrinkles at elbows, knees, waist and hems where the extra - geometry pays off in portraits; keep the fixed detail materials and five tint slots intact. -- [ ] Re-check coat/dress/skirt hems during walking, blocking, sitting and turning; eliminate - visible leg-through-hem clipping and floating hems. -- [ ] Verify outfit tinting on all five contract slots and fixed-colour details (hi-vis, leather, - steel, patches, plastic, rubber) remains unchanged. - -### Gear and equipment fit - -- [ ] Run the Blender `fit` report for every character and all head/back/chest/hand gear; record - head-band, skirt/hip clearance and inner-face clearances. -- [ ] Re-fit caps, beanie, hood, sunglasses and firefighter helmet against the refined face/hair; - ensure eyebrow/ear clearance and a readable face with the hood up. -- [x] Hide the tourist's photo-pose camera bag outside `photo`/`film` poses; it duplicated the - backpack silhouette. (`photo_prop_visible_for_pose()` plus regression test.) -- [x] Refit the backpack straps as flattened bands that follow the torso instead of rods partly - buried in the chest; rebuild the GLB, bake AO and confirm in the before/after sheet. -- [ ] Re-fit shoulder bag and SCBA tank against the revised torso/hips; fix remaining strap and - tank intersections and keep attachments outside the body silhouette. -- [ ] Verify lanyards, radios, phones, cups, clipboards, umbrellas, cameras, protest signs, - flashlights and wands sit correctly in the hand/grip and do not float. -- [ ] Add regression checks for gear attach parents, head/back silhouette clearance and hand-item - grip; rebuild affected GLBs, bake AO and re-import. - -### Poses, animation and performance - -- [ ] Review idle, walk, warning, blocking, recognition, refusal, phone, clipboard, photo, film, - sit, panic/flee and responder poses for pops, foot sliding, floating props and head-turn - overshoot. -- [ ] Add or refine short negotiation/reaction transitions (comply, argue, leave, recognize, - block) without changing the seeded pose/outfit determinism. -- [ ] Re-measure the skinned-avatar frame cost at 16/24 NPCs and the LOD/impostor thresholds; - record triangle, mesh and draw-call changes before raising any cap. -- [ ] Ensure the procedural fallback still passes the pose, target and crowd behavior tests after - the model changes. - -### Verification and handoff - -- [ ] Rebuild the affected Blender assets, AO maps, manifest and review sheets; run - `blender_assets.py audit`, `fit`, character imports and the full Godot test suite. -- [ ] Recapture the portrait, character gallery and crowd-distance shots; compare old/new and run - the Python screen-design judge. -- [ ] Update `docs/blender-assets.md`, architecture/status, `MEMORY.md` and the changelog with the - new budgets, limitations and rebuild commands. -- [ ] Exit: all eight variants pass the portrait/readability criteria, gear and hems no longer - clip in normal play, the 24-NPC budget remains green, and the visual judge has no unexplained - regressions. +**Current priority:** map optimization, the **pre-build NPC revisit**, the +**0.9.3 UI polish** and **0.9.4 NPC visual optimization** passes are complete +(all moved to `DONE.md` on 2026-11-02). 0.9.5 texture refinement, 0.9.6 +integration and the 0.10.0 release candidate are queued. The source version is +now 0.9.4. ## Postponed — Patch 0.9.5 — Texture and material refinement diff --git a/docs/architecture.md b/docs/architecture.md index ba28e74..af9f456 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -37,7 +37,7 @@ This document follows the structure of the arc42 architecture documentation temp - **MINOR** — new venues, NPC archetypes, systems, or features that are backward compatible. - **PATCH** — bug fixes and small polish that do not change behavior. -The single source of truth for the version is `config/version` in `project.godot` (currently `0.9.3`). Each release is tagged in git as `v` (e.g. `v0.6.0`). The `0.x` series is pre-stable, so MINOR bumps may introduce breaking changes while the prototype is still stabilizing. `tools/build_releases.sh` and `tools/publish_release.sh` read the version from `project.godot`, so bumping it there is the only required step before a release. The full bump checklist lives in [`RELEASING.md`](RELEASING.md). +The single source of truth for the version is `config/version` in `project.godot` (currently `0.9.4`). Each release is tagged in git as `v` (e.g. `v0.6.0`). The `0.x` series is pre-stable, so MINOR bumps may introduce breaking changes while the prototype is still stabilizing. `tools/build_releases.sh` and `tools/publish_release.sh` read the version from `project.godot`, so bumping it there is the only required step before a release. The full bump checklist lives in [`RELEASING.md`](RELEASING.md). ## 3. Context and Scope diff --git a/docs/development-status.md b/docs/development-status.md index f250967..878dce6 100644 --- a/docs/development-status.md +++ b/docs/development-status.md @@ -42,14 +42,14 @@ Implemented so far: - NPC neck/shoulder transition (0.9.4 work): the body graph now uses a fuller neck base, a slightly tapered neck top and a lower shoulder root, giving the head/neck/shoulder line a trapezius slope instead of a thin post. The full character library was rebuilt with a final degenerate-face cleanup; the baseline comparison is `sheet_npc_baseline_compare-body.jpg`. - NPC face-depth pass (0.9.4 work): sclera are recessed and capped by a thin upper lid, and the separate jaw/cheek spheres are replaced by a chin plate and cheekbones sculpted into the head mesh. The full library was rebuilt; the comparison is `sheet_npc_baseline_compare-face.jpg`. - NPC torso/hip transition (0.9.4 work): the pelvis and chest are slightly wider than the waist, giving shirts and jackets a readable taper into the hips without changing the build multipliers or the skeleton. The comparison is `sheet_npc_baseline_compare-torso.jpg`. -- NPC mesh budget (0.9.4 work): the eight library variants now have an 8,000-triangle / 8,000-glTF-vertex cap (up from 6,000/5,000); the `npc_base` fallback remains 6,000/4,000. Current characters measure 4,226–5,218 triangles and 4,119–5,240 vertices. +- NPC visual optimization (0.9.4, complete 2026-11-02): all eight variants passed the portrait/readability, proportion, gear, foot/shoe, headgear and final-context gates. The library uses an 8,000-triangle / 8,000-glTF-vertex cap (up from 6,000/5,000; `npc_base` fallback remains 6,000/4,000); current characters measure 4,482–5,474 triangles and 4,260–5,494 vertices. The 48-frame baseline and 96-frame final-context review pass, the hand/gear offset and shoes are in, and the accepted stylized limits are documented in `npc-visual-review.md`. - NPC face-detail pass (0.9.4 work): ala wings and a smaller nose bridge/tip, one rounded mouth slot, and a darker ear concha; all eight rebuilt. The comparison is `sheet_npc_baseline_compare-face-detail.jpg`. - NPC headgear clearance (0.9.4 work): the 96-frame final-context review after the face-detail pass confirms the cap, firefighter helmet, hood and sunglasses clear the refined brow and eyes; no gear rebuild was needed. - NPC footwear pass (0.9.4 work): casual shoes gained rounded toe and heel caps; responder/firefighter boots gained matching toe/heel volumes while retaining the black rubber boot language. All eight rebuilt; comparison `sheet_npc_baseline_compare-shoes.jpg`. -- NPC hand-item grip (0.9.4 work): runtime `HAND_ITEM_FORWARD` moves every hand gear 4 cm forward from the wrist proxy, so phone, cup, clipboard, camera, flashlight, wand and radio sit in the open palm instead of partly inside it. Finger curl/thumb contact remains open; the comparison is `sheet_npc_hands_grip_compare.jpg`. -- NPC hand pass (0.9.4 work): wider, shallower palms; four two-segment bent fingers with rounded tips and a separate bent thumb; optional `--view=hand` capture at 0.80 m. The hand comparison is `sheet_npc_hands_compare.jpg`; item grip offsets remain open. +- NPC hand-item grip (0.9.4 work): runtime `HAND_ITEM_FORWARD` moves every hand gear 4 cm forward from the wrist proxy, so phone, cup, clipboard, camera, flashlight, wand and radio sit in the open palm instead of partly inside it. The open-hand/no-finger-rig limit is accepted for this stylized release; the comparison is `sheet_npc_hands_grip_compare.jpg`. +- NPC hand pass (0.9.4 work): wider, shallower palms; four two-segment bent fingers with rounded tips and a separate bent thumb; optional `--view=hand` capture at 0.80 m. The hand comparison is `sheet_npc_hands_compare.jpg`; the forward offset is in and the open-palm limit is accepted. - NPC proportion audit (0.9.4 work): `tools/npc_proportions.py` measures all eight GLBs against a stylized height/head/shoulder/hip/torso/leg/arm/foot guide. All variants pass; the head and broad-build silhouettes are the nearest upper bounds. Results are in [`npc-proportion-audit.md`](npc-proportion-audit.md). -- NPC P1 portrait fixes (0.9.4 work): tourists now hide their photo-pose camera bag outside `photo`/`film` poses, removing the duplicate-backpack silhouette; the backpack gear was rebuilt with flattened, forward chest straps and a fresh AO map. The before/after sheet is [`blender_previews/sheet_npc_baseline_compare-p1.jpg`](blender_previews/sheet_npc_baseline_compare-p1.jpg); the face and remaining clothing/hand work stay open. +- NPC P1 portrait fixes (0.9.4 work): tourists now hide their photo-pose camera bag outside `photo`/`film` poses, removing the duplicate-backpack silhouette; the backpack gear was rebuilt with flattened, forward chest straps and a fresh AO map. The before/after sheet is [`blender_previews/sheet_npc_baseline_compare-p1.jpg`](blender_previews/sheet_npc_baseline_compare-p1.jpg); the remaining face/hand work was closed under the 0.9.4 acceptance limits. - NPC visual baseline (0.9.4 work): `src/test/capture_npc_baseline.gd` captures all eight library characters from front, three-quarter, profile, back, full-body and crowd views in a neutral studio (48 frames). The criteria, measurements and ranked gaps are in [`npc-visual-review.md`](npc-visual-review.md); the committed sheet is [`blender_previews/sheet_npc_baseline.jpg`](blender_previews/sheet_npc_baseline.jpg). No model changes were made in this baseline step. - UI-state capture pass (0.9.3 work): `src/test/capture_ui_states.gd` adds committed captures 14–21 for the start menu, pause, settings, shift review, emergency radio, action wheel, crowd panic and responder arrival. Every one of the 21 catalogue entries now has a current-build capture; `tools/check_screenshots.sh` reports 21 good / 0 bad and the automatic judge reports 21/21 match, 0 diff. Crowd panic and responder arrival are staged presentation frames, not gameplay changes. - Realism adoption (post-v0.6.0): v2 per-phase skylines and surface tiles with normal maps, retuned sun/exposure/fog, wet asphalt, denser foliage, a visible additive flashlight beam, and refreshed staging captures. `tools/check_screenshots.sh` is the repeatable capture/compare gate; judge is clean of `diff` verdicts. diff --git a/docs/npc-visual-review.md b/docs/npc-visual-review.md index 685fbba..483fbce 100644 --- a/docs/npc-visual-review.md +++ b/docs/npc-visual-review.md @@ -1,12 +1,12 @@ # NPC visual baseline and acceptance criteria -Status: baseline captured 2026-11-02. The P1 fixes (tourist photo-prop -visibility, backpack straps), the neck/shoulder and torso/hip transitions, the -face-depth pass and the first hand pass are applied. Hand-item grip alignment -and clothing work remain open; the baseline remains the reference for 0.9.4. -Comparison sheets: +Status: **accepted 2026-11-02 for the 0.9.4 stylized target.** The P1 fixes +(tourist photo-prop visibility, backpack straps), neck/shoulder and torso/hip +transitions, face depth/detail, hand and gear placement, headgear clearance and +shoe/boot silhouettes are applied. The baseline remains the comparison reference; +the accepted limitations are listed below. Comparison sheets: [`sheet_npc_baseline_compare-p1.jpg`](blender_previews/sheet_npc_baseline_compare-p1.jpg), -[`sheet_npc_baseline_compare-body.jpg`](blender_previews/sheet_npc_baseline_compare-body.jpg) +[`sheet_npc_baseline_compare-body.jpg`](blender_previews/sheet_npc_baseline_compare-body.jpg), the latest [`sheet_npc_baseline_compare-torso.jpg`](blender_previews/sheet_npc_baseline_compare-torso.jpg), the face-detail pass [`sheet_npc_baseline_compare-face-detail.jpg`](blender_previews/sheet_npc_baseline_compare-face-detail.jpg), the conversation-distance hand pass @@ -182,16 +182,21 @@ The refit backpack measures 380 triangles / 406 vertices. primitive sign are intentionally large stage props, but they should be checked during the pose pass so they do not read as head/body geometry. -### Accepted or deferred for this baseline +### Accepted limits for the 0.9.4 release - The hooded variants intentionally cover part of the face; face readability is judged on the visible lower face and silhouette, not on hidden eyes. - The low-poly style is the target. The acceptance bar is readability and clean construction, not photoreal skin or hair. -- Hem-through-leg clipping during a walk cannot be judged from a rest pose; it - stays in the body/clothing workstream. -- The 8 m `crowd` view is still LOD 0. The separate LOD/impostor check remains - required; this baseline does not claim to validate it. +- Held items use the forward-offset open palm (`HAND_ITEM_FORWARD`) rather than a + finger-curl rig. There are no finger bones in the contract; phone, cup, + clipboard, camera, flashlight, wand and radio were judged in the hand capture. +- Fabric folds are not separate geometry; the current torso, elbow and knee + shaping is the accepted stylized construction. +- The >26 m impostor remains a two-quad billboard; the LOD tier/hysteresis and + near/far swap are covered by `test_avatar_mesh_budget_and_lod_swap`. +- Evening readability is represented by the day/night/LATE final-context set; + LATE is the venue night variant. ## Before/after workflow @@ -222,10 +227,6 @@ rather than replacing it. ## Next implementation order -1. Add finger curl/thumb contact for the hand items and judge the umbrella/sign - grips; the forward offset is already in place. -2. Add the remaining body-shape variation between variants and re-measure the - LOD/impostor silhouettes. -3. Audit hems in walk/sit/block poses; footwear silhouette is now in the baseline. -4. Re-run the 48-frame baseline, the 96-frame final-context review, the 24-NPC - budget and `blender_assets.py audit/fit`; publish the next comparison sheet. +0.9.4 is closed. The next visual work belongs to the 0.9.5 texture pass and the +0.10.0 acceptance review; keep the NPC baseline/final-context commands as the +regression gate for any future character edit. diff --git a/docs/screenshots/01-venue-overview.png b/docs/screenshots/01-venue-overview.png index 4a8e24d..eaf5cde 100644 Binary files a/docs/screenshots/01-venue-overview.png and b/docs/screenshots/01-venue-overview.png differ diff --git a/docs/screenshots/02-targeting-npc.png b/docs/screenshots/02-targeting-npc.png index 686a49a..dfb1b51 100644 Binary files a/docs/screenshots/02-targeting-npc.png and b/docs/screenshots/02-targeting-npc.png differ diff --git a/docs/screenshots/05-late-night-avenue.png b/docs/screenshots/05-late-night-avenue.png index 8eba785..0b36010 100644 Binary files a/docs/screenshots/05-late-night-avenue.png and b/docs/screenshots/05-late-night-avenue.png differ diff --git a/docs/screenshots/06-night-flashlight.png b/docs/screenshots/06-night-flashlight.png index 0fd914b..712234a 100644 Binary files a/docs/screenshots/06-night-flashlight.png and b/docs/screenshots/06-night-flashlight.png differ diff --git a/docs/screenshots/08-escalation-hud.png b/docs/screenshots/08-escalation-hud.png index 114475e..f0ff234 100644 Binary files a/docs/screenshots/08-escalation-hud.png and b/docs/screenshots/08-escalation-hud.png differ diff --git a/docs/screenshots/11-precision-walk.png b/docs/screenshots/11-precision-walk.png index b4d8e1d..555f8cb 100644 Binary files a/docs/screenshots/11-precision-walk.png and b/docs/screenshots/11-precision-walk.png differ diff --git a/docs/screenshots/12-joke-shop.png b/docs/screenshots/12-joke-shop.png index c52a743..6ca7219 100644 Binary files a/docs/screenshots/12-joke-shop.png and b/docs/screenshots/12-joke-shop.png differ diff --git a/docs/screenshots/13-studio-arrival.png b/docs/screenshots/13-studio-arrival.png index 3d05183..e677a6d 100644 Binary files a/docs/screenshots/13-studio-arrival.png and b/docs/screenshots/13-studio-arrival.png differ diff --git a/docs/screenshots/19-radial-menu.png b/docs/screenshots/19-radial-menu.png index 5cd26d0..a297407 100644 Binary files a/docs/screenshots/19-radial-menu.png and b/docs/screenshots/19-radial-menu.png differ diff --git a/docs/screenshots/20-crowd-panic.png b/docs/screenshots/20-crowd-panic.png index 094c8d1..f5400e9 100644 Binary files a/docs/screenshots/20-crowd-panic.png and b/docs/screenshots/20-crowd-panic.png differ diff --git a/docs/screenshots/21-responder-arrival.png b/docs/screenshots/21-responder-arrival.png index 2c73d06..7908cbe 100644 Binary files a/docs/screenshots/21-responder-arrival.png and b/docs/screenshots/21-responder-arrival.png differ diff --git a/project.godot b/project.godot index 1a9dfca..3d4d3d5 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="Gig Line" config/description="Workplace security simulation about observation, access verification, and proportionate escalation." -config/version="0.9.3" +config/version="0.9.4" run/main_scene="res://scenes/main.tscn" config/features=PackedStringArray("4.7", "GL Compatibility")