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,87 @@
# Handoff: re-atlased nude Lena — `lena_nude_decimated_glb_v02.glb`
**2026-08-06.** Jeremy asked for the decimated nude body re-atlased and versioned. This is a
**UV + texture change only**: the geometry is byte-for-byte the v01 mesh.
## The file
`characters/female/lena_nude/lena_nude_decimated_glb_v02.glb`
| | |
|---|---|
| sha256 | `cd3d53550470ae5a1958dc473ce11793f746b13f78ac911e6d426b6f7b9f5825` |
| parent | `lena_nude_decimated_glb_v01.glb` |
| recipe | `hires_claude/24_seams.py``hires_claude/31_reatlas.py` |
| mesh | 31,964 v / 64,957 tris in Blender — **identical to v01** |
| exported verts | 42,980 (v01: 46,810) — the new layout needs fewer seam splits |
| maps | basecolor + normal + rm embedded, 4096², JPEG q95, correct colorspaces |
| rig | none — unrigged, transforms applied |
Rebuild:
```
blender --background --python 24_seams.py -- ../lena_nude_decimated_glb_v01.glb atlas_v02
blender --background --python 31_reatlas.py -- atlas_v02/seamed.blend atlas_v02 \
../lena_nude_decimated_glb_v02.glb
```
## What changed
| | Tripo atlas (v01) | new atlas (v02) |
|---|---|---|
| UV islands | 5,870 | 968 |
| charts holding 99% of the area | 84 | **14** |
| atlas coverage | 62.0% | **68.6%** |
| texel-density spread | 1.8× | **1.00×** |
| per-triangle area-scale p95 / p99 | — | 1.77 / 2.27 |
The 14 charts are torso, head, two arms, two legs, two hands (back + palm each) and two feet
(upper + sole each). Seams run up the back midline, the back of each arm and the inner leg, with
rings at neck, shoulder, wrist, hip and ankle — every landmark measured off the mesh's own
cross-section radius profiles, so the rules port to any density.
**It looks the same, on purpose.** Five matched views diff at mean \|Δ\| 0.0012, p99 0.0118, with
0.19% of body pixels over 0.05 (`33_ab.py`). Her original tones are untouched — this pass bought a
paintable, uniform-density layout, not a new look.
## Three traps this pass hit, so you don't
1. **Colorspace is not cosmetic.** `image.pixels` returns *linear* values for an sRGB image and
*raw* values for a Non-Color one, and re-encodes the same way on save. The normal and rm maps
are Non-Color; writing them into default (sRGB) images gamma-encoded them, so 0.5 came back as
0.21 — every stored normal became a large false perturbation and she rendered dark and
wet-plastic. New maps must inherit `colorspace_settings.name` from their source.
2. **Use the minimum-stretch solver, not angle-based.** ABF is conformal: it preserves angles and
is free to crush area. At her folds it squashed 4,502 triangles (3.7% of her surface) below one
texel, and they came out untextured. `method='MINIMUM_STRETCH'` took per-triangle area-scale p05
from 0.03 to 0.33 and the untextured count from 4,502 to 569 (0.56%, all genuine sub-texel
slivers absorbed by the 16 px padding pass).
3. **Watch the LOW tail of the distortion stat.** p95/p99 measure stretching; it was p05 = 0.03 —
crushing — that was losing whole patches. I read past it twice.
Also tried and rejected: splitting the 1,649 non-manifold edges before unwrapping. It cost +3,512
verts and made the collapsed-face count *worse* (4,502 → 5,482), because the collapse was a solver
problem, not a topology one.
## Still broken, and not from this pass
**The ragged grey tears on the face, across the underbust, and as flecks down the arms and shins
are in v01 already** — I rendered v01 through the same script to confirm, and they are identical in
position and shape (`hires_claude/beauty_input_v01/` vs `beauty_atlas_v02/`). They are the 835
boundary edges / dangling flaps the v01 handoff lists as a known defect. A re-atlas cannot fix
geometry. They need mesh surgery before this body ships.
The other v01 defects carry over untouched: 25 backfacing triangles, the head still being original
Tripo output, and the glossy `rm` map.
## What this does NOT do
Jeremy's stated goal is to **keep her original texture and replace only the breast and underwear
region**. This pass deliberately does not touch colour — it only rehouses it. The re-authoring step
(a gradient-domain fill pinned to her surrounding skin at the boundary, so the old bra/briefs
outline cannot ghost) is the next stage, and it is much easier now that the charts are anatomical
and uniform-density.
Note that keeping her original texture keeps its known incoherence: her feet read 0.11 luma darker
and 50% redder than her belly, and the rosy chest V remains. Measured in
`hires_claude/21_seam_probe.py`; see the `lena-tripo-atlas-chart-soup` note.