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>
This commit is contained in:
2026-08-06 15:55:43 -07:00
parent 3363209cac
commit 3ba86b2ea8
558 changed files with 68622 additions and 8 deletions
@@ -0,0 +1,53 @@
# Backup — kapa haka MD work, taken 2026-07-31 before the piupiu v3 re-cut
Snapshot of the **shipped** kapa haka authoring work, taken because none of
`tools/tailor/` is tracked in git and the next step edits the piupiu pattern.
Nothing in here is referenced by any script — it exists purely to restore from.
## What's inside
| Folder | Contents |
|---|---|
| `tailor/` | Every `lena_piupiu_*`, `lena_pari_*`, `lena_kapahaka_outfit_*` (`.zprj` / `.fbx` / `.obj` / `.mtl` / `.zpac` / colorway PNG), plus `md_piupiu.py`, `md_pari.py`, `lena_measurements.json` |
| `screenshots/` | Review renders for piupiu v1v2, pari v1v3, outfit v1v3 |
| `textures/` | `taniko.png`, `piupiu.png` (generated fabric maps) |
| `configs/` | `piupiu.json`, `pari.json`, `piupiu_sb.json` as they stood |
| `game-outfit/` | Shipped `Female_Kapahaka_{Body,Legs}.{gltf,bin}` from `ariki-game/assets/quaternius/outfits/kapahaka/` |
55 files, 86 MB. Copied with timestamps preserved; SHA1-verified for the four
`.zprj`/`.fbx` sources and the shipped `Legs.bin`.
## Deliberately NOT backed up
- `clothing/work/piupiu*/` — 92102 MB each of Blender stage checkpoints. Fully
regenerable (`census..export` ran in 26 s in the acceptance test), so not worth
the disk.
- `Female_KapahakaSB_*` — owned by the concurrent skirt-bones session; not mine
to snapshot mid-write.
- tee / A-line skirt garments — unrelated to this change, untouched.
## To restore
```bash
cd C:/Users/Jeremy/tinqs/animation
B=tools/tailor/backup/2026-07-31-pre-v3
cp -p $B/tailor/* tools/tailor/
cp -p $B/screenshots/* tools/tailor/screenshots/
cp -p $B/textures/* tools/tailor/textures/
cp -p $B/configs/* clothing/configs/
cp -p $B/game-outfit/* ../ariki-game/assets/quaternius/outfits/kapahaka/
```
After restoring the game-outfit files, force a Godot reimport of the two `.gltf`
files (`ariki-game/tools/targeted_reimport.sh`) or the old `.godot/imported/`
entries will keep serving the newer mesh.
## Why v3 is being cut
The piupiu is cut tighter than the hip it passes over (waist edge 500 mm/panel =
1000 mm total vs Lena's 1095 mm hips), so it drapes as a taut pencil wrap on the
thighs with ~12 cm clearance. `fit`/G3 measures 8 mm penetration **at rest**;
G5 measures 216231 verts up to 8.5 cm deep in Idle/Walk, because
`weights: "dress"` makes the sub-hip skirt pelvis-only — the thigh swings, the
skirt doesn't. v3 re-cuts for real clearance and adds MD collision thickness.
See the session discussion and `.agents/plans/clothing-pipeline-unification-2026-07-31.md` §8.
@@ -0,0 +1,47 @@
{
"name": "pari",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_pari_v3_garment.fbx",
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"align": {
"top_bone": "neck_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.0483,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Pari": {
"slot": "Body",
"islands": [
0
],
"tris": 4000,
"planar_deg": 5,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE"
},
"weights": "dress",
"color": [
0.5,
0.2,
0.15
],
"texture": "../tools/tailor/textures/taniko.png"
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/kapahaka",
"gender": "Female",
"set": "Kapahaka",
"note": "T\u00c4\u0081niko bodice (pari) - Body slot"
},
"min_island_verts": 40
}
@@ -0,0 +1,48 @@
{
"name": "piupiu",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_piupiu_v2_garment.fbx",
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"align": {
"top_bone": "spine_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.037,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Piupiu": {
"slot": "Legs",
"islands": [
0
],
"tris": 8000,
"planar_deg": 5,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE",
"hem_mm": 14
},
"weights": "dress",
"color": [
0.45,
0.35,
0.15
],
"texture": "../tools/tailor/textures/piupiu.png"
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/kapahaka",
"gender": "Female",
"set": "Kapahaka",
"note": "Flax skirt (piupiu) - Legs slot"
},
"min_island_verts": 40
}
@@ -0,0 +1,48 @@
{
"name": "piupiu_sb",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_piupiu_v2_garment.fbx",
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin_SkirtRig.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"align": {
"top_bone": "spine_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.037,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Piupiu": {
"slot": "Legs",
"islands": [
0
],
"tris": 8000,
"planar_deg": 5,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE",
"hem_mm": 14
},
"weights": "skirt_bones",
"color": [
0.45,
0.35,
0.15
],
"texture": "../tools/tailor/textures/piupiu.png"
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/kapahaka",
"gender": "Female",
"set": "KapahakaSB",
"note": "Flax skirt (piupiu) on the skirt-boned SkirtRig Lena copy - Legs slot. Same garment as piupiu.json; differs only in body + weights mode."
},
"min_island_verts": 40
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

@@ -0,0 +1,24 @@
{
"source": "C:\\Users\\Jeremy\\tinqs\\ariki-game\\assets\\quaternius\\derived-bodies\\Ariki_Female_QuatSkin.glb",
"units": "meters (glTF)",
"height_total": 1.777,
"chest_circ": 1.0834,
"chest_z": 1.2636,
"waist_circ": 0.6747,
"waist_z": 1.0888,
"hip_circ": 1.0947,
"hip_z": 0.9455,
"thigh_circ": 0.8421,
"thigh_z": 0.8652,
"neck_circ": 0.3923,
"neck_z": 1.4568,
"bicep_circ": 0.417,
"shoulder_width": 0.3193,
"arm_len_shoulder_to_wrist": 0.5148,
"nape_to_pelvis": 0.4808,
"crotch_height": 0.9455,
"pelvis_height": 0.9318,
"knee_height": 0.5171,
"ankle_height": 0.1063,
"shoulder_z": 1.3973
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

@@ -0,0 +1,10 @@
# MTL Exporter v1.0 by Seungwoo Oh at CLO - Virtual Fashion Inc.
newmtl (Default_for_Simulation)_FRONT_19892
Ka 0.257132 0.257132 0.257132
Kd 1.000000 1.000000 1.000000
Ks 0.075000 0.075000 0.075000
Ns 28.763239
illum 2
d 1.000000
map_Ka C:/Users/Jeremy/tinqs/animation/tools/tailor/taniko.png
map_Kd C:/Users/Jeremy/tinqs/animation/tools/tailor/taniko.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

@@ -0,0 +1,10 @@
# MTL Exporter v1.0 by Seungwoo Oh at CLO - Virtual Fashion Inc.
newmtl (Default_for_Simulation)_FRONT_34682
Ka 0.257132 0.257132 0.257132
Kd 1.000000 1.000000 1.000000
Ks 0.075000 0.075000 0.075000
Ns 28.763239
illum 2
d 1.000000
map_Ka C:/Users/Jeremy/tinqs/animation/tools/tailor/taniko.png
map_Kd C:/Users/Jeremy/tinqs/animation/tools/tailor/taniko.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

@@ -0,0 +1,10 @@
# MTL Exporter v1.0 by Seungwoo Oh at CLO - Virtual Fashion Inc.
newmtl (Default_for_Simulation)_FRONT_41289
Ka 0.257132 0.257132 0.257132
Kd 1.000000 1.000000 1.000000
Ks 0.075000 0.075000 0.075000
Ns 28.763239
illum 2
d 1.000000
map_Ka C:/Users/Jeremy/tinqs/animation/tools/tailor/taniko.png
map_Kd C:/Users/Jeremy/tinqs/animation/tools/tailor/taniko.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

@@ -0,0 +1,10 @@
# MTL Exporter v1.0 by Seungwoo Oh at CLO - Virtual Fashion Inc.
newmtl (Default_for_Simulation)_FRONT_18617
Ka 0.257132 0.257132 0.257132
Kd 1.000000 1.000000 1.000000
Ks 0.075000 0.075000 0.075000
Ns 28.763239
illum 2
d 1.000000
map_Ka C:/Users/Jeremy/tinqs/animation/tools/tailor/piupiu.png
map_Kd C:/Users/Jeremy/tinqs/animation/tools/tailor/piupiu.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

@@ -0,0 +1,10 @@
# MTL Exporter v1.0 by Seungwoo Oh at CLO - Virtual Fashion Inc.
newmtl (Default_for_Simulation)_FRONT_32185
Ka 0.257132 0.257132 0.257132
Kd 1.000000 1.000000 1.000000
Ks 0.075000 0.075000 0.075000
Ns 28.763239
illum 2
d 1.000000
map_Ka C:/Users/Jeremy/tinqs/animation/tools/tailor/piupiu.png
map_Kd C:/Users/Jeremy/tinqs/animation/tools/tailor/piupiu.png
@@ -0,0 +1,61 @@
# Pari v2 (kapa haka taniko bodice) — tube-with-straps construction.
# Straps solve the v1 slide-down (tube settled underbust) AND cover the
# avatar's baked-in bra straps. Uses the proven tee shoulder-seam recipe.
# QC targets: band top ~1.31 m (above bust), hem ~1.05 m (waist) +-3 cm.
# python tools/md_bridge.py --file tools/tailor/md_pari.py --timeout 500
import os
import tempfile
report = {}
AVATAR_FBX = r"C:\Users\Jeremy\tinqs\animation\tools\tailor\avatar\Lena_QuatSkin_Avatar.fbx"
ZFAB = r"C:\Users\Public\Documents\MarvelousDesigner\New Assets\Fabric\(Default for Simulation).zfab"
TEX = r"C:\Users\Jeremy\tinqs\animation\tools\tailor\textures\taniko.png"
utility_api.NewProject()
op = ApiTypes.ImportExportOption()
op.scale = 10.0
op.bAddArrangementPoints = True
op.bAutoTranslate = True
report["avatar"] = import_api.ImportFBX(AVATAR_FBX, op)
# Tank-style: shoulder->waist 350 tall, 550/panel (snug over 1083 bust),
# straps 90 wide, wide-deep front scoop so the taniko band reads as a tube.
# y+ UP. Lines: 0 shoulder_L | 1-4 scoop (open) | 5 shoulder_R |
# 6 armhole_R | 7 side_R | 8 hem | 9 side_L | 10 armhole_L
def panel(scoop, dx):
top = 350.0
band = 350.0 - 105.0 # scoop floor -> band top ~ z 1.30
pts = [(65.0, top - 25.0), (155.0, top),
(205.0, top - scoop * 0.75), (275.0, top - scoop),
(345.0, top - scoop * 0.75), (395.0, top), (485.0, top - 25.0),
(550.0, 185.0), (550.0, 0.0), (0.0, 0.0), (0.0, 185.0)]
return pattern_api.CreatePatternWithPoints([(x + dx, y, 0) for (x, y) in pts])
pf = panel(105.0, 0.0) # front scoop floor = band top
pb = panel(45.0, 800.0) # shallower back
report["ids"] = [pf, pb]
for line in (0, 5, 7, 9):
pattern_api.AddSeamlinePairGroup(pf, line, pb, line, False, False)
fab = fabric_api.AddFabric(ZFAB)
fabric_api.SetBaseTextureMapImageGivenFilePath(TEX, fab)
for p in (pf, pb):
pattern_api.SetPatternPieceFabricIndex(p, fab)
arr = {a["ArrangementName"]: int(a["ArrangementIndex"])
for a in pattern_api.GetArrangementList()}
pattern_api.SetArrangement(pf, arr["Body_Front_Center_1"])
pattern_api.SetArrangement(pb, arr["Body_Back_Center_1"])
pattern_api.SetArrangementPosition(pf, 50, 55, 50)
pattern_api.SetArrangementPosition(pb, 0, 55, 50)
utility_api.ResetClothArrangement()
report["sim1"] = utility_api.Simulate(300)
utility_api.Refresh3DWindow()
snap = os.path.join(tempfile.gettempdir(), "tinqs_md_pari_v2.png")
export_api.ExportSnapshot3D(snap)
report["snap"] = snap
result = report
@@ -0,0 +1,56 @@
# Piupiu v2 (kapa haka flax skirt) — placement-targeted rebuild.
# QC targets (from reference photo, tools/tailor/qc_placement.py verifies):
# waistband top 1.05 m +-3 cm, hem 0.45 m +-4 cm (just below knee)
# python tools/md_bridge.py --file tools/tailor/md_piupiu.py --timeout 500
import os
import tempfile
report = {}
AVATAR_FBX = r"C:\Users\Jeremy\tinqs\animation\tools\tailor\avatar\Lena_QuatSkin_Avatar.fbx"
ZFAB = r"C:\Users\Public\Documents\MarvelousDesigner\New Assets\Fabric\(Default for Simulation).zfab"
TEX = r"C:\Users\Jeremy\tinqs\animation\tools\tailor\textures\piupiu.png" # dpi 43.3 = 600 mm
utility_api.NewProject()
op = ApiTypes.ImportExportOption()
op.scale = 10.0
op.bAddArrangementPoints = True
op.bAutoTranslate = True
report["avatar"] = import_api.ImportFBX(AVATAR_FBX, op)
# length 600 (waist 1.05 -> hem 0.45); tension waist 500/panel; A-line hem.
def panel(dx):
pts = [(160.0, 600.0), (660.0, 600.0), (820.0, 0.0), (0.0, 0.0)]
return pattern_api.CreatePatternWithPoints([(x + dx, y, 0) for (x, y) in pts])
sf = panel(0.0)
sb = panel(1000.0)
report["ids"] = [sf, sb]
pattern_api.AddSeamlinePairGroup(sf, 1, sb, 1, False, False)
pattern_api.AddSeamlinePairGroup(sf, 3, sb, 3, False, False)
fab = fabric_api.AddFabric(ZFAB)
fabric_api.SetBaseTextureMapImageGivenFilePath(TEX, fab)
for p in (sf, sb):
pattern_api.SetPatternPieceFabricIndex(p, fab)
arr = {a["ArrangementName"]: int(a["ArrangementIndex"])
for a in pattern_api.GetArrangementList()}
pattern_api.SetArrangement(sf, arr["Body_Front_Waist"])
pattern_api.SetArrangement(sb, arr["Body_Back_Waist"])
pattern_api.SetArrangementPosition(sf, 50, 30, 50)
pattern_api.SetArrangementPosition(sb, 0, 30, 50)
pattern_api.SetPatternStrengthen(sf, True)
pattern_api.SetPatternStrengthen(sb, True)
utility_api.ResetClothArrangement()
report["sim1"] = utility_api.Simulate(250)
pattern_api.SetPatternStrengthen(sf, False)
pattern_api.SetPatternStrengthen(sb, False)
report["sim2"] = utility_api.Simulate(50)
utility_api.Refresh3DWindow()
snap = os.path.join(tempfile.gettempdir(), "tinqs_md_piupiu_v2.png")
export_api.ExportSnapshot3D(snap)
report["snap"] = snap
result = report
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB