43 lines
1.9 KiB
Markdown
43 lines
1.9 KiB
Markdown
# ADR-0016: 24,000-triangle character budget
|
|
|
|
- **Status:** Accepted
|
|
- **Date:** 2026-11-05
|
|
|
|
## Context
|
|
|
|
ADR-0015 raised the character contract to 16,000 triangles / 16,000 glTF
|
|
vertices for the MakeHuman head, hands and crowd variety. The local MPFB
|
|
full-body prototype now uses that head, project hands and shoes, and a fused
|
|
neck: it measures 19,747 triangles before any clothing variation. The 16,000 cap
|
|
leaves no room for the firefighter and hoodie gear, and it forces the body and
|
|
neck into a low decimation that produces visible facets.
|
|
|
|
## Decision
|
|
|
|
Raise the character contract to **24,000 triangles / 24,000 glTF vertices** per
|
|
character (`CHAR_MAX_TRIS`/`CHAR_MAX_VERTS`, `npc_pipeline.MAX_TRIANGLES`/
|
|
`MAX_VERTICES`, and the `adapt` defaults). The 13 core bones, five tint slots,
|
|
front orientation, grounding and single `npc_base` skinned mesh are unchanged.
|
|
Gear stays at 1,500 triangles and props at 4,000.
|
|
|
|
## Consequences
|
|
|
|
- The MPFB body, accepted head and neck fit with headroom for the 12 clothing
|
|
variants and future jacket/hoodie detail.
|
|
- The 24-NPC and Web frame-time budgets must be re-measured before shipping any
|
|
variant built at the new cap; the extra geometry is not free.
|
|
- The procedural generator and the low-poly `npc_base` fallback remain valid;
|
|
they are not required to use the new headroom.
|
|
- MPFB stays a local development tool. Production must bake a committed source
|
|
GLB; CI and the build must not depend on MPFB.
|
|
- Historical reviews and measurements that state 16,000 remain accurate for the
|
|
date they were recorded; current contract documents state 24,000.
|
|
|
|
## Alternatives
|
|
|
|
- **Keep 16,000 and decimate the MPFB body further:** rejected because the neck
|
|
and shoulder already show facets and the clothing variants would exceed the
|
|
cap.
|
|
- **Separate caps for the MPFB prototype and the shipped characters:** rejected
|
|
because it creates a second contract and makes the rollout ambiguous.
|