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
+29
View File
@@ -0,0 +1,29 @@
{
"extends": "tests/extends_parent.json",
"name": "extends_child",
"weld_threshold": 0.0009,
"align": {
"z_nudge": 0.042,
"xy_nudge": [0.01, 0.0]
},
"parts": {
"Skirt": {
"islands": [2],
"fit": { "offset_mm": 7 }
},
"Belt": {
"slot": "Body",
"islands": [3],
"tris": 600
}
},
"export": { "set": "TestSetChild" },
"catalog": { "displayName": "Child Skirt" },
"_note": "Fixture for garment.py --selftest ONLY. Exercises: scalar override (weld_threshold), object merge-per-key (align.z_nudge overrides while top_bone/scale_* survive), array-replaces-whole (align.xy_nudge, parts.Skirt.islands), nested part override (parts.Skirt.fit.offset_mm changes, fit.mask survives), part addition (Belt), and inheritance of everything untouched."
}
@@ -0,0 +1,46 @@
{
"name": "extends_parent",
"source": "C:/parent/source.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": {
"Skirt": {
"slot": "Legs",
"islands": [0, 1],
"tris": 8000,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE"
},
"weights": "surface",
"color": [0.45, 0.35, 0.15]
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/testset",
"gender": "Female",
"set": "TestSetParent"
},
"catalog": {
"id": "testset_legs_f",
"displayName": "Parent Skirt",
"charisma": 0.05,
"workSpeed": 0.04,
"category": "casual"
},
"expect": {
"islands": { "count": 2 }
},
"min_island_verts": 40,
"_note": "Fixture for garment.py --selftest ONLY. Not a real garment; never built."
}
+31
View File
@@ -0,0 +1,31 @@
{
"name": "piupiu_sb",
"_note": "G2 self-test config (agent B lane). Mirrors configs/piupiu_sb.json's parts/export, plus an expect.islands block whose bounds were DERIVED from the real clothing/work/piupiu_sb/census.json (island 0: verts 3620, tris 7104, z [5.184, 11.126]). Run: python clothing/gates/g2_census.py --config clothing/configs/tests/g2_selftest.json --work clothing/work/piupiu_sb. Bounds are in census (pre-align) units, not metres — align.scale_z 0.1 is applied later in prepare.",
"parts": {
"Piupiu": {
"slot": "Legs",
"islands": [0],
"tris": 8000
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/kapahaka",
"gender": "Female",
"set": "KapahakaSB"
},
"min_island_verts": 40,
"expect": {
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [3550, 3700],
"tris": [7000, 7200],
"z": [5.0, 11.3],
"z_span": [5.8, 6.05],
"x": [-2.5, 2.6]
}
}
}
}
}
@@ -0,0 +1,49 @@
{
"name": "pari",
"_note": "G5/G3 validation config (agent C). Mirrors configs/pari.json and adds an expect block. Ground truth: the neckline gapes off the sternum in walk/dance, so a correct G5 FAILS on the gape band here while --rest (G3) passes.",
"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": "Taniko bodice (pari) - Body slot"
},
"min_island_verts": 40,
"expect": {
"penetration": {
"max_verts": 0,
"depth_mm": 1.0,
"clips": ["Idle", "Walk", "Dance"],
"frames_per_clip": 6,
"gape": {
"Pari": {
"_note": "Calibrated by scanning body exposure in 3 cm z-slices (agent C). The pari is a scoop-neck crop top: its hem sits at z~1.06 and the neckline scoop bottoms out at z~1.325, so z 1.15-1.30 is the strip the garment MUST cover. band_x clips the arms out of the band (they fall in the same z range and are never covered, which swamped a naive band). gap_mm 0 = score only rays that miss the fabric entirely.",
"band_z": [1.15, 1.30],
"band_x": [-0.11, 0.11],
"facing": [0.0, -1.0, 0.0],
"facing_min": 0.35,
"ray_mm": 50,
"gap_mm": 0,
"max_exposed_verts": 60,
"max_exposed_delta": 25
}
}
}
}
}
@@ -0,0 +1,38 @@
{
"name": "piupiu",
"_note": "G5/G3 validation config (agent C). Mirrors configs/piupiu.json and adds an expect block. Ground truth: a thigh punches through this skirt in motion, so a correct G5 FAILS here while --rest (G3) passes.",
"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,
"expect": {
"penetration": {
"max_verts": 0,
"depth_mm": 1.0,
"clips": ["Idle", "Walk", "Dance"],
"frames_per_clip": 6,
"max_verts_rest": 2,
"_note_rest": "The shipped piupiu has ONE 8 mm nick in the fitting pose; the pose-dependent defect is 78-197 verts up to 93 mm. A rest budget of 2 keeps G3 honest about the fit while letting the posed sweep own the real signal."
}
}
}
@@ -0,0 +1,96 @@
{
"name": "md_pari_backfill",
"_note": [
"BACKFILL PROOF, not a shipping config. Transcribes tools/tailor/md_pari.py (pari v2,",
"the kapa haka taniko bodice) into the `md` block schema so draft_garment.py can be",
"diffed call-for-call against the hand-written original. Semantic differences must be",
"zero. It carries no Blender (`align`/`parts`) blocks -- MD stage + gate G1 only.",
"md.exports is deliberately empty because md_pari.py never exported; a shipping config",
"sets exports to all four with a versioned export_basename (see md.export_basename).",
"md.snapshot is md_pari.py's tempfile path verbatim; a shipping config points it at",
"work/<name>/qc/drape.png. expect.drape.snapshot overrides it here so G1 can be run",
"against the committed review render tools/tailor/screenshots/lena_pari_v2.png."
],
"md": {
"reset": "new_project",
"avatar_fbx": "C:/Users/Jeremy/tinqs/animation/tools/tailor/avatar/Lena_QuatSkin_Avatar.fbx",
"avatar_scale": 10.0,
"add_arrangement_points": true,
"auto_translate": true,
"zfab": "C:/Users/Public/Documents/MarvelousDesigner/New Assets/Fabric/(Default for Simulation).zfab",
"texture": "C:/Users/Jeremy/tinqs/animation/tools/tailor/textures/taniko.png",
"texture_dpi": 96.012,
"panels": [
{
"name": "front",
"note": "tank-style, shoulder->waist 350 tall, 550/panel (snug over 1083 bust), straps 90 wide; scoop 105 deep so its floor = band top ~ z 1.30",
"dx": 0.0,
"points": [
[65.0, 325.0], [155.0, 350.0], [205.0, 271.25], [275.0, 245.0],
[345.0, 271.25], [395.0, 350.0], [485.0, 325.0],
[550.0, 185.0], [550.0, 0.0], [0.0, 0.0], [0.0, 185.0]
]
},
{
"name": "back",
"note": "same block, shallower 45 scoop; 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",
"dx": 800.0,
"points": [
[65.0, 325.0], [155.0, 350.0], [205.0, 316.25], [275.0, 305.0],
[345.0, 316.25], [395.0, 350.0], [485.0, 325.0],
[550.0, 185.0], [550.0, 0.0], [0.0, 0.0], [0.0, 185.0]
]
}
],
"seams": [
{ "a": "front", "b": "back", "lines": [0, 5, 7, 9] }
],
"arrangements": [
{ "panel": "front", "point": "Body_Front_Center_1", "offset": [50, 55, 50] },
{ "panel": "back", "point": "Body_Back_Center_1", "offset": [0, 55, 50] }
],
"sim": {
"strengthen": false,
"settle_frames": 300,
"relax_frames": 0
},
"snapshot": "C:/Users/Jeremy/AppData/Local/Temp/tinqs_md_pari_v2.png",
"export_dir": "C:/Users/Jeremy/tinqs/animation/tools/tailor",
"export_basename": "lena_pari_v3",
"exports": []
},
"expect": {
"bands": {
"taniko": {
"top_m": 1.31,
"bottom_m": 1.05,
"tol_m": 0.03,
"from": "cover"
}
},
"drape": {
"snapshot": "C:/Users/Jeremy/tinqs/animation/tools/tailor/screenshots/lena_pari_v2.png",
"height_m": 1.777,
"min_row_cover": 0.4,
"z_range": [0.3, 1.6],
"mask": {
"mode": "colors",
"tol": 30,
"_note": "taniko palette: three reds, the black outline, two cream whites",
"colors": [
[173, 37, 39], [130, 26, 29], [146, 29, 31],
[36, 32, 32], [194, 186, 168], [230, 225, 215]
]
}
}
}
}
@@ -0,0 +1,87 @@
{
"name": "md_piupiu_backfill",
"_note": [
"BACKFILL PROOF, not a shipping config. Transcribes tools/tailor/md_piupiu.py (piupiu",
"v2, the kapa haka flax skirt) into the `md` block schema. Exercises the half of the",
"schema md_pari_backfill.json does not: the strengthen/relax two-pass settle and the",
"two-point A-line panel. Semantic differences against the original must be zero.",
"md.exports is empty because md_piupiu.py never exported; the v2 .zprj/.fbx/.obj/.zpac",
"on disk were produced by separate --exec calls."
],
"md": {
"reset": "new_project",
"avatar_fbx": "C:/Users/Jeremy/tinqs/animation/tools/tailor/avatar/Lena_QuatSkin_Avatar.fbx",
"avatar_scale": 10.0,
"add_arrangement_points": true,
"auto_translate": true,
"zfab": "C:/Users/Public/Documents/MarvelousDesigner/New Assets/Fabric/(Default for Simulation).zfab",
"texture": "C:/Users/Jeremy/tinqs/animation/tools/tailor/textures/piupiu.png",
"texture_dpi": 43.307,
"panels": [
{
"name": "front",
"note": "length 600 (waist 1.05 -> hem 0.45); tension waist 500/panel (< 1095 hip circ, no elastic); A-line hem 820",
"dx": 0.0,
"points": [[160.0, 600.0], [660.0, 600.0], [820.0, 0.0], [0.0, 0.0]]
},
{
"name": "back",
"note": "identical block; lines 0 waist | 1 side_R | 2 hem | 3 side_L",
"dx": 1000.0,
"points": [[160.0, 600.0], [660.0, 600.0], [820.0, 0.0], [0.0, 0.0]]
}
],
"seams": [
{ "a": "front", "b": "back", "lines": [1] },
{ "a": "front", "b": "back", "lines": [3] }
],
"arrangements": [
{ "panel": "front", "point": "Body_Front_Waist", "offset": [50, 30, 50] },
{ "panel": "back", "point": "Body_Back_Waist", "offset": [0, 30, 50] }
],
"sim": {
"strengthen": true,
"settle_frames": 250,
"relax_frames": 50
},
"snapshot": "C:/Users/Jeremy/AppData/Local/Temp/tinqs_md_piupiu_v2.png",
"export_dir": "C:/Users/Jeremy/tinqs/animation/tools/tailor",
"export_basename": "lena_piupiu_v2",
"exports": []
},
"expect": {
"bands": {
"flax": {
"top_m": 1.05,
"bottom_m": 0.45,
"tol_m": 0.03,
"bottom_tol_m": 0.04,
"from": "cover"
}
},
"drape": {
"snapshot": "C:/Users/Jeremy/tinqs/animation/tools/tailor/screenshots/lena_piupiu_v2.png",
"height_m": 1.777,
"min_row_cover": 0.4,
"z_range": [0.2, 1.3],
"mask": {
"mode": "colors",
"tol": 24,
"_note": "flax strand yellows + the black geometric banding; tol 24 (not 30) keeps the body's baked-in beige underwear out of the mask",
"colors": [
[184, 152, 104], [168, 136, 104], [200, 168, 136], [152, 136, 88],
[184, 168, 120], [200, 184, 136], [24, 24, 24], [40, 24, 24]
]
}
}
}
}
@@ -0,0 +1,90 @@
{
"name": "piupiu_sb_test",
"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/animation/clothing/work/piupiu_sb_test/export",
"gender": "Female",
"set": "KapahakaSBTest",
"note": "SCRATCH export target. Deliberately NOT the shipped kapahaka folder and NOT the real KapahakaSB set id - see _note."
},
"catalog": {
"id": "kapahaka_legs_sbtest_f",
"displayName": "Piupiu (skirt bones, test)",
"charisma": 0.1,
"workSpeed": 0.02,
"category": "ceremonial"
},
"expect": {
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
3400,
3800
],
"tris": [
6800,
7400
],
"z": [
5.0,
11.5
],
"x": [
-2.6,
2.9
]
}
}
},
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
}
},
"min_island_verts": 40,
"_note": "TEST FIXTURE for the unified clothing pipeline (garment.py + gates). Geometry/align/parts are a byte-copy of configs/piupiu_sb.json; everything else differs on purpose.\n\nDEFUSED 2026-07-31 (integration): export.out_dir used to point at the LIVE ariki-game/assets/quaternius/outfits/kapahaka and export.set was the real 'KapahakaSB', so a --to export run would have OVERWRITTEN the shipped Female_KapahakaSB_Legs.gltf. out_dir is now this config's own work dir and the set id is 'KapahakaSBTest', which collides with nothing and is deliberately absent from OutfitCatalog.cs (so G8 warns 'not registered' - that is the correct answer for a test set, and the run is safe to do end to end).\n\nexpect.islands is the measured truth from work/piupiu_sb_test/census.json: 1 island, 3620 verts, 7104 tris, z 5.184..11.126, x -2.228..2.517, in PRE-SCALE census units (align.scale_* 0.1 is applied later in `prepare`) - bounds are widened for tolerance, not tightened.\n\nexpect.penetration carries the contract defaults and IS EXPECTED TO FAIL at the `skin` stage: this garment is the shipped thigh-through-the-piupiu bug, and reproducing it headlessly is the point of G5. At `fit` (G5 --rest, written as qc/g3.json) the same block FAILS on a genuine 1-vert / 8.0mm rest-pose nick in 20_fit.blend - a real finding, deliberately not tuned away; set max_verts_rest: 1 here if a 1-vert rest budget is ever ruled acceptable."
}