fix(assets): address PR #96 review — all 8 items

- Fix stale 21→18 segment count in architecture doc, script docstrings,
  and disk budget table (critical — both reviewers)
- Add average_m/README.md noting role as clothing reference body
- Add __main__ guards to diagnostic scripts
- Preflight-check all source paths in blender_process_bodies.py
- Document solid-white hair masks as v0.2 placeholder for multi-region
- Add fallback size comment for head mask generation
- Add bald_mask.png (1×1 black) for sidecar convention consistency
- Document child non-uniform scale rationale (Y=0.72 vs XZ=0.75)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-22 15:24:50 +01:00
co-authored by Claude Opus 4.6
parent 8f7e0f09b0
commit 0b1bfe6a96
11 changed files with 114 additions and 65 deletions
@@ -116,7 +116,7 @@ client/assets/characters/
seg_eyes.glb
seg_eyebrows.glb
thin_f/
... # Same 21 segment files
... # Same 18 segment files
average_m/
...
average_f/
@@ -134,7 +134,7 @@ client/assets/characters/
heavy_f/
...
child/ # Gender-neutral, forked from Teen
... # Same 21 segments but different proportions
... # Same 18 segments but different proportions
skin_tones/
pale_cool.png # Skin tone texture variants
pale_warm.png # Shared across all body types --
@@ -243,9 +243,9 @@ split from hair into their own directories because they are separate equip slots
### Why this structure
**Bodies are directories, not flat files.** Each body type produces 21 segment GLBs (17 base
+ 2 swappable torso variants + 2 face detail). Putting them in flat `bodies/` with prefixes
(`thin_m_seg_head.glb`) would create 231 files in one directory. Directories per body type
**Bodies are directories, not flat files.** Each body type produces 18 segment GLBs (14 limb/body
segments + 2 torso variants + 2 face detail). Putting them in flat `bodies/` with prefixes
(`thin_m_seg_head.glb`) would create 198 files in one directory. Directories per body type
keep segment files scannable and let the compositor construct paths programmatically:
`bodies/{body_type}/seg_{segment}.glb`.
@@ -292,7 +292,7 @@ underscore-separated, no abbreviations beyond `m`/`f`. The GDScript and Rust enu
`ThinM`, `ThinF`, `AverageM`, `AverageF`, `MuscularM`, `MuscularF`, `TeenM`, `TeenF`,
`HeavyM`, `HeavyF`, `Child`.
### Body Segments (the 17 base + 2 swappable torso variants + 2 face detail)
### Body Segments (14 limb/body segments + 2 torso variants + 2 face detail = 18 total)
From the spike validation and D-160. Fine-grained segmentation is required for per-limb
addressability: amputation (hide limb, show stump cap), prosthetics (replace limb with
@@ -342,7 +342,7 @@ boundary with the lower leg segment above ensures smooth deformation at the join
The `seg_` prefix is load-bearing: it distinguishes segment GLBs from the `armature.glb` in
the same directory and makes glob patterns simple (`seg_*.glb`).
Total per body type: 17 base segments + 2 swappable torso variants + 2 face detail = **21 GLB files**.
Total per body type: 14 limb/body segments + 2 torso variants (full and upper) + 2 face detail = **18 GLB files**.
### Clothing Items
@@ -472,7 +472,7 @@ no branching.
| Animation libraries | **Shared** | 2+ GLBs | UAL1 (core) + UAL2 (extended + female mannequin); animations work on all body types via shared skeleton |
| Shaders (toon, toon_masked, outline) | **Shared** | 3 files | One copy in `characters/shaders/` |
| Skin tone textures | **Shared** | 9 PNGs | Toon shader tints these -- same textures for all body types |
| Body segments | **Per body type** | 21 GLBs x 11 types = 231 | Each body type has its own segments (incl. swappable torso variants) |
| Body segments | **Per body type** | 18 GLBs x 11 types = 198 | Each body type has its own segments (incl. swappable torso variants) |
| Clothing items | **Per body type** | 11 GLBs + 1 reference + 1 mask + 1 coverage per item | Authored once on reference, batch-fitted to 11 |
| Recolor masks (clothing) | **Shared per item** | 1 PNG per item | UV layout preserved through Surface Deform |
| Coverage metadata | **Shared per item** | 1 JSON per item | Declares which segments to hide and torso variant selection |
@@ -509,7 +509,7 @@ Blender: fork/modify body shape (for thin, heavy, child -- 6 of 11 types)
|-- OR: use as-is (average, muscular, teen -- 5 of 11 types)
|
v
Blender: fine-grained segmentation (17 base + 2 swappable torso + 2 face detail = 21 GLBs)
Blender: fine-grained segmentation (14 limb/body segments + 2 torso variants + 2 face detail = 18 GLBs)
|
v
Export GLB (per segment / per clothing variant / per accessory)
@@ -666,7 +666,7 @@ and torso variant selection.
|---|---|---|---|---|
| Skeleton | 1 | 1 | 1 | ~10 KB |
| Animations | 3 (UAL1 + UAL2 + future) | 1 | 3 | ~4 MB |
| Body segments | 11 types | 21 segs | 231 | ~2.2 MB |
| Body segments | 11 types | 18 segs | 198 | ~2.2 MB |
| Skin tones | 1 set | 9 | 9 | ~500 KB |
| Head templates | 50 (v0.2) | 2 (GLB+mask) | 100 | ~5 MB |
| Hair styles | 18 (v0.2, Source tier) | 2 (GLB+mask) | 36 | ~1.8 MB |