Rewrite NPC plans around the Quaternius base

This commit is contained in:
zwitschi committed 2026-11-05 19:43:35 +01:00
1 parent 2e1bb19e2c
commit 9968bc0a4c
17 files changed
+364 -536

No files matched your search

+82 -304
View File
@@ -3,281 +3,105 @@
Work is grouped by theme. Each item should be small enough to complete and verify on its own;
see `AGENTS.md` for the workflow and `MEMORY.md` for the decisions behind these plans.
**Priority order (2026-11-04, owner):** 1) **Blender NPC model overhaul** — head, face and hands
with a local part pipeline; 2) finish the MakeHuman character + the 3D model and map improvements;
3) ship it together in the **0.10.0 minor**. The 0.9.7/0.9.8 character patches are published. See
`AGENTS.md` §Priority and Versioning and §Local Blender skills.
**Priority order (2026-11-05, owner):** 1) **Quaternius NPC base migration** — use the CC0
Quaternius character as the mesh/animation source and bake it to the runtime contract; 2) the 3D
model and local map improvements; 3) ship it together in the **0.10.0 minor**. The 0.9.7/0.9.8
character patches are published. See `AGENTS.md` §Priority and Versioning and §Local Blender skills.
The MIT Blender skill pack lives locally at `.agents/skills/blender-skills/` (gitignored). Every
3D workstream below names the skills to load; they are guidance only, and the project contract,
`blender_assets.py audit`/`fit`/`inspect` and the capture gates stay authoritative.
## Blender NPC model overhaul (top priority)
## Quaternius NPC base migration (top priority)
Goal: replace the sphere-and-primitive face and hand construction with a local, part-based
development pipeline that can build, inspect and compare the **head/face** and **hands** separately
before assembling them into the shipped character. Prioritise face readability at portrait
distance, then hand silhouette and gear contact. Preserve the `npc_base` contract, the 13 core-bone rig (optional extra bones allowed),
five tint slots, 24,000/24,000 character cap, optional extra bones beyond the required 13, and the Compatibility/Web path.
Goal: replace the generator-first NPC base with the CC0 **Quaternius Ultimate Modular
Characters** as the primary mesh and animation source, while keeping one committed
`npc_base` skinned mesh, the five tint slots and a runtime contract that Godot, gear
and tests can consume. The detailed decision is [ADR-0017](docs/adr/0017-quaternius-npc-base.md);
it supersedes the generator-first sourcing decision in ADR-0015.
*Skill route: `character-artist`, `retopology`, `sculpting`, `rigging`, `uv-workflow`,
`texture-workflow`, `materials`, `lookdev`, `asset-optimization`, `qa-review`.*
**Why:** the research pack already has a coherent low-poly human silhouette, 21 modular
outfits and 24 animations. The current procedural body needs a separate head, hands, neck
and shoe pipeline to look human; using Quaternius as the base removes that bespoke body work.
**Current state:** `assets/models/npc/` contains the tracked frozen `npc_base.blend` and its
gitignored `.blend1`; the 12 production characters are assembled procedurally by
`tools/blender_assets.py` from `_shape_head_mesh`, `_face`, `_hair` and `_hands_and_shoes`.
The MakeHuman head is now a second head source (`build_character(head="mh")`,
`build --head mh`, `npc_parts.py assemble --head mh`) and all 12 variants assemble inside the
24,000-triangle cap with it. The procedural body, hands and clothing remain unchanged. The
MakeHuman body prototype and its temporary head/hand swap live under `tmp/npc-research/` and are
not the shipped path. This overhaul supplies the reusable head/face and hand parts that both the
procedural characters and the MakeHuman body can consume.
**Default path (Stage 1):** retarget and proportion-warp the Quaternius mesh onto the
existing 13-core contract, so `NpcAvatar`, gear attach points and the current animation
composition keep working. The 62-joint Quaternius rig and its 24 clips are an authoring
source, not a new runtime dependency.
This workstream supersedes the face/head and hands items in §C until the prototypes are approved;
the rest of §C remains the broad review checklist.
**Stage 2 gate:** if the proportion warp cannot preserve the Quaternius silhouette and
deformation at an acceptable level, stop the rollout and write a new ADR for adopting the
62-joint rig at runtime. Do not ship a hybrid rig or silently change `NpcAvatar`.
### 1. Baseline and acceptance
**Exit:** one committed Quaternius-derived source GLB produces all 12 variants inside
24,000 tris / 24,000 glTF vertices, with five slots, gear fit, Idle/Walk deformation,
`audit`/`fit`/`inspect` clean, the 24-NPC budget measured, and an owner-approved 12 × 6
baseline sheet.
- [x] Inventory the real starting point: the frozen `assets/models/npc/npc_base.blend`, the 12
generated character GLBs/AO maps, the current `_face`/`_hands_and_shoes` builders and the
temporary MakeHuman head/hand swap. Recorded tris/verts, head subdivision, material slots,
UV layout and the exact locations of eye/mouth/finger geometry in
`docs/3d-model-review.md` §Baseline inventory.
- [x] Define measurable acceptance: face front/three-quarter/profile at 1.5 m and 1.85 m; hands
open and gripping at 0.8 m; silhouette, eye/mouth readability, ear/nose/jaw planes, finger
separation and gear contact. Keep the 24,000/24,000 cap; optional extra bones are allowed, but the required 13 core bones and rest positions must not move.
Recorded in `docs/3d-model-review.md` §Overhaul acceptance criteria.
- [x] Confirm the identity boundary: `npc_base.blend` is the frozen fallback and must not absorb
prototype detail unless a separate contract decision approves it.
Recorded in `docs/3d-model-review.md` §Baseline inventory and
`docs/blender-assets.md` §Frozen fallback boundary.
- [x] Choose a local working-set layout: `tmp/npc-parts/<variant>/` (gitignored) for part `.blend`
and preview GLBs; only the assembled character GLBs, AO/maps, manifest and review sheets are
committed. Do not add a new committed `.blend` source tree without a docs/ADR decision.
Recorded in `docs/3d-model-review.md` §Working-set layout and
`docs/asset-tooling.md` §Recommended part-workflow.
### 1. Intake and canonical base
### 2. Local part pipeline
- [ ] Keep the three researched CC0 GLBs (`Casual`, `Casual_Hoodie`, `Worker`) plus the
licence/mirror notes in `tmp/npc-research/quaternius/`; record the source URL,
licence, SHA-256 and download date in `docs/npc-model-sourcing.md`.
- [ ] Inventory the four meshes, 62 joints, 24 clips and material names in each GLB; map
Quaternius materials to the five project slots (`skin`, `cloth`, `pants`, `accessory`,
`hair`).
- [ ] Choose the initial outfit scope: build the three full GLBs first; only use the 21-part
modular builder if the three looks cannot cover the 12 roles.
- [ ] Build a canonical `quaternius_base.glb`: one welded, triangulated, grounded 1.81 m
humanoid with front on Blender −Y, no animation, and a documented bone/part inventory.
- [x] Add `tools/npc_parts.py` with a small, documented CLI:
`extract` (pull the current head/hands for comparison), `build --part head|face|hand_l|hand_r`,
`assemble --variant <name>`, `inspect`, `compare` and `sheet`. It reuses the existing
builder helpers (`blender_assets.py` `_face`/`_hands_and_shoes`/`_shape_head_mesh`); no
second face/hand implementation. Verified end-to-end: built `head`/`face`/`hand_l`/`hand_r`,
extracted `hand_l` from the shipped GLB, assembled `npc_casual` (contract inspect: no issues).
- [x] Keep the part pipeline local-only and headless: flatpak Blender for authoring, stdlib/Pillow
for inspection and sheets. No Blender MCP dependency, no new runtime dependency, no CI
Blender step.
- [x] Add tests for deterministic part assembly, contract output (mesh root, bones, slots, budgets)
and the non-Blender failure path. `tools/tests/test_npc_parts.py` covers the part-name set,
the clean Blender-required error path, sheet/compare error paths and a real-PNG sheet. The
assembled prototype passes `inspect` (npc_base, 14 bones, skinned, no issues).
- [x] Consider optional Blender MCP for interactive part exploration and document setup/safety.
(`docs/asset-tooling.md#optional-interactive-blender-mcp` covers addon/client setup, Pi `pi mcp add`, flatpak networking,
viewport/`bpy` workflow and the rule that headless audit/fit remains authoritative; MCP is
not a build/CI/runtime dependency.)
- [x] Document the commands, working-set paths and "part source is not a shipped asset" rule in
`docs/asset-tooling.md`, `docs/blender-assets.md` and
`.agents/skills/gig-line-blender-asset-contract/references/verification.md`.
### 2. Contract bake and animation
### 3. Head and face prototype
- [ ] Author the 62-joint → 13-core joint map, including optional finger/face extras if
they survive within 24,000 vertices; record it in `docs/npc-model-sourcing.md`.
- [ ] Bake the rest pose and proportion warp to the contract hip, knee, shoulder, elbow,
wrist and head positions. Measure the warp at every joint and record the silhouette
deltas; do not accept a distorted deltoid or shortened arm.
- [ ] Skin the Quaternius mesh and verify Idle, Walk, seated and arm-down poses. The old
MPFB/arm-retarget warps are not a reference; judge the Quaternius result directly.
- [ ] Retarget Idle and Walk from the 24 Quaternius clips to the contract rig; discard
combat, gun and sword clips. Verify looping, foot contact and frame rate in Godot.
- [ ] Map the five slots, unwrap per slot, bake 256² AO/albedo/normal/ORM maps and check
texel density before any roster build.
- [x] Build one `npc_casual` head/face prototype as a connected head shell plus intentional feature
geometry — not a sphere with floating facial balls. Use loop-based eye sockets/lids, a
readable nose bridge/tip/ala, a mouth with upper/lower lip volumes, ears with concha depth,
and brow/cheek/jaw planes that survive the 256² AO bake.
Outcome (AI-judged, 2026-11-04): the displacement shell oscillated egg/spiky at ~3/5; the
judge picked the **decimated MakeHuman head**. That head is now built as `_makehuman_head`
(`build_character(head="mh")`, `npc_parts.py build --part head_mh`): committed CC0 source
`assets/models/blender_src/makehuman_head.glb` + project sclera/iris/lids/brows/mouth;
assembled `npc_casual` passes `inspect` (14 bones, no issues). Remaining polish: weld the
eye/brow pieces into the head shell and add a skull-conforming hair cap (owner-gated rollout).
- [x] Compare two or three subdivision/loop variants at 1.85 m front/three-quarter/profile and a
1.5 m portrait. Pick the variant that reads best before changing all 12 characters; keep the
rejected variants local.
- [x] Rebuild a standalone MakeHuman-derived head from the researched CC0 base and save it to
`assets/models/blender_src/makehuman_head.glb`; record provenance/review in
`docs/makehuman-head-review.md` and the preview sheet. Final build: 12,642 tris /
7,690 split verts, bounds x −0.094..0.094, y −0.180..0.042, z 1.530..1.803. The owner
accepted the **basic human head** on 2026-11-04; the automated vision gate still records
the eye-region REJECT as deferred polish (globe depth, lid overlap, iris at three-quarter).
The assembled path now adds a skull-conforming hair cap, a hidden-scalp trim and a narrowed
neck/shoulder body. Assembled `npc_casual --head mh`: 14,753 tris / 12,822 raw / 12,823
seam-split verts / 14 bones / 9 materials, `inspect` clean.
- [ ] Build true upper/lower eyelid masses that overlap the globe in front, three-quarter and
profile views (not a socket hole), then re-run the vision gate. Deferred: the owner accepted
the basic head, so this is polish, not a rollout blocker.
### 3. Silhouette gate
Compared `head_proto` at seg 24 (670 verts), 48 (1,558 verts) and 64 (2,470 verts) at 1.85 m
and 1.5 m, front/three-quarter/profile. Vision-judged: **s48 wins** — s24 is too faceted
(nose/lips melt, jagged silhouette), s64 is visually identical to s48 at both distances
(extra ~900 verts wasted). Rejected variants stay in `tmp/npc-parts/`.
- [-] Verify head weights stay on the Head bone, headgear clearance still passes `fit`, and the
face does not bake recessed creases into dark AO patches.
Weight check done: `npc_parts.py assemble --head-proto` passes `inspect` (npc_base, 14 bones,
skinned, no issues) and the head join is weighted 100% Head by construction
(`rigid=lambda p: "Head"`). Headgear clearance and the AO no-blotch check are pending the
§5 rollout (the `fit`/`bake_ao` tools read the committed assets; the ad-hoc AO bake on the
imported GLB came out black and is superseded by the proper `.blend`-source bake). Flag: the
prototype ears reach x ±0.162 vs the 0.1575 head-radius reference, so headgear may clip and
must be re-measured at rollout.
- [-] Owner review of the assembled one-variant prototype (`npc_casual --head mh`) before the
12 shipped GLBs change. The basic human head is accepted (2026-11-04); the review now covers
the skull-conforming hair cap and the narrowed neck/shoulder body silhouette. Local renders:
`tmp/npc-parts/prototype_mh/renders/` (portrait front/three-quarter/profile + full body).
Rollout starts only after this review.
- [ ] Render the base at 1.5 m and 1.85 m in front, three-quarter and profile; compare
against the Quaternius source and the current `npc_casual`. Use the vision judge for a
written verdict, but the owner decides.
- [ ] Confirm gear attach points (head, hand, back, chest) and test cap, helmet, backpack,
shoulder bag, lanyard, clipboard and firefighter tank against the new shoulders/hips.
- [ ] Go/no-go: if the warp fails the silhouette gate, stop and write the 62-joint runtime
ADR (Stage 2). Do not start the 12-variant rebuild.
### 4. Hands and grip prototype
### 4. Roster and rollout
- [x] Build separate left/right hand parts with a connected palm, four multi-segment fingers, a
thumb, knuckles and rounded tips. Support an open palm and a relaxed grip; preserve the
current `HAND_ITEM_FORWARD` behaviour for phone/cup/clipboard/camera/flashlight/wand/radio.
`npc_parts.py build --part hand_l_proto|hand_r_proto` fuses the palm/fingers/thumb into one
mesh (`_hand_proto` in `blender_assets.py`, remove-doubles at 6 mm). Vision-judged at 0.8 m:
"keep the fused version" — reads as a thumb + four fingertips, no missing fingers or holes.
Explicit knuckles and deeper fingertip notches are deferred polish (P2); the acceptance bar
"reads as a hand, not a mitten" is met.
- [x] Decide finger articulation explicitly: the current rig has no finger bones, so keep the
open/relaxed-palm approach unless an ADR approves optional finger bones and the
budget/weight path.
Decided 2026-11-04: keep the open palm + `HAND_ITEM_FORWARD` (no finger bones). Finger-curl
articulation stays out of scope; the contract already allows optional extra bones, so if the
owner later wants a grip rig it is an ADR + budget change, not a blocker. (Recorded in
`MEMORY.md`; re-confirmed here.)
- [-] Verify all hand gear at 0.8 m (contact, clipping, direction) and capture open/grip hand
close-ups for the review sheet.
Open close-up captured (0.8 m). Gear contact is unchanged by construction: `_hand_proto`
reuses the same palm geometry and the same `HAND_ITEM_FORWARD`/Hand-proxy attach, so the
existing `fit` hand-gear clearances carry over. The grip close-up + gear-in-hand context
needs the §5 assembly (hand_proto swapped into the character), so it is verified there.
- [ ] Roll the approved hands into all 12 variants only after the one-variant hand sheet passes.
- [ ] Map the 12 roles to Quaternius outfits/parts, build them in asset-family batches,
and keep every variant inside the 24,000/24,000 cap.
- [ ] Run `audit`, `fit`, `inspect`, `texels` and `npc_proportions.py report`; record the
12-variant table and the warp measurements.
- [ ] Re-run the 24-NPC budget smoke and the Web/Compatibility capture; record frame time
before and after the base swap.
- [ ] Capture the 12 × 6 baseline (`capture_npc_baseline.gd` → `npc_baseline.py sheet`) and
get owner approval before replacing the committed character GLBs.
- [ ] Rebuild AO maps, manifest entries, credits and review docs; commit one asset family per
change and never run a no-op full-library rebuild.
### 5. Assembly and rollout
### 5. Retire the old character tracks
**MakeHuman 12-variant rollout.** - [x] Make the head source selectable from the main builder:
`blender_assets.py build --head mh --only npc_casual,...` and
`npc_parts.py assemble --variant <name> --head mh --out <stem>`. The default stays `face`
until the hair/body review passes.
- [x] Verify every variant assembles with the MakeHuman head inside the 16,000/16,000 cap
(pre-export triangle counts, `inspect` clean; `npc_casual` seam-split verts 12,823):
`npc_casual 14,753`, `npc_jacket 15,153`, `npc_coat 15,817`, `npc_vest 15,579`,
`npc_dress 15,215`, `npc_hoodie 15,837`, `npc_firefighter 15,987`, `npc_guard 15,729`,
`npc_crowd_a 14,947`, `npc_crowd_b 14,693`, `npc_crowd_c 15,433`, `npc_crowd_d 15,833`.
- [x] Recover head budget without touching the accepted face: remove head faces fully covered by
the hair cap, keep boundary faces as a safety band, and trim the hidden neck plug to 12
segments. This saves ~950 tris on every variant.
- [ ] Owner approves the hair cap and full-body silhouette on the local `npc_casual` prototype.
**Status (2026-11-04):** the current body candidate is the MPFB full-body prototype below,
not the narrowed procedural body; the 12-variant rebuild is blocked on that review.
- [ ] Rebuild the 12 committed character GLBs with `--head mh`, in asset-family batches, then
regenerate their AO maps and manifest entries. Never run a no-op full-library rebuild.
- [ ] Run `blender_assets.py audit`, `fit`, `inspect` and `texels`, plus
`python3 tools/npc_proportions.py report`; record the 12-variant proportion table.
- [ ] Re-run the Godot NPC tests and capture the 12 × 6 baseline
(`src/test/capture_npc_baseline.gd` → `python3 tools/npc_baseline.py sheet`); inspect the
sheet for outliers before committing.
- [ ] Update `docs/makehuman-head-review.md`, `docs/3d-model-review.md`,
`docs/blender_previews/README.md`, `docs/npc-model-sourcing.md`, `CREDITS.md` and
`docs/development-status.md` with the accepted head/hair/body state and final counts.
- [ ] Integrate the approved parts into `build_character` with deterministic joins, weights, UVs and
AO. The final output remains one `npc_base` skinned mesh under the existing 13-core armature;
optional extra bones are allowed but the core rest positions stay fixed;
no second rig, no material-slot rename.
- [ ] Keep the MakeHuman body prototype consumable with the same approved head/hands; do not let it
grow a second face/hand implementation while the part pipeline is being proven.
- [ ] Rebuild only the changed character GLBs, AO maps and manifest entries; never run a no-op full
library rebuild. Commit one asset family per change.
- [ ] Re-run `blender_assets.py audit`/`fit`/`inspect`, `npc_proportions.py`, the 24-NPC budget,
Godot and Python tests, the 48-frame baseline and the 96-frame final-context review.
### Full-body MPFB prototype
Goal: assemble the accepted MakeHuman head onto a CC0 MPFB body with project hands, shoes and
14-bone contract rig, inside the 24,000/24,000 character budget. Local development only until the
owner reviews the silhouette and a production integration decision is recorded.
- [x] Build the dev pipeline at `tmp/npc-research/build_mpfb_npc.py`: create a macro-driven MPFB
human, bake targets, add the `game_engine` rig, capture arm points/weights, remove the rig,
apply the helper MASK, scale to 1.81 m, retarget the A-pose arms to the contract wrist
(`x=±0.27`, `z=0.78`), cut the neck at 1.505, decimate, bisect the clothing boundaries, paint
the five slots, add a short neck flare, project hands, rounded shoe shells, cuffs, the
accepted head and the 14-bone armature. Current output: **19,747 tris / 16,851 glTF verts /
1.810 m / 14 bones / 10 materials**; `inspect` clean, feet grounded.
The torso is inflated radially by 12% through z 0.72–1.40 (tapering out at the collar) so the
shirt reads as fabric rather than body paint.
- [x] Raise the character contract to 24,000 triangles / 24,000 glTF vertices so the MPFB body,
the accepted head and a fused neck can coexist with headroom for the 12-variant clothing.
Bumped `CHAR_MAX_TRIS`/`CHAR_MAX_VERTS`, `npc_pipeline.MAX_TRIANGLES`/`MAX_VERTICES`,
the adapt defaults, the tests, `AGENTS.md`, ADR-0016 and the project skills.
- [-] Fix the head/neck/shoulder junction so there are no gaps, square collars or hard rims.
Done: circular boolean bore, smooth lathe, accepted head trimmed at its narrow neck (1.55),
no dark notches or wide brim; prototype at 19,747 tris. Remaining: a thin jaw crease and a
hard shirt-shoulder point in three-quarter view. Next candidate: reshape the shirt shoulder
or a shaped collar that follows the neckline, not a torus or flat disk.
- [x] Replace the spiky decimated MPFB hands with the project palm/finger primitives, straighten the
splayed MPFB feet so the shoes point forward, and use rounded shoe shells + cuffs instead of
flat blocks. Use flat slot colours in the prototype because the one-shot MPFB UV unwrap does
not match the per-slot NPC atlases.
- [x] Fix the neck junction without touching the accepted face: cut the decimated neck column
radially (all-vertex test inside r=0.085) so the shirt shoulder silhouette stays intact,
then bridge the opening with a smooth four-ring lathe neck (r 0.100 → 0.056, 20 segments).
The lower rings are painted cloth so the opening reads as a crew neck rather than bare
chest. No torus, disk shelf, neck brace or sawtooth collar.
- [x] Reject destructive vertex smoothing at the neck: a `smooth_vert` pass moved the open body
boundary away from the neck cone, opening a dark hole. The lathe gives smooth shading
without moving the collar boundary.
- [x] Shrink the shoes and seat the ankles: shoe shell 0.12 × 0.30 × 0.11 m, an inset 0.111 ×
0.286 m black sole, a tongue and shoe centre x=0.17, with a 0.08 m pant cuff (r 0.055/0.061)
bridging leg and shoe. The sleeve cuffs now use the `cloth` slot and the `accessory` slot is
carried by the sole, so the cuffs read as sleeve ends instead of metal bands.
- [x] Replace the bulbous toe/heel spheres with a single bevelled shoe shell (bevel 0.032, 2
segments) plus tongue and inset sole, and add one light smoothing pass to the closed
thigh/hip region. Protruding flat sole plates read as skates or bricks; laces were dropped
for triangle budget after they proved too small to read.
- [x] Reject the untucked shirt-hem band: both the 0.09 m and 0.12 m cloth cylinders read as a
hanging white flap at the crotch. The V hem needs a proper clothing shell, not a band.
- [x] Fix the neck material rule: the `radius < 0.08` skin test had no Z floor, so it painted a
skin patch at the crotch. It is now guarded to `z > 1.35`; the crotch stays pants.
- [x] Reject three cheap hem fixes: lowering the shirt to z 0.80 turns it into a unitard; tilting
the hem up at the front reads as high-cut swimwear; a 13% hem flare reads as a peplum.
The remaining V is the dark crotch hollow under a body-painted shirt, not a slot bug.
- [ ] Owner reviews the updated MPFB body renders (`tmp/npc-parts/mpfb_proto/renders84/`).
Remaining known defects: the crotch hollow still reads as a V under the shirt hem, the
shirt is only partly loosened by the 12% torso inflation, and the 2k-tri body budget leaves
some angular thigh facets. A separate loose shirt shell is the proper fix for the first
two; these are polish, not blockers for the body direction.
- [ ] Build a proper loose shirt shell instead of body-painted cloth. The quick open, flared
solidified tube (0.150→0.196 m, z 1.05→0.80, 24 segments, ~288 tris) read as a hanging
apron/tabard and was rejected. The shell needs a shaped torso, armholes and a curved hem,
not a tube. It must fit in the 683 spare triangles or come with a head/body rebalance.
- [ ] Rebalance the triangle budget before rollout: 683 spare is below the ~1,200 the firefighter
and hoodie variants need. Protect the head budget first; do not lower the accepted face.
- [ ] Fix the low-budget seams before any rollout: weld the torso/hip/arm components after the
bisects, protect the hip/knee loops during decimation (or rebalance head/body triangles).
- [ ] Record the production integration decision: either bake the approved MPFB body to a committed
source GLB (CI and fresh checkouts stay MPFB-free) or keep the procedural body as the shipped
path. Do not add the MPFB extension as a build/CI dependency.
- [ ] If approved, roll the MPFB body into the 12 variants and regenerate AO maps, manifest entries,
`inspect`/`fit`/`audit`/`texels`, the proportion report and the 12 × 6 baseline.
### 6. QA, docs and exit
- [ ] Capture front/three-quarter/profile head comparisons and open/grip hand comparisons; add
durable sheets to `docs/blender_previews/` and link them from the review docs.
- [ ] Update `docs/3d-model-review.md`, `docs/npc-visual-review.md`,
`docs/known-limitations.md`, `MEMORY.md` and the project skills with the accepted limits and
the new part workflow.
- [ ] Exit: head/face and hands are approved on one prototype, rolled out across all 12 variants,
all contract/budget/capture gates pass, the local part pipeline is documented, and no
runtime dependency or skeleton contract changed.
- [x] Remove the MPFB/MakeHuman development scripts, renders and review directories from
`tmp/` (done 2026-11-05). Keep only the Quaternius source pack and its licence notes.
- [x] Keep the committed `makehuman_head.glb` and the procedural `npc_base` only as tested
fallbacks until the Quaternius rollout is complete; do not add new MPFB work.
- [ ] Update `docs/development-status.md`, `CHANGELOG.md` and `CREDITS.md` when the new base
ships. MPFB must never become a CI, build or runtime dependency.
## Fix the Rig pose harness
Goal: `src/test/capture_npc_pose.gd` reports a pose but saves rest frames; the root cause is
narrowed to the skinned mesh ignoring its `Rig` parent transform. Fixing it unblocks the
weights/pose column of the 3D review and the pose/portrait evidence for the MakeHuman intake.
weights/pose column of the 3D review; the evidence now feeds the Quaternius base bake.
*Skill route: `rigging`; evidence in `docs/3d-model-review.md` §"Pose evidence is blocked".*
@@ -295,52 +119,6 @@ weights/pose column of the 3D review and the pose/portrait evidence for the Make
(No separate "wave" theater pose exists; the escalation raise-hand gesture is not a distinct
capture in this harness.)
## MakeHuman character pipeline
Goal: replace the procedural body generator with the CC0 MakeHuman base for the next character
pass — retopologised, rigged and dressed in project-owned clothing — so bodies read more
realistic than the current primitive shapes. This promotes the deferred MakeHuman evaluation to
an active track; ADR-0015 (CC0 / CC-BY with attribution) still governs every intake.
*Skill route: `retopology`, `rigging`, `uv-workflow`, `materials`, `character-artist`,
`asset-optimization`, `godot-export`, `qa-review`.*
### Intake and adaptation
- [x] `adapt` path added to `tools/blender_assets.py` (`adapt --file <in> --out <out>
[--target-tris 24000]`): imports the GLB, applies transforms, grounds the feet, welds seam
splits and decimates to the budget, then exports. The five tint slots + 13-core rig
(optional extra bones allowed) stay a manual step (recorded in the command doc).
- [x] `audit` stays the final gate; `test_adapt_requires_blender` covers the non-Blender error
path (162/162 Python).
- [x] Adapter commands + go/no-go documented in `docs/asset-tooling.md` §Intake adaptation.
### MPFB / MakeHuman body pipeline
- [x] Prototype the local pipeline: `tmp/npc-research/makehuman_intake.py` imports the CC0
`base.obj`, scales to 1.82 m, grounds the feet, triangulates, decimates and exports
`tmp/npc-research/makehuman/makehuman_body.glb` — 3,790 verts / 6,444 tris, bounds
x ±0.53 / y 0–1.82 / z −0.12…+0.35, one neutral material, UVs present, unskinned. The
body (no rig) is the input for the rigging step; the script + mesh stay in `tmp/` (CC0, not
committed).
- [x] Rig strategy decided (owner): **retarget the body to the 13-core contract; optional extra bones are allowed**.
`tmp/npc-research/makehuman_retarget.py` rotates the A-pose arms down (−38°/+38°), scales the
arms 1.63× to the contract 0.70 m length, welds the split vertices, smooth-shades, adds the
contract armature + `_auto_weights`, paints the five slot regions (hair/cloth/pants/accessory/
skin) and exports `makehuman_retargeted.glb`. **Contract passes:** 6,444 / 16,000 tris,
7,726 / 16,000 verts, 14 bones (13 + Hips), skinned, arm-down, grounded, five slots, no issues.
Vision-reviewed: arms hang down and the silhouette + slot regions read, but the 1.63× arm warp
distorts the deltoid/shoulder (spiky/warped), the decimated hands are blocky, and the slot
boundaries are rough — these are the refinement steps below.
- [x] Head/hands/feet swap (`makehuman_final.py`): cut the decimated MakeHuman head/hands/feet and
joined the project's `_face`/`_hair`/`_hands_and_shoes`, then re-weighted/re-UV'd. Contract
passes: 6,407 / 16,000 tris, 6,651 / 16,000 verts, 14 bones, skinned, five slots, no issues.
Vision-reviewed: the head now reads as a realistic face, the hands as detailed fingers and
the shoes as attached. Remaining (manual retopology): a 1.63× arm-scale warp still distorts
the deltoid/shoulder, stray hand blobs linger at the hips, shirt/shirt seams are rough, and
the head-neck junction has a shadow gap. The procedural generator stays the shipped fallback
until these are cleaned in an editor session.
## 3D model and local map re-evaluation
Goal: re-judge every shipped 3D asset against the newly available Blender skill guidance, rank
@@ -356,7 +134,7 @@ rebuilds and the face/foliage prototypes) stay **blocked** until the full local
(H–M) is done **and** a fresh 3D model review runs against the new maps. The measurements and
scorecard in `docs/3d-model-review.md` stand as the pre-rebuild baseline, not a go-ahead to start
character work now. (Character development has since shipped — see `DONE.md` — and the next
character pass is the MakeHuman pipeline above.)
character pass is the Quaternius base above.)
**Map rebuild status (2026-11-03):** H–M are complete — the Joke Shop is now a 6.0 m low hall
(dark stucco, white signature fascia, tied-back curtains, hotel tower) and Hollywood/TV Studio
@@ -966,7 +744,7 @@ published while the gates below remain open.
| Area | Remaining gap | Milestone |
| --- | --- | --- |
| 3D model and local map re-evaluation | Skill-guided asset scorecard/repairs; OSM/3D data, reference-derived facades, AI-assisted composition and map QA | Unversioned |
| Character development | Complete (moved to `DONE.md`); the MakeHuman body pipeline is the next character pass | 0.11.0 |
| Character development | Complete (moved to `DONE.md`); the Quaternius NPC base migration is the next character pass | 0.10.0 |
| Content and balance | External first-time-player evidence, balance sweeps/tuning and content lock | 0.10.0 |
| Audio, accessibility and localization | Accessibility/localization acceptance, caption coverage and pseudo-locale/layout sign-off | 0.10.0 |
| Performance and platform | Target-hardware matrix, Web/Desktop HQ profiling and frame/memory evidence | 0.10.0 |
@@ -979,15 +757,15 @@ The 0.9.3 UI, 0.9.4 animation, 0.9.5 texture, 0.9.6 integration and save-migrati
complete in `DONE.md`; they are not remaining gaps. The 2026-11-01 documentation audit
(architecture ownership, stale-claim cleanup and obsolete-plan removal) is also closed.
**Priority (2026-11-04):** fix the `Rig` pose harness, then the MakeHuman character pipeline,
then re-evaluate the 3D models, then ship the **0.11.0** minor release. The 0.10.0 candidate
**Priority (2026-11-05):** finish the `Rig` pose harness, then the Quaternius NPC base
migration, then re-evaluate the 3D models, then ship the **0.10.0** minor release. The 0.10.0 candidate
still accepts only release-blocking fixes until its external-playtest, legal/storefront, signing
and platform gates clear.
## Milestone 0.10.0 — 3D model and map improvements (minor)
Goal: ship all 3D model and map improvements together as the **0.10.0 minor** — the MakeHuman
body retarget (contract armature + project head/hands), the rebuilt Comedy Store/Hollywood maps,
Goal: ship all 3D model and map improvements together as the **0.10.0 minor** — the Quaternius
NPC base bake (contract armature + five slots), the rebuilt Comedy Store/Hollywood maps,
and the re-evaluated 3D scorecard — plus the external playtest, legal/storefront, signing and
platform gates from the old release candidate. The character-development patch (0.9.7) ships
first; this minor contains the model/map work.
@@ -1157,8 +935,8 @@ variants, the four crowd-variety characters and the per-role pools — as a **pa
launches headless. Tagged `v0.9.7` (CI build/publish follows).
**Exit:** met — 0.9.7 ships the 12-character library (face realism + crowd variety) with the pose
harness fixed; the runtime contract is unchanged. The MakeHuman body and the map rebuild are not
in this patch (they target 0.10.0).
harness fixed; the runtime contract is unchanged. The Quaternius NPC base and the map rebuild are
not in this patch (they target 0.10.0).
## Roadmap dependencies and risks