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

+14 -85
View File
@@ -10,14 +10,6 @@ canonical implemented-features list in `docs/development-status.md`.
the licence gate. Downloads live in `tmp/research/` (gitignored): DDG image search, street-view
frames, neighbouring buildings — never committed, never shipped. Promotion into
`docs/screens/refs/` always passes the sidecar licence + privacy gate and `CREDITS.md`.
- **MakeHuman head accepted (2026-11-04, owner):** the basic human head is a pass.
`assets/models/blender_src/makehuman_head.glb` is the CC0 MakeHuman-derived head
(12,642 tris / 7,690 split verts). The automated vision gate still records REJECT on
the eye/lid region (globe depth, lid overlap, iris at three-quarter) as deferred
polish, not a blocker. The assembled path (`build_character(head="mh")`) adds a
skull-conforming hair cap derived from the closed head shell, hides the scalp under
that cap, and narrows the neck/shoulder body. Default head source stays `face` until
the owner reviews the hair/body and the 12-variant rollout starts.
- **AI-assisted asset review loop (2026-11-04):** head/face shape decisions use a concept +
judge loop — generate a target concept (`generate_textures.generate_image`, Seedream) and use
`tools/describe_image.py` as the vision judge, iterating on the mesh until the judge's specific
@@ -25,43 +17,6 @@ canonical implemented-features list in `docs/development-status.md`.
(`_head_proto` oscillates between "decorated egg" and "spiky wedges" at ~3/5 on the coarse
sphere). Review page: `docs/screens/head-review/README.md`; methodology note:
`docs/3d-model-review.md` §AI-driven head rework.
- **MakeHuman hair/body prototype (2026-11-04):** `npc_casual --head mh` is
14,753 tris / 12,822 raw / 12,823 seam-split verts / 14 bones / 9 materials,
`inspect` clean. All 12 variants were counted at 14,693–15,987 tris. Hair uses flat
shading normals because the old hair normal map caused dark tangent patches on the
new cap. Scalp faces fully covered by the hair cap are deleted (saves ~950 tris);
the accepted face geometry is untouched. The procedural body was narrowed at the
neck/shoulders (shoulder root z 1.345, chest 0.158, neck 0.060/0.054) and its skin
decimate dropped to 0.21. The local renders are in
`tmp/npc-parts/prototype_mh/renders/`.
- **MPFB full-body prototype (2026-11-04):** the current body candidate is the local MPFB 2.0.18
pipeline at `tmp/npc-research/build_mpfb_npc.py` (dev-only; no `.mhclo` clothing installed).
It creates a macro-driven human, bakes targets, adds the `game_engine` rig, captures arm
points/weights, removes the rig, applies the helper MASK, scales to 1.81 m, retargets the A-pose
arms to the contract wrist, cuts the neck at 1.505, decimates, bisects the clothing boundaries,
paints the five slots, adds a short neck flare, project hands, rounded shoes and cuffs, the
accepted head and the 14-bone contract armature. Current output: **15,317 tris / 13,690 glTF
verts / 13,702 seam-split verts / 1.810 m / 14 bones / 10 materials**; `inspect` clean and feet
grounded. The torso is inflated radially by 12% through z 0.72–1.40 to loosen the shirt. The
neck is a radial cut of the decimated column bridged by a four-ring, 20-segment lathe (lower
rings painted cloth, reads as a crew neck); the ankles are hidden by a bevelled 0.11 m shoe
shell, an inset 0.111 × 0.286 m sole, a tongue and a 0.08 m pant cuff. Sleeve cuffs use the
`cloth` slot and the `accessory` slot is carried by the sole. A light smoothing pass on the
closed thigh/hip region softens the decimated silhouette. Earlier torus collar, cloth cylinder
collar, skin neck-blend sphere and destructive neck `smooth_vert` pass failed: the shells read as a
brace, shelf or donut, and vertex smoothing tore the open collar boundary into a dark hole. An
untucked shirt-hem band at the hips also failed: it read as a hanging white flap at the crotch.
Protruding flat sole plates read as skates/bricks and were replaced by an inset sole under a
rounded shell; laces were dropped for triangle budget. The neck skin rule needed a `z > 1.35`
guard: without it the `radius < 0.08` test painted skin at the crotch. Lowering the hem to
z 0.80 (unitard), tilting it up at the front (high-cut swimwear) and a 13% hem flare (peplum)
were all rejected; the remaining crotch V is the dark hollow under a body-painted shirt. A quick
open, flared solidified tube (0.150→0.196 m, z 1.05→0.80, 24 segments, ~288 tris) also failed:
it read as a hanging apron/tabard. The real fix is a shaped shirt shell with armholes and a
curved hem, not a tube. Remaining polish: crotch V, partly loosened shirt,
angular thigh facets. The prototype uses flat slot colours because the one-shot MPFB UV unwrap
does not match the per-slot NPC atlases. Renders:
`tmp/npc-parts/mpfb_proto/renders84/`; body-only: `body_only.glb`.
- **Project agent skills (2026-11-03):** two tracked skills live in `.agents/skills/`:
`gig-line-blender-asset-contract` and `gig-line-release-qa`. They are guidance only,
add no runtime dependency and are referenced from `tools/README.md`. The third-party
@@ -97,11 +52,6 @@ canonical implemented-features list in `docs/development-status.md`.
(94 skills + shared `references/`), gitignored, kept out of Godot's scanner by
`.agents/.gdignore`. Keep the pack flat when updating (`cp -a <pack>/.claude/skills/. ...`).
Pi gates project `.agents/skills` behind project trust.
- **NPC model sourcing (ADR-0015):** CC0 acceptable for shipped assets; CC-BY only with
attribution in `CREDITS.md`; no service assets with redistribution restrictions. The procedural
generator is the primary path. Quaternius and MakeHuman were evaluated as references only, not
shipped bases (Quaternius: 62-bone T-pose rig mismatch; MakeHuman: needs retopology + custom
rig + clothing).
- **Gaussian splatting (unversioned):** offline/development-only until an ADR proves licence,
privacy, Compatibility/Web cost and mesh collision. Accepted photo channels: team captures,
permissioned user/volunteer photos, clearly licensed downloads; every set needs a
@@ -117,18 +67,18 @@ canonical implemented-features list in `docs/development-status.md`.
- **Character mesh cap (2026-11-05):** all characters use 24,000 tris / 24,000 glTF vertices
(`CHAR_MAX_TRIS`/`CHAR_MAX_VERTS` in `tools/blender_assets.py`; `npc_pipeline.MAX_TRIANGLES`/
`MAX_VERTICES`). The required 13 core bones stay, optional extra bones are allowed, and the
low-poly `npc_base` fallback remains the shipped fallback. The raise funds the MPFB body and a
seamless neck/shoulder junction. Measure the 24-NPC/Web budget after
low-poly `npc_base` fallback remains the shipped fallback. The raise funds the Quaternius base bake and
the 12-variant clothing detail. Measure the 24-NPC/Web budget after
any geometry change; never silently lower the cap without a new decision.
- **MPFB prototype neck (2026-11-05):** a boolean cylinder (r 0.102) cuts the body neck bore; a
smooth lathe covers it. The accepted head keeps a wide flat cut brim at 1.53, so the prototype
trims the head at 1.55 (discarding only the neck stub) and matches the lathe to the smaller
elliptical opening. This removes the square collar, dark notches and wide brim. Remaining: a
thin jaw crease and a hard shirt-shoulder point in three-quarter view. Do not re-add a torus,
flat disk, collar shell or destructive neck smoothing; those were rejected.
- **MPFB prototype count (2026-11-05):** 19,747 tris / 16,851 glTF verts / 1.810 m / 14 bones /
10 materials; `inspect` clean. Body-only head/neck surgery lives in
`tmp/npc-research/build_mpfb_npc.py` (backups in `/tmp/build_mpfb_npc_94.py`).
- **Quaternius is the NPC base (2026-11-05, owner):** ADR-0017 supersedes the generator-first
sourcing decision. The CC0 Quaternius Ultimate Modular character pack is the primary NPC mesh
and animation source. Stage 1 bakes a proportion-warped, 13-core-contract `npc_base` so
`NpcAvatar`, gear and animations keep working; the 62-joint/24-clip source rig is authoring
input, not a runtime dependency. If the warp fails the silhouette gate, Stage 2 needs a new ADR
for a 62-joint runtime, not a hybrid. The MakeHuman head and procedural `npc_base` remain
tested fallbacks until the Quaternius rollout ships. Quaternius source: CC0, attribution in
`CREDITS.md`; the three researched GLBs and licence notes are kept in
`tmp/npc-research/quaternius/`. MPFB/MakeHuman body work is closed; do not add new work there.
- **Engine baseline:** Godot 4.7.2 stable (official editor `~/.local/bin/godot`). The system's
`godot-runner` cannot load arbitrary project paths (compiled without path overrides); use the
official editor binary.
@@ -167,27 +117,6 @@ canonical implemented-features list in `docs/development-status.md`.
out of a portrait frame (park the rest of the crowd away instead).
- Blender: `bisect_plane` and thin bevels leave zero-area triangles (Godot "non-finite normal in
LOD generation"); `_clean()` + a weld after bisect fixes them and the audit rejects them.
- MakeHuman head/hair gotchas: the imported head is broad and flat, so a separate hair
ellipsoid floats or leaves a bald patch; derive the cap from the closed head shell and
boolean-cut the hairline. Do not reuse the skull's UVs with the old `hair_normal.png`
(dark tangent patches) — hair skips the normal map. Generate the cap before deleting
the hidden scalp, or the cap inherits the hole. The flatpak sandbox cannot read `/tmp`;
helper scripts must live under `$PWD`.
- MakeHuman OBJ intake transform (`base.obj`): the source is Y-up, 16.946 units tall. To reach
the project Blender Z-up / metres / front -Y space: scale 0.10739, translate y +0.907 (ground
the feet), then rotate +90° around X (maps +Y→+Z up and +Z→−Y front). The full-res head carries
internal geometry (eyes/teeth/mouth shells) and is non-manifold; voxel-remesh and Catmull-Clark
subdivision both fragment it into shards. On the decimated head, weld first
(`remove_doubles` ~0.0002) then Laplacian `smooth_vert`; subdivision without the weld splits
along the GLB seam vertices.
- MPFB gotchas: call `TargetService.bake_targets(body)` before any decimate (shape-key
modifier error); add the built-in rig and capture arm weights before applying the MASK
modifier, or `build_basemesh_position_info` divides by zero on an emptied bone group;
decimate before bisecting the clothing loops, or the decimator collapses the bisect
into a sawtooth. Clear custom split normals after joining (imported MPFB normals leave
flat-shaded thigh facets). Imported GLBs may include helper `Cube`/`Icosphere` meshes at
±1.0, so select `npc_base` explicitly. Delete the MPFB hands by hand/finger vertex-group
weights, not only by `|x|`, or leftover fingers become pants-coloured fins.
- Image models have per-model size floors/caps (Seedream needs 1920+; `GEN_SIZE=2048`, do not
lower; gpt-5-image-mini caps lower). `generate_image` applies model-specific sizing; concept
generation defaults to `--request-size 1536`.
@@ -269,9 +198,9 @@ canonical implemented-features list in `docs/development-status.md`.
The playable build covers the three venues, tutorial/campaign/checkpoints, the 0.9.3–0.9.6
polish/texture/integration passes and the Blender + realism asset pipeline (see `DONE.md` and
`CHANGELOG.md`). The 12-character library (realistic face + four crowd variants) and the
Comedy Store map rebuild are complete. **Priority (2026-11-04, owner):** 1) the **Blender NPC
model overhaul** (head/face/hands, local part pipeline), 2) finish the MakeHuman character + the
3D model and map improvements, 3) ship it all together in the **0.10.0 minor**. The 0.9.7/0.9.8
Comedy Store map rebuild are complete. **Priority (2026-11-05, owner):** 1) the **Quaternius NPC
base migration** (bake the CC0 Quaternius character to the runtime contract), 2) the 3D model and
map improvements, 3) ship it all together in the **0.10.0 minor**. The 0.9.7/0.9.8
character patches are published; `TODO.md` is the priority source. Test counts as of 2026-11-04:
Godot 277/277, Python 167/167, `check_docs` OK.