Release 0.9.4 NPC visual optimization
No files matched your search
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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<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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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<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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 547 KiB After Width: | Height: | Size: 547 KiB |
|
Before Width: | Height: | Size: 661 KiB After Width: | Height: | Size: 659 KiB |
|
Before Width: | Height: | Size: 385 KiB After Width: | Height: | Size: 383 KiB |
|
Before Width: | Height: | Size: 405 KiB After Width: | Height: | Size: 406 KiB |
|
Before Width: | Height: | Size: 567 KiB After Width: | Height: | Size: 567 KiB |
|
Before Width: | Height: | Size: 830 KiB After Width: | Height: | Size: 830 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
@@ -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")
|
||||
|
||||
|
||||