Files
animation/dev/glm-task-kapahaka-outfit.md
jeremy 3ba86b2ea8 feat: clothing lane, character sources, and DCC bridges
Bulk import of the working lanes that were living untracked on the PC.

Content:
- characters/  Lena/male body lanes, bakes, texture work, run logs
- clothing/    garment pipeline, configs, gates, contract docs
- garments/    MD-authored garment sources (.zprj/.zpac)
- UAL-Lib/     Universal Animation Library 2 source (.blend/.fbx/.glb)
- tools/       blender_bridge, iclone_bridge, md_bridge, tailor, glm_agent
- docs/, plans/, dev/, .agents/plans/

Repo hygiene:
- .gitattributes: LFS now covers .blend, .zprj, .zpac, .obj, .npy and the
  Reallusion .iAvatar/.ccAvatar/.ccRestore containers. Without this the
  ~3.8 GB in this commit would land as raw blobs. .png/.jpg are left out
  on purpose — ~250 are already tracked raw and converting them would
  rewrite every one without shrinking history.
- .gitignore: exclude /accurig/ (~1 GB AccuRig program files, redistributable
  from Reallusion, nothing authored here) and /dev/null/ (git-lfs hook copies
  dropped by a `>/dev/null` redirect on Windows).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 15:55:43 -07:00

