8.2 KiB
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-0018). 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.
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.
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.
4. Crowd distance (8 m)
The distance the player actually sees a passer-by from the sidewalk.
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? | [x] yes [ ] no |
| 2 | Is the head size right for the body (no bobblehead, no pinhead)? | [x] yes [ ] no |
| 3 | Do the faces hold up at portrait distance? | [ ] yes [x] no |
| 4 | Do the hands and the hand-held gear (camera, cup, clipboard, sign) read correctly? | [ ] yes [x] no |
| 5 | Does the head gear (cap, hood, sunglasses, firefighter helmet) sit on the skull? | [ ] yes [x] no |
| 6 | Are the role outfits believable for a Hollywood-boulevard shift (tourist, delivery, guard, responder)? | [x] yes [ ] no |
| 7 | Are the seeded tint palettes acceptable, or too pastel/saturated? | [x] yes [ ] no |
| 8 | Do the seated and walking poses hold up? | [x] yes [ ] no |
Signoff: [ ] approved as shipped [x] approved with the follow-ups below [ ] rejected
Issues visible in the captures
The first review pass found three body defects. All three came from the build pipeline, not the art, and all three are addressed in the second pass (2026-11-06):
| Finding | Cause | Status |
|---|---|---|
npc_guard has holes in the upper body |
the build deleted the Worker_Vest material, and on the modular Worker the vest is the torso |
fixed — the vest is now the cloth slot, tinted per role; nothing is deleted |
npc_firefighter, npc_crowd_d have a broken shoulder/upper-body area |
same cause, plus the deleted Worker_Yellow hat was the crown of the skull, leaving the head open |
fixed — the hat/crown stays in the mesh and only the part above z 1.65 takes the hair tint |
npc_guard, npc_vest, npc_crowd_d have one big unibrow |
the Worker's Eyebrows material is one continuous bar, and no other upstream head has brows that fit this mesh |
replaced — the bar is cut out and the hoodie's two brows are transplanted onto the Worker head, lifted above the eye quads |
npc_dress, npc_jacket, npc_crowd_a, npc_crowd_d arms intersect the body |
the baked rest aimed the upper arm straight down, which works on the wide bases but not the narrow ones | reduced — the arm now rests 7° out from vertical (mesh width 0.180 → 0.220 on casual, 0.228 → 0.262 on hoodie); a light clip remains on the worker bases |
Follow-up pass (same day) went further on the Worker head, which still read as a hard hat under the bare tint:
| Finding | Fix |
|---|---|
| crown still shaped like a hard hat | the hoodie's hair is transplanted onto the Worker head and the hat faces above the collar are cut away, so guard/responder/crowd_d have hair |
| the dark bar was the Worker's eye quads, not only the brow bar | the eye quads are removed too; the face now reads brows + moustache |
| performer cone swallowed the head, and the performer/protester props floated beside the body | _add_props() now parents carried props to the hand proxies and the cone shrank from a 0.44 m to a 0.25 m base |
Re-verified after the fix with the sheets below and the vision judge: no holes or missing geometry on any of the three Worker-based roles.
Still open — checklist rows 3, 4 and 5 plus the list below: the Worker crown still reads as a
hard hat because that is upstream geometry, the eye/brow mass still reads heavy at portrait
distance, and the arms still graze the torso on the worker base.
Found by user:
- npc_firefighter, npc_guard and npc_crowd_d have errors in the body:
- npc_guard has "holes" in upper body
- npc_firefighter and npc_crowd_d have buggy shoulder and upper body area
- npc_guard, npc_vest and npc_crowd_d have one large unibrow: use other character's eyebrow geometry instead.
- npc_dress, npc_jacket, npc_crowd_a and npc_crowd_d arms are too close and intersecting the body
Found while building this page; none blocks the swap, all are queued in TODO.md:
npc_dresswears 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 thecasualbase with a dress tint.npc_coatandnpc_hoodieare the hoodie base with a coat/hood tint; the raised hood and the long coat silhouette are gone.- The
npc_vestclipboard reads oversized at 0.23 × 0.31 m on the shorter Quaternius arm. - 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.
- Skin and cloth read pale on the
hoodieandworkerbases; the seeded palette was tuned against the procedural library's darker cloth. - 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
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;
the face options that led to the full swap are in
screens/npc-face-gate/.



