Raise the character mesh budget to 8000
Full build / Import + headless tests (push) Successful in 33s
Full build / Full desktop build + optional release (push) Skipped

This commit is contained in:
zwitschi committed 2026-11-02 19:25:41 +01:00
1 parent cd5e0e0ff7
commit 7dc3d3c873
8 files changed
+50 -41

No files matched your search

+16 -15
View File
@@ -6,14 +6,12 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
- The visual-alignment path/loader/panel/HUD work and the realism lighting pass are complete and
recorded in `DONE.md`; remaining visual items are the realism follow-ups in `TODO.md`.
- **Character vertex cap (2026-11-02):** the current **5,000 glTF vertices per character** limit is
now the binding realism constraint, not a design rule. `npc_firefighter` is at **4,948** after
the hand pass, leaving no room for better eyelids, nose/lip/ear shaping, hand grips or clothing
seams. The cap needs to be raised for the next realism pass; proposed **6,000 vertices** (and
revisit the 6,000-triangle cap in the same change). Update `CHAR_MAX_VERTS`/`CHAR_MAX_TRIS`, the
contract tests, `blender_assets.py audit`, `docs/npc-visual-review.md`, and re-run the 24-NPC and
Web/Compatibility budgets before accepting the new limit. Do not treat 5,000 as a hard product
constraint.
- **Character mesh cap (2026-11-02):** the eight library variants now use **8,000 triangles /
8,000 glTF vertices** per character (`CHAR_MAX_TRIS`/`CHAR_MAX_VERTS` in
`tools/blender_assets.py`), up from 6,000/5,000. The frozen `npc_base` fallback keeps its
6,000/4,000 contract. This headroom is specifically for the remaining face, hand-grip and
clothing realism work; re-run the 24-NPC and Web/Compatibility budgets as geometry lands. Do not
add detail without measuring, and do not silently lower the cap back to 5,000.
- `PLAN.md` is a compact product/design document, not an implementation log. Historical control
and v0.3.0 specs were folded into its Presentation and Controls section; put new step-by-step
work in `TODO.md`, not the plan.
@@ -101,9 +99,9 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
- **NPC hand pass (0.9.4, 2026-11-02):** palm radius 0.046 at z .742, scale (.80,.62,.88);
fingers are `tube` paths from z .758 to .681–.694 with tip spheres, thumb is a bent tube. The
optional hand capture is `capture_npc_baseline.gd -- --view=hand` (8 frames, baseline stays 48).
`npc_firefighter` is now at 4,948 verts (52 below the current 5,000 cap); the cap is provisional
and needs raising for further realism (see the character-vertex-cap decision above). Grip
offsets remain open.
`npc_firefighter` is at 4,948 verts; the library cap is now 8,000 (see the character-mesh-cap
decision above), so the remaining face/grip/clothing detail can use real headroom. Grip offsets
remain open.
- **UI flow smoke (2026-11-02):** `smoke_ui_flows.gd` boots the real scene and
exercises inspection allow/deny, normal vs emergency radio, Help filtering,
wand allow/deny and review return-to-menu. Keep this smoke in the 0.9.6
@@ -362,7 +360,8 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
ridge, cheekbones, nose bridge/tip, ears with lobes and split upper/lower lips; the new
`eye_white` material is a *fixed-colour* slot, so `_apply_outfit_materials()` leaves it white.
`_hands_and_shoes()` has four fingers plus a thumb and `_clothing()` adds `Cuff` tori.
Budget work: `CHAR_MAX_VERTS` 5000 (see the library note), body decimation 0.26, upper lids are
Budget work at the time: `CHAR_MAX_VERTS` 5000 (the library cap is now 8000; see the
character-mesh-cap decision), body decimation 0.26, upper lids are
boxes rather than spheres, and knuckle spheres/nostrils were cut to stay inside it.
**Orientation debugging:** to check a GLB's front axis, compare the mean Z of the `eye_white`
surface (face) and of the `rubber` sole verts (toes) — all 8 avatars are +Z, so any
@@ -373,11 +372,13 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
truth), sources in `assets/models/blender_src/` (`.gdignore`d), and review sheets
`docs/blender_previews/sheet_*.jpg` (per-asset PNG renders are gitignored). 8 characters, 18
gear, 20 props; notes in `docs/blender-assets.md`. Characters are drop-in for `npc_base`
(same mesh node name, bones at the same rest positions, five tint slots) and stay under the
6000/4000 budget only because of body decimation (0.26) + `smart_project` at 80°: glTF vertex
(same mesh node name, bones at the same rest positions, five tint slots); the `npc_base`
fallback stayed under its frozen 6000/4000 budget because of body decimation (0.26) +
`smart_project` at 80°: glTF vertex
count includes UV-seam splits, so extra beveled detail quickly breaks the limit. The 2026-11-01
face/hand pass raised `CHAR_MAX_VERTS` to 5000 (tris 3,974–5,026) after measuring 16 avatars at
~6.9 ms of a 50 ms frame; `npc_pipeline.MAX_VERTICES`/`MAX_TRIANGLES` (base mesh) are unchanged.
~6.9 ms of a 50 ms frame; on 2026-11-02 the library cap became 8000/8000 while
`npc_pipeline.MAX_VERTICES`/`MAX_TRIANGLES` (base mesh) stayed frozen at 4000/6000.
**Gotchas:** `bisect_plane` and thin bevels leave zero-area triangles (Godot warns "non-finite
normal in LOD generation"); `_clean()` + a weld after bisect fix it, and the audit rejects them.
Fixed-colour detail materials carry a 4×4 texture because `_apply_outfit_materials()` sets