173 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TASK: put the approved kapa haka outfit through the clothing pipeline into the game
You are working in `C:/Users/Jeremy/tinqs/animation` (Git Bash, Windows). Blender is:
BLENDER="/c/Program Files/Blender Foundation/Blender 5.1/blender.exe"
## Goal
Two Marvelous-Designer-authored garments have been approved. Turn them into
game-ready outfit parts on the shared 65-bone Quaternius skeleton, using the
existing staged Blender pipeline `clothing/garment_pipeline.py`.
| Garment | Source file (already exported, do not re-author) | Outfit slot |
|---|---|---|
| Tāniko bodice ("pari") | `tools/tailor/lena_pari_v3_garment.fbx` | Body |
| Flax skirt ("piupiu") | `tools/tailor/lena_piupiu_v2_garment.fbx` | Legs |
Target body / rig (the fit target and weight donor):
`C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb`
Export destination:
`C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/kapahaka/`
Set id `Kapahaka`, gender `Female`, so the pipeline should produce
`Female_Kapahaka_Body.gltf` and `Female_Kapahaka_Legs.gltf` (+ .bin), matching
the naming pattern of the earlier pilot in `../outfits/mddress/`.
## Read these first (they are the source of truth — do not guess)
1. `clothing/README.md` — the pipeline's stages, design rationale, usage, and
the config schema explanation. Read it fully before writing any config.
2. `clothing/configs/dress.json` — a working config to model yours on.
3. `.claude/skills/marvelous-designer/SKILL.md` — how these garments were made
(section "Handing off downstream" is the relevant part).
## What is DIFFERENT about these garments (important — the pilot config misleads)
The pilot config (`dress.json`) was written for a *downloaded* MD dress of
**2.49 million verts** with 12 materials, where aggressive reduction was the hard
problem. **These garments are nothing like that:**
- They are tiny: pari ≈ 1.9k verts / 3.6k faces; piupiu ≈ 3.7k verts / 7.1k faces.
They are ALREADY at game budget. Do not fight to decimate them. Set generous
tri budgets; only reduce if something is genuinely over budget.
- They were draped directly on this exact body in Marvelous Designer, so they
are ALREADY fitted and correctly scaled/positioned. Expect alignment to be
near-identity (scale 1.0, no nudge) — verify rather than assuming the pilot's
`scale_xy: 1.18 / scale_z: 0.95` values, which were corrections for a
foreign garment.
- The `fit` stage is still worth running for its +4mm clearance shell
(poke-through defence), but it should barely move anything.
- Each garment is one simple part — no junk materials, no topstitch soup, no
multi-island jacket. Expect a small number of islands.
## Already-established facts (verified — do not spend steps re-deriving)
- The body/rig imports clean: **65 bones**, Quaternius names, body z-range
`-0.011 .. 1.766` m, `pelvis` z = 0.932, `neck_01` z = 1.413.
- **The MD garment FBX exports are 10× oversized and offset in Z.** Measured
pari z-range is `10.546 .. 14.613` against a body of `0 .. 1.77`. This is the
mirror of how they were authored (the avatar was imported into Marvelous
Designer at `scale=10` to work in MD's millimetre space, so garments come back
in that same space). Expect to need roughly **0.1 uniform scale**, then a Z
placement correction — derive the exact numbers from the measured bounds
rather than trusting this estimate. Sanity check after aligning: the pari
should span roughly z 1.051.40 m (waist to shoulder) and the piupiu roughly
z 0.451.05 m (below knee to waist).
## CRITICAL: placement. A previous run exported a garment 10 cm too low.
**You cannot see the QA renders.** Confirming a PNG exists proves nothing about
whether the garment is in the right place. Placement must be verified
**numerically**, and it is the single most likely thing to go wrong.
### Why the pipeline mis-places these garments
`stage_prepare` auto-aligns by moving the garment so its **top** meets the
`align.top_bone` head: `dz = (b_top - garment_top_after_scale) + z_nudge`.
That is correct for a *foreign* garment of unknown position. It is **wrong for
these garments**, which were draped on this exact body and are therefore already
in the correct world position — only 10× too large. Any bone-align drags them
off their authored placement. On the last run this applied `dz = -0.0970` and
pushed the pari's straps below the shoulder and its hem down to the hip.
### The rule
**A garment's correct final world position is exactly its raw census z-range
divided by 10.** Nothing else. Use `z_nudge` purely to cancel the pipeline's
auto-align so the net placement lands there.
### The procedure (repeat per garment)
1. From the `census` log, note the raw island z-range `[z0, z1]`.
Target world range is **`[z0/10, z1/10]`**.
(pari measured `[10.546, 14.613]` → target **`[1.055, 1.461]`**.)
2. Run `prepare`, then measure what you actually got — load the checkpoint and
print the garment's world-space Z bounds, e.g.
```
"$BLENDER" --background clothing/work/<name>/10_prepare.blend --python-expr "import bpy; o=[x for x in bpy.data.objects if x.name.startswith('GARM_')][0]; zs=[(o.matrix_world@v.co).z for v in o.data.vertices]; print('ZRANGE', min(zs), max(zs))"
```
3. If the measured top differs from the target top by more than **0.02 m**,
adjust: `z_nudge += (target_top - measured_top)`, re-run `prepare`, measure
again. Two iterations should converge.
4. Only proceed to `fit` once the measured range is within 2 cm of target at
both ends. State the final measured range in your DONE report.
Cross-check against the body (a gross error should be obvious): pari ≈ waist to
just above shoulder; piupiu ≈ below-knee to waist. Body landmarks: hem/ankle
0.11, knee 0.52, hip 0.95, waist 1.09, bust 1.26, shoulder 1.40, neck 1.41.
**The pari currently in the export folder is WRONG and must be redone** — delete
`Female_Kapahaka_Body.*` and rebuild it with correct placement before moving on.
## Method
Work one garment at a time; get the pari (Body) fully through first, then the
piupiu (Legs). Suggested sequence per garment:
1. `census` stage — see what islands/materials actually exist. Read the printed
stats and `clothing/work/<name>/census.json`. Let the data drive the config.
2. Write/adjust `clothing/configs/<name>.json` accordingly.
3. Run `prepare` → `fit` → `reduce` → `skin` → `export`. Skip `bake` (it is
optional, Cycles-slow, and these have no high-poly detail worth baking).
4. After each stage, verify **numerically** (you cannot see the QA renders —
their existence proves nothing). Print vert/tri counts and world-space
bounds from the checkpoint .blend and check them against expectations. If a
stage errors, read the traceback and adapt the config.
The pipeline is data-driven: **prefer fixing the config over editing
`garment_pipeline.py`.** If you find a genuine bug or a missing capability in the
pipeline, you may make a small, surgical, well-commented edit — but say so
clearly in your DONE summary.
The skirt (`piupiu`, Legs slot) is the harder one: read the README's notes on
skirt handling (`weights: dress` pelvis-gradient, cone proxy, why skirts are not
decimated) and apply what fits. It is a straight A-line skirt, not pleated.
## Success criteria (all must hold)
1. `Female_Kapahaka_Body.gltf` and `Female_Kapahaka_Legs.gltf` exist in the
export dir above (with their `.bin` companions).
2. Each exported file contains a mesh skinned to a **65-bone** armature with
Quaternius bone names (the pipeline prints verification info — capture it).
3. Vert/tri counts are sane (roughly the input magnitudes, not zero, not
millions).
4. The QA renders show a garment that still looks like a garment (not shredded,
not collapsed, not inside-out).
Verify claims with commands; do not assert success you have not checked.
## Rules
- **Do not** run git commit/push, do not install packages, do not touch `.env`.
- **Do not** modify anything under `tools/tailor/` — those are approved source
assets. Read them only.
- Do not re-run Marvelous Designer; it is not scriptable from here and its UI is
not available to you.
- Work in small verifiable steps. One command per turn.
- Blender runs are slow (a stage can take minutes). That is normal — run them
with a single command and wait for the output.
- If you get truly blocked, emit `DONE:` with a precise description of the
blocker, what you tried, and what you recommend. A clear failure report is far
more useful than silent thrashing.
## Report
When finished, emit `DONE:` with:
- which files were produced and where,
- the final config(s) you settled on and any notable parameter choices,
- verification output proving the bone count / vert counts,
- anything that looks wrong or needs a human eye,
- any edit you made to `garment_pipeline.py`.