Rewrite NPC plans around the Quaternius base
This commit is contained in:
1 parent
2e1bb19e2c
commit
9968bc0a4c
17 files changed
+364
-536
No files matched your search
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user