docs(characters): brows went back to painted on 2026-08-12

Merging origin/main in ariki-game surfaced a product decision newer than this doc:
Ozan removed the mesh brows, lash cards and browless-face swap from the product path.
Brows are painted on the body texture again and keep their baked colour, so "brows
follow the hair swatch" and the generated-surface lane are both parked.

The tooling and the brow wiki page still describe the 3D lane, so the note now says to
read the code before the docs there.

Two consequences outlive the revert and are kept: painted brows are still atlas-bound,
so the v02 re-atlas has to carry the pigment (an albedo-fidelity job now, not three
artifacts to regenerate); and character_brow.gdshader is still the only mechanism that
could recolour a brow on a scanned face, since raised scan geometry cannot be erased
with a texture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-12 17:47:00 -07:00
parent 760cf12788
commit 23fc4b378e
+14 -10
View File
@@ -225,15 +225,19 @@ Both are downstream of the same root cause — our bodies ship as **one mesh, on
one material** (`MI_Body_Lena`, `MI_Body_Mako`), so no facial feature is individually one material** (`MI_Body_Lena`, `MI_Body_Mako`), so no facial feature is individually
addressable. addressable.
- **Eyebrows.** Lena's ship path deletes painted brows from the albedo and attaches a - **Eyebrows — the whole 3D lane was reverted on 2026-08-12.** Ozan removed the mesh brows,
generated skinned surface built from a *locked UV-space mask* the lash cards and the browless-face swap from the product path: brows are **painted on the
(`tools/generate_lena_brow_surface.py`), coloured by the hair swatch. The mask, the browless body texture** again and keep their baked colour. That retires, for now, the generated
albedo and the surface JSON are **atlas-bound** — Lena's v02 re-atlas invalidates all three surface (`tools/generate_lena_brow_surface.py`), the locked BLUE mask, the browless albedo,
at once, and they must be regenerated in the same stage that finalizes the atlas. and "brows follow the hair swatch". The tooling and the wiki page remain, so read the code
There is also a live-but-superseded mask-tint path (`shaders/character_brow.gdshader`) that before the docs on this one.
recolors a painted brow in place — 72 % replace, not a multiply. That one generalizes to a Two consequences survive the revert. First, painted brows are **atlas-bound**, so Lena's v02
scanned face; the cover path does not, because you cannot erase raised scan geometry with a re-atlas still has to carry the brow pigment correctly — the difference is that it now rides
texture. Mako has `AttachFacialFeatures = false` and therefore no brow colour at all. in the albedo rather than in three separate artifacts. Second, the mask-tint path
(`shaders/character_brow.gdshader`, 72 % replace, not a multiply) is still live code and is
still the only mechanism that could recolour a brow on a scanned face — you cannot erase
raised scan geometry with a texture. Mako has `AttachFacialFeatures = false`, so his brows
are his scan's and are not editable at all.
- **Eye colour.** `ApplyEyeColorByIndex` swaps the whole albedo of the `OutfitSlot.Eyes` mesh - **Eye colour.** `ApplyEyeColorByIndex` swaps the whole albedo of the `OutfitSlot.Eyes` mesh
between six baked iris PNGs. It needs a **separate mesh or primitive** — there is no other between six baked iris PNGs. It needs a **separate mesh or primitive** — there is no other
mechanism. Lena only has one because stock Quaternius eye spheres are laid over her painted mechanism. Lena only has one because stock Quaternius eye spheres are laid over her painted
@@ -254,7 +258,7 @@ addressable.
| 4 | `hair_refit.py` + QC gates, baked per body | this repo | The part a 3-constant fit cannot reach: ear cutouts, the 23 % X/Z anisotropy, forehead line | | 4 | `hair_refit.py` + QC gates, baked per body | this repo | The part a 3-constant fit cannot reach: ear cutouts, the 23 % X/Z anisotropy, forehead line |
| 5 | 16 per-colour hair PNGs | this repo | Kills the `/0.55` swatch hack | | 5 | 16 per-colour hair PNGs | this repo | Kills the `/0.55` swatch hack |
| 6 | Iris primitive split at export | this repo | Gives Mako eye colour | | 6 | Iris primitive split at export | this repo | Gives Mako eye colour |
| 7 | Regenerate brow mask/browless/surface at atlas-final | Lena v02 lane | Or v02 ships with brows mismatched to her atlas | | 7 | Carry the painted brow pigment through the v02 re-atlas | Lena v02 lane | Brows went back to texture-only on 2026-08-12, so this is an albedo-fidelity job now, not three artifacts to regenerate |
Note the duplicated literal: `HeadAccessoryBindMath.ArikiHeadScale` carries its own copy of Note the duplicated literal: `HeadAccessoryBindMath.ArikiHeadScale` carries its own copy of
Lena's numbers marked "keep in sync with CharacterBuildData". Any change to hers must touch Lena's numbers marked "keep in sync with CharacterBuildData". Any change to hers must touch