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
+105
View File
@@ -0,0 +1,105 @@
{
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin_SkirtRig_4seg.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"min_island_verts": 40,
"name": "bottomTest1",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_piupiu_v3_garment.fbx",
"align": {
"top_bone": "spine_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.0,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Bottom": {
"slot": "Legs",
"islands": [
0
],
"tris": 8000,
"planar_deg": 0,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE",
"hem_mm": 80,
"_note_hem": "80mm, up from the 14 the old piupiu used. This is what stops the leg clipping through: it gives the skirt a real BELL that the leg swings INSIDE, rather than cloth lying on the thigh for the leg to punch through. Graded 0 at the hip to full at the hem, so the waistband still rides the hip. 45 was not enough; 80 holds through Walk and Dance."
},
"weights": "skirt_bones",
"color": [
0.45,
0.35,
0.15
],
"texture": "../tools/tailor/textures/bottom_test1.png",
"_note_planar": "0, NOT the default 5. reduce applies a planar DISSOLVE unconditionally before the tri-budget check, and these strands are flat strips, so deg 5 collapsed 3012 verts -> 884, destroying the vertical rows the 4-segment skirt ring needs to bend smoothly (the rig session's ask 4). The 8000-tri budget was never the constraint (4136).",
"_note_texture": "bottom_test1.png is generated by tools/tailor/textures/make_bottom_test1.py and MUST stay V-only (constant along U). A strand garment samples a different U slice per strand, so any horizontal variation makes the woven bands misalign strand-to-strand and read as noise. Measured before/after: mean horizontal stdev per row 50.2 -> 5.9. The pre-strand original is kept as bottom_test1_prestrand.png."
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/test1",
"gender": "Female",
"set": "Test1",
"note": "32 discrete strands from a 60 mm rigid waistband - Legs slot. Bound to the 4-SEGMENT skirt ring."
},
"catalog": {
"id": "bottom_test1_f",
"displayName": "Bottom Test 1",
"charisma": 0.1,
"workSpeed": 0.02,
"category": "ceremonial"
},
"expect": {
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
},
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
2861,
3162
],
"tris": [
3929,
4342
],
"z": [
4.21,
11.26
],
"x": [
-2.73,
2.79
]
}
}
}
},
"post_export": {
"_why": "MANUAL, REQUIRED, ORDER-SENSITIVE. clothing/skirt_garment_weights.py owns skirt weights; garment_pipeline.py's own 2-segment strand_weights is overwritten by it and whichever runs LAST wins. Must run AFTER export, BEFORE import. Nothing in garment.py enforces this \u2014 use clothing/reproduce_test1.py, which reads this block.",
"tool": "clothing/skirt_garment_weights.py",
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin_SkirtRig_4seg.glb",
"env": {
"SKIRT_HEM_FREE": "0.02",
"SKIRT_FOLLOW_MAX": "0.70",
"SKIRT_CONTACT_R": "0.22",
"SKIRT_FALLOFF": "0.14"
},
"_why_env": "The tool's defaults (FOLLOW_MAX 0.20, HEM_FREE 0.55) were tuned against the SHORT continuous piupiu. This skirt hangs to y 0.451 with the knee at ~0.517, so HEM_FREE 0.55 put the whole knee region in the no-follow band and the knee came through the cloth. These values lift mean thigh follow 0.128 -> 0.698, which is what carries cloth WITH the knee. Env overrides were ADDED to that script by this session; its defaults are unchanged so other garments are unaffected.",
"expect": "mean thigh follow ~0.70, NO dead strands (all 8 non-zero)"
}
}
+89
View File
@@ -0,0 +1,89 @@
{
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"min_island_verts": 40,
"name": "bottomTest2",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_skirt_v1_garment.fbx",
"align": {
"top_bone": "spine_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.0,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Bottom": {
"slot": "Legs",
"islands": [
0
],
"tris": 4000,
"planar_deg": 5,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE",
"hem_mm": 30,
"_note_hem": "Short A-line mini: 30mm graded hip->hem clearance so leg swing stays inside the hem. Standard dress weights (no skirt bones) - this is a first-pass review asset on the STANDARD body; expect the known no-skirt-bones hem compression on deep leg swings."
},
"weights": "dress",
"color": [
0.15,
0.25,
0.75
]
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/test2",
"gender": "Female",
"set": "Test2",
"note": "Blue A-line mini skirt (lena_skirt_v1, MD-authored proof garment 2026-07-30) - Legs slot, dress-gradient weights on the standard body."
},
"catalog": {
"id": "bottom_test2_f",
"displayName": "Bottom Test 2",
"charisma": 0.06,
"workSpeed": 0.05,
"category": "casual"
},
"expect": {
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
},
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
1851,
2045
],
"tris": [
3583,
3961
],
"z": [
8.2,
11.7
],
"x": [
-2.2,
2.4
]
}
}
}
}
}
+90
View File
@@ -0,0 +1,90 @@
{
"name": "bottom_test1",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_piupiu_v3_garment.fbx",
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin_SkirtRig_4seg.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"align": {
"top_bone": "spine_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.028,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Bottom": {
"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/bottom_test1.png"
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/test1",
"gender": "Female",
"set": "Test1",
"note": "piupiu v3 (32 discrete flax strands from a 60mm rigid waistband) as the neutral-named bottom_test1_f. Exported against the 4-SEGMENT SkirtRig body so the skin carries all 32 skirt joints."
},
"catalog": {
"id": "bottom_test1_f",
"displayName": "Bottom Test 1",
"charisma": 0.1,
"workSpeed": 0.02,
"category": "ceremonial"
},
"expect": {
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
2900,
3100
],
"tris": [
3950,
4300
],
"z": [
4.4,
11.2
],
"x": [
-2.6,
2.7
]
}
}
},
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
}
},
"min_island_verts": 40,
"_note": "NAMING: no cultural names on test garments (Jeremy 2026-07-31) - see ariki-game/src/Character/OutfitCatalog.cs class doc. Item id snake_case + gender suffix (bottom_test1_f), set id PascalCase (Test1) because it composes {Gender}_{Set}_{Slot}.gltf, folder lowercase (outfits/test1/).\n\nexpect.islands is MEASURED from work/bottom_test1/census.json (2026-07-31), not carried over from v2: 1 island, 3002 verts, 4120 tris, z 4.685..10.893, x -2.338..2.391 in PRE-SCALE census units (align.scale_* 0.1 applied later in `prepare`), i.e. hem 0.469 m and band top 1.089 m, matching the MD-side measurement. Bounds widened for tolerance, not tightened. v3 renumbered the MD patterns to Pattern_18856 / Pattern_20333 (v2's were Pattern_31891 / Pattern_32004) - README calls a config mapping the wrong islands 'the silent killer', so G2 was run first and passed on 1 island.\n\nSKIRT WEIGHTS HAVE ONE OWNER. garment_pipeline.py:876 strand_weights is hardcoded to two segments; this garment needs four. Run animation/clothing/skirt_garment_weights.py AFTER export - it reads segment count off the rig - or the game gets a 2-segment blend that reads as a rig regression."
}
+88
View File
@@ -0,0 +1,88 @@
{
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"min_island_verts": 40,
"name": "capeTest1",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_cape_v2_garment.fbx",
"align": {
"top_bone": "neck_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.0,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Cape": {
"slot": "Body",
"islands": [
0
],
"tris": 8000,
"planar_deg": 5,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE"
},
"weights": "dress",
"color": [
0.88,
0.88,
0.86
],
"_note_weights": "dress gradient: cape hem hangs to mid-thigh; nearest-face transfer alone would split the hem between legs in walk cycles, the pelvis gradient below hip keeps it hanging as one panel."
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/capetest1",
"gender": "Female",
"set": "CapeTest1",
"note": "Broad mantle cape (lena_cape_v2, 2026-08-04, ref tools/tailor/references/cape_test1_ref.png) - Body-slot overlay like the feather cloak. Flat color until textured."
},
"catalog": {
"id": "cape_test1_f",
"displayName": "Cape Test 1",
"charisma": 0.12,
"workSpeed": 0.01,
"category": "ceremonial"
},
"expect": {
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
},
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
4375,
4835
],
"tris": [
8480,
9372
],
"z": [
4.0,
14.7
],
"x": [
-2.65,
2.77
]
}
}
}
}
}
+89
View File
@@ -0,0 +1,89 @@
{
"name": "dress",
"source": "C:/Users/Jeremy/tinqs/animation/garments/thin-unweld.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": 1.18,
"scale_z": 0.95,
"z_nudge": 0.03,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Dress": {
"slot": "Body",
"islands": [
0,
10,
11,
12,
13
],
"cut_above_z": 1.13,
"tris": 4500,
"planar_deg": 5,
"bake_size": 1024,
"fit": {
"target": "BODY_SHELL",
"mask": "full",
"offset_mm": 3,
"wrap_mode": "OUTSIDE"
},
"weights": "dress",
"color": [
0.72,
0.3,
0.28
],
"cut_outboard_x": 0.26,
"cut_outboard_z_above": 1.02,
"prune_scraps_x": 0.2,
"weld_band": [
0.93,
1.14,
0.008
]
},
"Bodice": {
"slot": "Body",
"type": "bodyshell",
"z0": 1.1,
"z1": 1.385,
"bones": [
"spine_01",
"spine_02",
"spine_03"
],
"offset_mm": 6,
"tris": 1400,
"planar_deg": 3,
"bake_size": 512,
"color": [
0.72,
0.3,
0.28
]
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/mddress",
"gender": "Female",
"set": "MDDress",
"note": "v1 = one-piece long-sleeved dress (ISL_000 + center buttons). Jacket (ISL_001) + its buttons (ISL_002-009) deferred to v2."
},
"drop_materials": [
"Material441866",
"Material441989"
],
"min_island_verts": 40,
"torso_boost": {
"z0": 1.0,
"z1": 1.1,
"xy": 1.2
}
}
+47
View File
@@ -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
}
+48
View File
@@ -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
}
+48
View File
@@ -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
}
+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."
}
+88
View File
@@ -0,0 +1,88 @@
{
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin_SkirtRig_4seg.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"min_island_verts": 40,
"name": "topTest1",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_pari_v4_garment.fbx",
"align": {
"top_bone": "neck_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.0,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Top": {
"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/top_test1.png"
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/test1",
"gender": "Female",
"set": "Test1",
"note": "Flat front/back re-cut bodice - Body slot."
},
"catalog": {
"id": "top_test1_f",
"displayName": "Top Test 1",
"charisma": 0.14,
"workSpeed": 0.01,
"category": "ceremonial"
},
"expect": {
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
},
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
1301,
1438
],
"tris": [
2511,
2776
],
"z": [
10.42,
14.82
],
"x": [
-2.43,
2.38
]
}
}
}
}
}
+87
View File
@@ -0,0 +1,87 @@
{
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin.glb",
"weld_threshold": 0.0006,
"shell_mm": 4,
"min_island_verts": 40,
"name": "topTest2",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_tee_v1_garment.fbx",
"align": {
"top_bone": "neck_01",
"scale_xy": 0.1,
"scale_z": 0.1,
"z_nudge": 0.0,
"xy_nudge": [
0.0,
0.0
]
},
"parts": {
"Top": {
"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.85,
0.85,
0.85
]
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/test2",
"gender": "Female",
"set": "Test2",
"note": "White tank/tee (lena_tee_v1, first MD-authored proof garment 2026-07-30) - Body slot. Flat color until a texture is authored."
},
"catalog": {
"id": "top_test2_f",
"displayName": "Top Test 2",
"charisma": 0.06,
"workSpeed": 0.05,
"category": "casual"
},
"expect": {
"penetration": {
"depth_mm": 1.0,
"max_verts": 0,
"clips": [
"Idle",
"Walk"
],
"frames_per_clip": 6
},
"islands": {
"count": 1,
"mapped": {
"0": {
"verts": [
2176,
2406
],
"tris": [
4227,
4671
],
"z": [
9.9,
14.9
],
"x": [
-2.2,
2.25
]
}
}
}
}
}
+55
View File
@@ -0,0 +1,55 @@
{
"name": "top_test1",
"source": "C:/Users/Jeremy/tinqs/animation/tools/tailor/lena_pari_v4_garment.fbx",
"body": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/derived-bodies/Ariki_Female_QuatSkin_SkirtRig_4seg.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": {
"Top": {
"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/top_test1.png"
}
},
"export": {
"out_dir": "C:/Users/Jeremy/tinqs/ariki-game/assets/quaternius/outfits/test1",
"gender": "Female",
"set": "Test1",
"note": "pari v4 (twisted side seam fixed with (True,True), tapered 95mm, symmetric arrangement) as the neutral-named top_test1_f. Body slot, no skirt bones."
},
"catalog": {
"id": "top_test1_f",
"displayName": "Top Test 1",
"charisma": 0.14,
"workSpeed": 0.01,
"category": "ceremonial"
},
"min_island_verts": 40,
"_note": "NAMING: no cultural names on test garments (Jeremy 2026-07-31) - see ariki-game/src/Character/OutfitCatalog.cs class doc.\n\nBody is the *_SkirtRig_4seg.glb copy purely so the top and bottom of this set are fitted against the SAME body the bed spawns; a Body-slot garment uses weights=dress and never touches the skirt ring, so the extra 32 joints are inert here.\n\nNo `expect` block yet - the pari has no measured penetration baseline, and its known open defect is the in-game neckline gape, which did NOT reproduce in the Blender checkpoint (so it is G6/in-game territory: attach, material or LOD, not authoring)."
}