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>
@@ -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 v1–v2, pari v1–v3, outfit v1–v3 |
|
||||
| `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*/` — 92–102 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 ~1–2 cm clearance. `fit`/G3 measures 8 mm penetration **at rest**;
|
||||
G5 measures 216–231 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
|
||||
}
|
||||
|
After Width: | Height: | Size: 502 KiB |
|
After Width: | Height: | Size: 512 KiB |
|
After Width: | Height: | Size: 510 KiB |
|
After Width: | Height: | Size: 420 KiB |
|
After Width: | Height: | Size: 466 KiB |
|
After Width: | Height: | Size: 462 KiB |
|
After Width: | Height: | Size: 496 KiB |
|
After Width: | Height: | Size: 472 KiB |
|
After Width: | Height: | Size: 170 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
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
|
||||
}
|
||||
|
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
|
||||
|
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
|
||||
|
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
|
||||
|
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
|
||||
|
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
|
||||
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 37 KiB |