Release 0.9.4 NPC visual optimization

This commit is contained in:
zwitschi committed 2026-11-02 19:51:36 +01:00
1 parent dfe5056303
commit 60a8b7ff08
21 files changed
+195 -184

No files matched your search

+1 -1
View File
@@ -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 [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions use
Semantic Versioning. Semantic Versioning.
## [Unreleased] ## [0.9.4] — 2026-11-02
### Changed ### Changed
+143
View File
@@ -1735,3 +1735,146 @@ screen-design judge before any model/texture changes. No gameplay rules change.
diff. 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. 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.
+9 -8
View File
@@ -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()` 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 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. 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 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** **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 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 major-version scope is defined yet. The v0.9.4 tag is the release trigger; no
for 0.9.3. tag was created for 0.9.3.
- **Priority change (2026-11-02):** the map optimization, pre-build NPC revisit and - **Priority change (2026-11-02):** the map optimization, pre-build NPC revisit,
0.9.3 UI polish are complete and in `DONE.md`. The 0.9.4 NPC detail, 0.9.5 0.9.3 UI polish and 0.9.4 NPC visual optimization are complete and in `DONE.md`.
textures and 0.9.6 integration/0.10.0 release work are next. The current source 0.9.5 textures and 0.9.6 integration/0.10.0 release work are next. The current
version is 0.9.3; no release build or tag has been produced. 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 - **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 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 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 `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 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 0.9.4–0.10.0 work. The project uses a custom headless runner, not GUT, and Gitea Actions, not
GitHub Actions. GitHub Actions.
+1 -1
View File
@@ -176,7 +176,7 @@ Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [AD
## Versioning and Delivery ## Versioning and Delivery
`config/version` in `project.godot` is the single version source (currently `0.9.3`). Releases are tagged `v<version>`; 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<version>`; 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 ## Design Direction
+9 -9
View File
@@ -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 > Downloads are public (no sign-in required) since the host's instance-wide
> `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31. > `REQUIRE_SIGNIN_VIEW` was disabled on 2026-10-31.
> >
> **Latest published: v0.9.1** — unified Godot 4.7.2 CI/release environment, plus > **Latest published: v0.9.4** — the NPC visual optimization pass: face/head
> v0.9.0's production-quality and v0.8 tutorial/campaign/resume work. > 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 > **Current source: v0.9.4** — tagged and built from the same commit.
> Hollywood/Joke Shop map rebuilds and the NPC final-context review; the release
> tag is pending.
> Releases are built automatically when a `vX.Y.Z` tag is pushed > Releases are built automatically when a `vX.Y.Z` tag is pushed
> (see [`docs/RELEASING.md`](docs/RELEASING.md)); manual builds use > (see [`docs/RELEASING.md`](docs/RELEASING.md)); manual builds use
> `./tools/build_releases.sh`. Installer/AppImage packaging runs in the same pipeline > `./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 ## Development Status
v0.9.3 is the current source version: the completed UI/accessibility polish v0.9.4 is the current source version: the completed NPC visual optimization
pass (dialogue, button states, focus/navigation, modal close, long-string layout, (face/head depth, hands and gear placement, shoes/boots, headgear clearance and
destructive-action guards and full screen capture coverage), on top of v0.9.2's the 8,000/8,000 mesh budget), on top of the v0.9.3 UI/accessibility polish
Hollywood/Joke Shop map rebuilds and NPC final-context review. It builds on 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 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) 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 for the implemented list and [`TODO.md`](TODO.md) for the 0.x roadmap. Manual
+7 -141
View File
@@ -5,7 +5,7 @@ see `AGENTS.md` for the workflow and `MEMORY.md` for the decisions behind these
## Gap Analysis and 0.x Roadmap ## 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 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 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 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 | | 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) | | 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 | | 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 | | 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 | | 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 | | 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+ | | 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 **Current priority:** map optimization, the **pre-build NPC revisit**, the
**0.9.3 UI polish** pass are complete (all moved to `DONE.md` on 2026-11-02). **0.9.3 UI polish** and **0.9.4 NPC visual optimization** passes are complete
**0.9.4 NPC-detail** is active; 0.9.5 texture refinement, 0.9.6 integration and (all moved to `DONE.md` on 2026-11-02). 0.9.5 texture refinement, 0.9.6
the 0.10.0 release candidate are queued. The source version is now 0.9.3; no integration and the 0.10.0 release candidate are queued. The source version is
release build or tag has been produced for it. now 0.9.4.
## 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.
## Postponed — Patch 0.9.5 — Texture and material refinement ## Postponed — Patch 0.9.5 — Texture and material refinement
+1 -1
View File
@@ -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. - **MINOR** — new venues, NPC archetypes, systems, or features that are backward compatible.
- **PATCH** — bug fixes and small polish that do not change behavior. - **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<version>` (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<version>` (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 ## 3. Context and Scope
+4 -4
View File
@@ -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 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 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 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 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 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 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-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`; item grip offsets remain open. - 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 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. - 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. - 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. - 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.
+19 -18
View File
@@ -1,12 +1,12 @@
# NPC visual baseline and acceptance criteria # NPC visual baseline and acceptance criteria
Status: baseline captured 2026-11-02. The P1 fixes (tourist photo-prop Status: **accepted 2026-11-02 for the 0.9.4 stylized target.** The P1 fixes
visibility, backpack straps), the neck/shoulder and torso/hip transitions, the (tourist photo-prop visibility, backpack straps), neck/shoulder and torso/hip
face-depth pass and the first hand pass are applied. Hand-item grip alignment transitions, face depth/detail, hand and gear placement, headgear clearance and
and clothing work remain open; the baseline remains the reference for 0.9.4. shoe/boot silhouettes are applied. The baseline remains the comparison reference;
Comparison sheets: 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-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 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 face-detail pass [`sheet_npc_baseline_compare-face-detail.jpg`](blender_previews/sheet_npc_baseline_compare-face-detail.jpg),
the conversation-distance hand pass 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 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. 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 - The hooded variants intentionally cover part of the face; face readability is
judged on the visible lower face and silhouette, not on hidden eyes. 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 - The low-poly style is the target. The acceptance bar is readability and clean
construction, not photoreal skin or hair. construction, not photoreal skin or hair.
- Hem-through-leg clipping during a walk cannot be judged from a rest pose; it - Held items use the forward-offset open palm (`HAND_ITEM_FORWARD`) rather than a
stays in the body/clothing workstream. finger-curl rig. There are no finger bones in the contract; phone, cup,
- The 8 m `crowd` view is still LOD 0. The separate LOD/impostor check remains clipboard, camera, flashlight, wand and radio were judged in the hand capture.
required; this baseline does not claim to validate it. - 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 ## Before/after workflow
@@ -222,10 +227,6 @@ rather than replacing it.
## Next implementation order ## Next implementation order
1. Add finger curl/thumb contact for the hand items and judge the umbrella/sign 0.9.4 is closed. The next visual work belongs to the 0.9.5 texture pass and the
grips; the forward offset is already in place. 0.10.0 acceptance review; keep the NPC baseline/final-context commands as the
2. Add the remaining body-shape variation between variants and re-measure the regression gate for any future character edit.
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.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 547 KiB

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 661 KiB

After

Width:  |  Height:  |  Size: 659 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 385 KiB

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 405 KiB

After

Width:  |  Height:  |  Size: 406 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 KiB

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 830 KiB

After

Width:  |  Height:  |  Size: 830 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

+1 -1
View File
@@ -12,7 +12,7 @@ config_version=5
config/name="Gig Line" config/name="Gig Line"
config/description="Workplace security simulation about observation, access verification, and proportionate escalation." 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" run/main_scene="res://scenes/main.tscn"
config/features=PackedStringArray("4.7", "GL Compatibility") config/features=PackedStringArray("4.7", "GL Compatibility")