diff --git a/AGENTS.md b/AGENTS.md index ba5aec9..27d7923 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -93,9 +93,11 @@ specialists the task needs: 1. **The project contract wins.** `npc_base` mesh node, the 13 required core bones at their rest positions, five tint slots, front on Blender −Y / Godot +Z, grounded feet, 24,000 triangles / 24,000 glTF vertices per character, 1,500 per gear, 4,000 per prop. Optional - extra bones (fingers, face, toes) are allowed if they do not move the core rest positions. A skill - may recommend another topology, naming or budget scheme; do not adopt it unless the - change is explicitly planned and the contract, tests and docs are updated together. + extra bones (fingers, face, toes) are allowed if they do not move the core rest positions. The + Quaternius 62-joint source rig is authoring-only and bakes to this 13-core contract + (ADR-0017); it is not a runtime dependency. A skill may recommend another topology, naming or + budget scheme; do not adopt it unless the change is explicitly planned and the contract, tests + and docs are updated together. 2. **Blender MCP is optional interactive tooling.** The headless flatpak scripts (`tools/blender_assets.py`, `tools/npc_pipeline.py`) remain authoritative. MCP may be used for local part exploration; setup and safety are in [`docs/asset-tooling.md#optional-interactive-blender-mcp`](docs/asset-tooling.md#optional-interactive-blender-mcp). @@ -104,8 +106,9 @@ specialists the task needs: 3. **CI stays offline and skill-free.** Skills are local guidance only; every gate must still work from a fresh checkout with committed `.glb`/`.png`/`.tres` files and Godot. 4. **No new asset source without the licence gate.** Skills may suggest reference packs or - generated meshes; ADR-0015 (CC0, or CC-BY with attribution in `CREDITS.md`) and the - provenance rules in `docs/npc-model-sourcing.md` still apply. + generated meshes; ADR-0017 (the CC0 Quaternius NPC base) supersedes the generator-first + decision in ADR-0015, and the CC0/CC-BY rule in ADR-0015 (attribution in `CREDITS.md`) plus + the provenance rules in `docs/npc-model-sourcing.md` still apply to any new source. 5. **Evidence, not vibes.** After a skill-informed change, run `blender_assets.py inspect`, `audit` and `fit` plus the relevant capture/smoke gates, and say in the handoff which skills informed the change and what the measurements were. diff --git a/TODO.md b/TODO.md index ca9f52a..fabd2bf 100644 --- a/TODO.md +++ b/TODO.md @@ -66,7 +66,7 @@ baseline sheet. ### 2. Contract bake and animation -- [ ] Author the 62-joint → 13-core joint map, including optional finger/face extras if +- [-] 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 diff --git a/docs/npc-model-sourcing.md b/docs/npc-model-sourcing.md index 039f084..bb5f99e 100644 --- a/docs/npc-model-sourcing.md +++ b/docs/npc-model-sourcing.md @@ -136,6 +136,40 @@ canonical base built from `Casual_Hoodie.glb` (the most detailed body) by This is the §2 contract-bake input: the 62-joint rig is authoring-only and is mapped to the 13-core contract next, not shipped as-is. +## 62-joint → 13-core joint map (2026-11-05) + +The Quaternius hierarchy (measured from `quaternius_base.glb`): + +- `Root → Body → Hips → Abdomen → Torso → Chest → Neck → Head` (spine); +- `Chest → Shoulder.L/R → UpperArm.L/R → LowerArm.L/R → Wrist.L/R → fingers` (arms); +- `Body → UpperLeg.L/R → LowerLeg.L/R` and `Root → Foot.L/R` (legs — the foot is a separate + child of Root, not of LowerLeg); +- `Root → PT.L/R` (IK pole targets, no deforming weights). + +The contract is 14 bones (13 core + `Hips` root): `Hips, Spine, Neck, Head, Shoulder.L/R, +Elbow.L/R, Hand.L/R, Hip.L/R, Knee.L/R`. The map: + +| Contract bone | Quaternius source | Notes | +| --- | --- | --- | +| `Hips` | `Hips` | `Root` + `Body` collapse into `Hips` | +| `Spine` | `Abdomen`, `Torso`, `Chest` | three collapse into one | +| `Neck` | `Neck` | | +| `Head` | `Head` | | +| `Shoulder.L/R` | `UpperArm.L/R` | the collar `Shoulder.L/R` collapses into `Spine` | +| `Elbow.L/R` | `LowerArm.L/R` | | +| `Hand.L/R` | `Wrist.L/R` | | +| `Hip.L/R` | `UpperLeg.L/R` | | +| `Knee.L/R` | `LowerLeg.L/R` | | + +Optional extras (allowed by the contract; kept if they survive within 24,000 vertices): + +- the 30 finger bones (`Thumb×3, Index×4, Middle×4, Ring×4, Pinky×4` × L/R) → optional finger + bones; +- `Foot.L/R` → optional toe bones. + +Dropped (never shipped): `PT.L/R` (pole targets carry no deforming weights), and the +`Root`/`Body`/collar-`Shoulder` collapse bones above. + ## Contract mismatch The expensive part is the rig and proportions, not the mesh. The source has a