Files
security-game/docs/npc-visual-review.md
T
zwitschi c8875a3dfa
Full build / Import + headless tests (push) Successful in 44s
Full build / Full desktop build + optional release (push) Skipped
Turn the NPC visual review into the 0.9.9 roster signoff page with committed sheets
2026-11-06 14:05:49 +01:00

110 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NPC roster visual review — 0.9.9 signoff
**Status: awaiting owner visual signoff.** This page is the single review point for the
Quaternius roster swap that shipped in 0.9.9
([ADR-0017](adr/0017-quaternius-npc-base.md), [ADR-0018](adr/0018-quaternius-stage2-runtime-rig.md)).
Every character name the game ships is captured here at gameplay distance, in three studio views,
and in the three animation poses the runtime drives.
Until this page is signed off, the roster swap is reversible: the procedural library and the
MakeHuman head are still in the tree and still pass `audit`, `inspect`, `npc_proportions` and the
tests (`build --source procedural`).
## 1. Full-body roster (12 roles)
One tile per shipped character, neutral studio, camera at 4.2 m.
![NPC roster full body](blender_previews/sheet_npc_roster_0.9.9.jpg)
## 2. Front and profile per role
Front row set, then profile. Use this to judge the silhouette, the head size and the gear placement
without perspective hiding anything.
![NPC roster front and profile](blender_previews/sheet_npc_roster_views_0.9.9.jpg)
## 3. Animation poses (idle / sit / walk contact)
Six representative roles × three poses, driven by the real `_animate()` path with the FSM frozen.
Check: arms hang instead of holding an A-pose, the seated pose puts the forearms on the thighs and
keeps the shins down, the walk contact keeps limbs in contralateral opposition, and no limb
pinches or detaches at the shoulder, elbow, hip or knee.
![NPC roster poses](blender_previews/sheet_npc_roster_poses_0.9.9.jpg)
## 4. Crowd distance (8 m)
The distance the player actually sees a passer-by from the sidewalk.
![NPC roster at crowd distance](blender_previews/sheet_npc_roster_crowd_0.9.9.jpg)
## Signoff checklist
Tick each row. Anything you reject is a concrete task rather than an opinion, so it can go
straight into `TODO.md`.
| # | Question | Verdict |
| --- | --- | --- |
| 1 | Do the twelve characters read as distinct people at 8 m? | ☐ yes ☐ no |
| 2 | Is the head size right for the body (no bobblehead, no pinhead)? | ☐ yes ☐ no |
| 3 | Do the faces hold up at portrait distance? | ☐ yes ☐ no |
| 4 | Do the hands and the hand-held gear (camera, cup, clipboard, sign) read correctly? | ☐ yes ☐ no |
| 5 | Does the head gear (cap, hood, sunglasses, firefighter helmet) sit on the skull? | ☐ yes ☐ no |
| 6 | Are the role outfits believable for a Hollywood-boulevard shift (tourist, delivery, guard, responder)? | ☐ yes ☐ no |
| 7 | Are the seeded tint palettes acceptable, or too pastel/saturated? | ☐ yes ☐ no |
| 8 | Do the seated and walking poses hold up? | ☐ yes ☐ no |
**Signoff:** ☐ approved as shipped ☐ approved with the follow-ups below ☐ rejected
## Issues visible in the captures
Found while building this page; none blocks the swap, all are queued in `TODO.md`:
1. **`npc_dress` wears the performer cone hat plus the protest sign** because the performer props
are procedural and scaled for the old body. The dress itself has no geometry anymore — the role
is the `casual` base with a dress tint.
2. **`npc_coat` and `npc_hoodie`** are the hoodie base with a coat/hood tint; the raised hood and
the long coat silhouette are gone.
3. **The `npc_vest` clipboard** reads oversized at 0.23 × 0.31 m on the shorter Quaternius arm.
4. **The firefighter helmet brim** is 1.55× the head width — realistic for the helmet, but it reads
as a wide-brim hat next to the small head.
5. **Skin and cloth read pale** on the `hoodie` and `worker` bases; the seeded palette was tuned
against the procedural library's darker cloth.
6. **Roster variety is three meshes for twelve roles.** Tint and gear carry the difference; the
modular part library is the fix.
## Measured facts for this build
| Metric | Value |
| --- | --- |
| Characters | 12, all on the Quaternius 62-joint rig |
| Triangles per character | 4,458 (`worker` minus vest) … 6,424 (`casual`) |
| glTF vertices per character | 9,370 … 13,440 |
| Budget | 24,000 tris / 24,000 verts per character |
| Tint slots | `skin`, `cloth`, `pants`, `hair`, `accessory`, plus fixed detail |
| Texel density | 73–74 px/m on the 256² maps |
| Height | 1.817–1.881 m |
| 24-NPC frame budget | 160,608 tris, 0.84 ms average frame (budget 50 ms) |
| Gates | `inspect` clean, `audit` 12/12, `fit` OK, Godot 278/278, Python 167/167 |
## Reproducing the captures
```sh
godot --path . --script res://src/test/capture_npc_baseline.gd -- --out=res://tmp/npc-signoff
godot --path . --script res://src/test/capture_npc_pose.gd -- --out=res://tmp/npc-signoff-pose \
--pose=idle # repeat for sit and walk_contact
```
## Superseded
This page previously carried the **0.9.4 procedural library** baseline (eight hand-built
characters, the face/hand/neck fixes, the 13-core proportion audit). That mesh no longer ships, so
the text is retired; the comparison sheets stay in `blender_previews/` as history:
`sheet_npc_baseline_compare-p1.jpg`, `-body.jpg`, `-torso.jpg`, `-face-detail.jpg`,
`sheet_npc_hands_compare.jpg`, `sheet_npc_hands_grip_compare.jpg`.
The current source evaluation and per-character build table live in
[`npc-model-sourcing.md#shipped-roster-099-owner-chose-the-full-swap`](npc-model-sourcing.md#shipped-roster-099-owner-chose-the-full-swap);
the face options that led to the full swap are in
[`screens/npc-face-gate/`](screens/npc-face-gate/README.md).