feat(characters): ship lena_leafbikini_base_v01 as female Ariki default

Lena with the leaf bikini sculpted into the mesh — a separate character
descending from her own Tripo original, not a lena_base_v02. Full-res
(1,029,360 v) at 1.777 m, now Ariki_Female_QuatSkin.glb + LOD1.

First nearest-surface graft in the rig lane: AccuRig had to be fed a 20:1
decimated bait, so the index-exact graft the two earlier ships used was
impossible. The bait recovers AccuRig's 9.346 mm offset in closed form, which
makes it a required input forever — copied into the ship folder, and rig-work's
"disposable" rule amended to say so. Mesh moved 0 mm, 0 unweighted verts.

lena_base_v01 goes superseded, not rolled-back: she lost the default slot but
Ariki_Female_QuatSkin_Nude.glb is untouched, so per rule 9 her folder stays put.

Also lands the leaf-cut lane (work/lena_leafbikini): hue-keyed seam detection
that removes the leaf shell and leaves both holes open by request, registered
as a lane milestone with its sha256. Corrects the rig-work trap note — baits do
carry embedded textures; it is AccuRig that strips them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 16:09:45 -07:00
parent d6f1587eb0
commit eae8327811
23 changed files with 2361 additions and 8 deletions
+75 -2
View File
@@ -139,7 +139,7 @@ names without touching the immutable delivered files.
|---|---|---|---|
| `lena` | female | `female_lena_tripo` | `lena_base_v01` |
| `mako` | male | `male_base_bald_tripo_v1` | `mako_base_v01` |
| `lena_leafbikini` | female | `female_lena_leafbikini_tripo` | — (none yet; ancestor registered 2026-08-13, derivatives pending) |
| `lena_leafbikini` | female | `female_lena_leafbikini_tripo` | `lena_leafbikini_base_v01` (live lane: `work/lena_leafbikini`) |
Spelling history for the male: game wiki "Mako", AccuRig-era typo "moka", also "moko".
Canonical filename token is **`mako`**; the others are never used in new files.
@@ -152,8 +152,15 @@ Status vocabulary: `shipped / superseded / rolled-back`.
| folder | character | date | status | ship name in ariki-game | sha256 (repo-side body) |
|---|---|---|---|---|---|
| `female/lena_base_v01` | `lena` | 2026-08-10 | shipped | `Ariki_Female_QuatSkin_Nude.glb`, and swapped into `Ariki_Female_QuatSkin.glb` | `0d602accef0992a6a0dfffa5b73b1f9b702400df5258ff7517f786f11050f4d0` |
| `female/lena_base_v01` | `lena` | 2026-08-10 | superseded | `Ariki_Female_QuatSkin_Nude.glb`, and swapped into `Ariki_Female_QuatSkin.glb` | `0d602accef0992a6a0dfffa5b73b1f9b702400df5258ff7517f786f11050f4d0` |
| `male/mako_base_v01` | `mako` | 2026-08-12 | shipped | `Ariki_Male_Mako.glb` (male Ariki default, lineage `MALE-MAKO-FULLHEAD-V1`) | `220714a2fb6283188be3834214877204533fde78de9a6ffa03ed85e1167735d3` |
| `female/lena_leafbikini_base_v01` | `lena_leafbikini` | 2026-08-13 | shipped | `Ariki_Female_QuatSkin.glb` (female Ariki default) + `Ariki_Female_QuatSkin_LowPoly_40.glb` (LOD1) | `bbfd8ac3919ad171cab76d62bec133d1f149ee3cf3c5d27f7408d502e99d678e` |
`lena_base_v01` is marked **superseded**, not rolled-back: she was displaced from
`Ariki_Female_QuatSkin.glb` on 2026-08-13 but her own ship name
`Ariki_Female_QuatSkin_Nude.glb` is untouched and still in the game. Per rule 9 her folder
moves to `characters/archive/` only when that file goes too. Nothing about her was wrong —
the game simply changed which body is the female default.
### `lena_base_v01` — what it is
@@ -200,3 +207,69 @@ Lena's head, `MALE-MAKO-D-V1`, kept on disk as comparison) as the male Ariki def
**Known decisions:** height 1.818 m is provisional (IB-lane taller-than-Lena convention,
not eye-locked); ship name avoids the `QuatSkin`/`QuatBody` tokens because
`PlayerController` string-gates on them; no male LOD1 yet. Details in the folder README.
### `lena_leafbikini_base_v01` — what it is
Lena wearing a leaf bikini **sculpted into the mesh** — not a garment, so there is no cloth
to fit and no OutfitCatalog entry. Full-resolution Tripo scan (999,823 v after weld) at
1.777 m, the game's female default from 2026-08-13.
She is the first ship of a **separate character**, not a `lena_base_v02`: she descends from
her own Tripo original and shares no geometry with the nude sculpt, which is why the
Characters table has carried a `lena_leafbikini` row since the ancestor was registered.
| step | what happened |
|---|---|
| bait | `tools/rigbait_decimate.py` body 24k / head 14k / hands 40k → 51,682 v, no scale, no recenter |
| rig | AccuRig 1.10.1822.1, manual, on the bait → 101 `CC_Base_*` bones |
| graft | **nearest-surface** (`work/lena_leafbikini/01_graft.py`) — 51,682 v carrier onto the 1,029,360 v pristine mesh; mesh moved 0 mm, 0 unweighted verts, rest-pose drift 0.000239 mm |
| quatskin | `ariki-game/tools/make_lena_fullres_quatskin.py` `LENA_CLEAR_SPLIT_NORMALS=1` → 65 joints, 1.777 m, rigid mitts |
**First nearest-surface graft in this lane.** The two earlier ships were index-exact because
AccuRig had been given the shipping mesh whole; a 20:1 decimated bait makes that impossible.
AccuRig's 9.346 mm offset is recovered in closed form by fitting the rigged carrier against
the **bait**, which is index-exact with it and already in the GLB's space — so the bait is a
required input to the graft, not disposable, and lives in the ship folder.
**Known decisions:** single-sided, unlike `lena_base_v01` whose `doubleSided=true` was forced
by inward-wound patches this mesh does not have; no `Ariki_*_LeafBikini.glb` companion file
(the `_Nude.glb` precedent would have cost a duplicate 79 MB full-res body in LFS and a
duplicate Godot import — the new `LENA_OUT_GLB` override writes the canonical name directly);
LOD1 is 391,948 v, far heavier than the 14,559 v body it replaced, because
`make_lena_lowpoly.py` protects the head at full resolution and this head alone is 103,225 v.
---
## Lane artifacts (not ships)
Rule 11 exempts `work/` from the folder grammar and from rule 10, so nothing below has —
or needs — a Ships row. They are listed here because they are *registered lane milestones*:
someone else must be able to find out what a heavy binary sitting in a gitignored `v0N/`
dir is, and why. Each is `git add -f`'d against `characters/work/*/v0[0-9]/`, exactly as
that .gitignore rule anticipates.
| file | sha256 | date | built by | what it is |
|---|---|---|---|---|
| `work/lena_leafbikini/v01/lena_leafbikini_leafcut_sculpt_glb_v01.glb` | `8aa3421e98e985b57bda222a5cee6fd87343b6b773376c740bd907ae08db8897` | 2026-08-13 | `work/lena_leafbikini/04`+`05` | the leaf bikini **cut away at its seam, holes left open** |
### `lena_leafbikini_leafcut_sculpt_glb_v01` — what it is
`originals/female/female_lena_leafbikini_tripo.glb` with the leaf geometry deleted along
the line where it stops being Lena: 474,224 faces and 247,658 vertices removed (23.8% /
24.1%), leaving two open holes — bust and briefs. **The holes are not filled, by request.**
It exists so the seam itself can be judged before any repair is designed.
The leaves are welded into the body — one Tripo mesh, one material, one UV map — so they
are a bulge in the body surface, not a separable object. They are also **real geometry**,
which is the opposite of the case `lena_base_v01` had to solve: there the sculpted-in
underwear *was* the skin, painted on, so deleting it opened a hole and the fix was to
re-fair a rim crease (`tools/make_lena_nude_body.py`). Here there is a shell to remove, and
the seam is found by a **hue key** — skin 2040°, leaf 6080° — repaired on the mesh over
position-welded adjacency, then grown 2 rings so the cut lands just outside the rim.
`work/lena_leafbikini/README.md` carries the full reasoning and the regeneration commands.
Unrigged, because it was authored on the pristine original. That costs nothing: the graft
that produced the ship moved the mesh 0.000000 mm, so `lena_leafbikini_base_v01` holds the
same 1,029,360 vertices in the same order and `work/lena_leafbikini/leaf_mask.npz` indexes
either mesh. Cutting the shipped body is the same stage 05 with a different input — and
per rule 2 its result is a new ship folder, never an edit to the frozen one.