Record NPC sourcing decision and crowd prototypes
This commit is contained in:
1 parent
bfe3c5a701
commit
fef3af44c0
10 files changed
+269
-90
No files matched your search
+19
@@ -21,6 +21,25 @@ using Blender. The `.blend` working sources are developer artifacts and are not
|
|||||||
shipped. The exported `.glb` files and baked AO maps are project assets; they do
|
shipped. The exported `.glb` files and baked AO maps are project assets; they do
|
||||||
not embed third-party models or purchased asset packs.
|
not embed third-party models or purchased asset packs.
|
||||||
|
|
||||||
|
### Development-only research previews
|
||||||
|
|
||||||
|
Two review sheets under `docs/blender_previews/` compare source candidates for
|
||||||
|
the post-0.10.0 NPC variety work. They are development documentation and are not
|
||||||
|
bundled with the game or its release packages. The underlying source models are
|
||||||
|
kept outside version control.
|
||||||
|
|
||||||
|
- [`sheet_npc_sources_research.jpg`](docs/blender_previews/sheet_npc_sources_research.jpg)
|
||||||
|
includes renders of **Quaternius Ultimate Modular Characters** (CC0 1.0,
|
||||||
|
<https://quaternius.com/>), **Kenney Blocky Characters 2.0** (CC0 1.0,
|
||||||
|
<https://kenney.nl/assets/blocky-characters>), and **CesiumMan** and
|
||||||
|
**RiggedFigure** (CC BY 4.0, © 2017 Cesium,
|
||||||
|
<https://github.com/KhronosGroup/glTF-Sample-Assets>).
|
||||||
|
- [`sheet_npc_crowd_prototypes.jpg`](docs/blender_previews/sheet_npc_crowd_prototypes.jpg)
|
||||||
|
contains renders of project-owned generator prototypes.
|
||||||
|
|
||||||
|
The CC-BY preview images are included only as development evidence. Any future
|
||||||
|
shipped derivative of CesiumMan or RiggedFigure must keep the attribution above.
|
||||||
|
|
||||||
The venue geometry is authored procedurally in `src/game/world_builder.gd` as a
|
The venue geometry is authored procedurally in `src/game/world_builder.gd` as a
|
||||||
stylized reconstruction. The Joke Shop is a fictional stand-in for the real
|
stylized reconstruction. The Joke Shop is a fictional stand-in for the real
|
||||||
Sunset Strip block; the game does not claim endorsement by, or an exact replica
|
Sunset Strip block; the game does not claim endorsement by, or an exact replica
|
||||||
|
|||||||
@@ -4,16 +4,22 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
|
|||||||
|
|
||||||
## Decisions
|
## Decisions
|
||||||
|
|
||||||
- **NPC model sourcing research (2026-11-03):** `docs/npc-model-sourcing.md` evaluates
|
- **NPC model variety decision (2026-11-03, ADR-0015):** CC0 is acceptable for shipped
|
||||||
Quaternius Ultimate Modular (CC0), Kenney Blocky Characters (CC0), Khronos
|
assets; CC-BY only with attribution in `CREDITS.md`; no service assets with redistribution
|
||||||
CesiumMan/RiggedFigure (CC-BY 4.0) and the MakeHuman base mesh (CC0). No download is a
|
restrictions. The **procedural generator is the primary path**. Four crowd-variety specs were
|
||||||
drop-in: every source lacks the `npc_base` node, the 13 contract bones and the five tint
|
prototyped with the existing builder (`npc_crowd_a` bun/slim/sunglasses, `npc_crowd_b`
|
||||||
slots; Quaternius additionally exceeds the vertex budget (10.5k–13k imported) and uses a
|
bald/broad/beard/shoulder bag, `npc_crowd_c` coat/umbrella, `npc_crowd_d` hood/cup); all audit
|
||||||
62-bone T-pose rig, CesiumMan/RiggedFigure are short technical references, and the
|
clean at 4,550–5,258 tris / 4,356–5,086 verts. Prototype assets stay in
|
||||||
MakeHuman base is ~19k verts with no rig. Downloaded files stay under
|
`tmp/npc-research/generator_proto/`; do not add them to the 0.10.0 release candidate.
|
||||||
`tmp/npc-research/` (gitignored), with SHA-256 provenance in the doc. The direction is
|
**Quaternius is a reference, not a shipped base:** welding brings `Casual_Hoodie` from 12,518
|
||||||
pending owner review; default if unreviewed is procedural expansion. Do not commit or
|
to 3,199 verts and a 0.75 decimate to 2,423 verts / 4,654 tris, and its Idle/Walk clips read
|
||||||
ship an external model before the licence/ADR decision.
|
well, but the T-pose 62-bone realistic rig/proportions do not match the arm-down 13-bone
|
||||||
|
contract. A contract rebuild is a no-go without a body proportion warp; a second
|
||||||
|
rig/animation path needs its own ADR. **MakeHuman is deferred** to a separate local pipeline:
|
||||||
|
the CC0 base is 19,158 verts / 36,972 tris and decimates to 3,780 / 6,468 at 0.35, but needs
|
||||||
|
retopology, a custom rig and project clothing. Research previews are committed under
|
||||||
|
`docs/blender_previews/sheet_npc_{sources_research,crowd_prototypes}.jpg`; the CC-BY entries
|
||||||
|
(CesiumMan/RiggedFigure, © Cesium) are attributed in `CREDITS.md` and are development-only.
|
||||||
|
|
||||||
- **0.10.0 balance protocol:** `docs/balance-acceptance.md` defines targets and
|
- **0.10.0 balance protocol:** `docs/balance-acceptance.md` defines targets and
|
||||||
denominator/cohort rules for the 36 venue/difficulty/phase cells, seeds 1–100,
|
denominator/cohort rules for the 36 venue/difficulty/phase cells, seeds 1–100,
|
||||||
|
|||||||
@@ -198,9 +198,11 @@ verify every distribution path. This is the next minor release after the 0.9.x p
|
|||||||
|
|
||||||
## Milestone 0.11.0 — NPC model variety
|
## Milestone 0.11.0 — NPC model variety
|
||||||
|
|
||||||
Goal: break the eight-character clone effect with a reviewed, licence-cleared set of new NPC
|
Goal: break the eight-character clone effect with four licence-cleared crowd-variety looks while
|
||||||
looks while keeping the frozen `npc_base` bone, tint-slot and gear-attach contract. Start only
|
keeping the frozen `npc_base` bone, tint-slot and gear-attach contract. The procedural generator is
|
||||||
after the 0.10.0 release candidate is published; this milestone must not delay the release.
|
the primary path; Quaternius is a reviewed reference and MakeHuman is deferred to a separate local
|
||||||
|
development pipeline. Start only after the 0.10.0 release candidate is published; this milestone
|
||||||
|
must not delay the release.
|
||||||
|
|
||||||
### 0.11.1 Source review and decision
|
### 0.11.1 Source review and decision
|
||||||
|
|
||||||
@@ -209,39 +211,53 @@ after the 0.10.0 release candidate is published; this milestone must not delay t
|
|||||||
CesiumMan/RiggedFigure CC-BY and the MakeHuman CC0 base mesh; none is a drop-in.
|
CesiumMan/RiggedFigure CC-BY and the MakeHuman CC0 base mesh; none is a drop-in.
|
||||||
Results, local preview sheet and SHA-256 provenance are in
|
Results, local preview sheet and SHA-256 provenance are in
|
||||||
`docs/npc-model-sourcing.md`.)
|
`docs/npc-model-sourcing.md`.)
|
||||||
- [ ] Review the sourcing research with the project owner and choose Option A (procedural),
|
- [x] Review the sourcing research with the project owner and choose Option A (procedural),
|
||||||
Option B (Quaternius CC0 intake) or Option C (MakeHuman/MPFB body pipeline); record the
|
Option B (Quaternius CC0 intake) or Option C (MakeHuman/MPFB body pipeline); record the
|
||||||
decision in an ADR and in `MEMORY.md`.
|
decision in an ADR and in `MEMORY.md`. (2026-11-03: extend the procedural generator as the
|
||||||
- [ ] Add a source licence allow-list and provenance rule: CC0 preferred, CC-BY only with
|
primary path, keep Quaternius as a reviewed prototype/reference, defer MakeHuman to a
|
||||||
|
separate local pipeline. Recorded in ADR-0015 and `MEMORY.md`.)
|
||||||
|
- [x] Add a source licence allow-list and provenance rule: CC0 preferred, CC-BY only with
|
||||||
attribution in `CREDITS.md`, and no service assets whose terms restrict redistribution.
|
attribution in `CREDITS.md`, and no service assets whose terms restrict redistribution.
|
||||||
- [ ] Decide whether the external preview sheet stays local under `tmp/` or is committed with
|
(ADR-0015; the CC-BY research previews are attributed in `CREDITS.md`.)
|
||||||
the required CC-BY attribution.
|
- [x] Decide whether the external preview sheet stays local under `tmp/` or is committed with
|
||||||
|
the required CC-BY attribution. (Committed as
|
||||||
|
`docs/blender_previews/sheet_npc_sources_research.jpg` with Cesium CC-BY attribution;
|
||||||
|
the project-owned crowd prototype sheet is also committed.)
|
||||||
|
|
||||||
### 0.11.2 Intake and validation
|
### 0.11.2 Intake and validation
|
||||||
|
|
||||||
- [ ] Add a Blender `inspect` path that imports a GLB, applies node transforms, reports
|
- [ ] Add a Blender `inspect` path that imports a GLB, applies node transforms, reports
|
||||||
tris/verts, bounds, bones, materials, UVs and skinning, and lists contract failures.
|
tris/verts, bounds, bones, materials, UVs and skinning, and lists contract failures.
|
||||||
- [ ] Add an `adapt` path that scales/grounds the mesh, welds seams, decimates to the
|
- [ ] Add an `adapt` path for future external assets: scale/ground, weld seams, decimate, map the
|
||||||
triangle/vertex budget, maps materials into the five tint slots, rebuilds the contract
|
five tint slots, and either rebuild the contract armature or record an explicit second-rig
|
||||||
armature, transfers weights and writes the `npc_base` node name.
|
contract. The Quaternius prototype showed that a contract rebuild needs a proportion warp,
|
||||||
|
so this is not on the 0.11.0 critical path.
|
||||||
- [ ] Keep `tools/blender_assets.py audit` as the single final gate; add a regression test for the
|
- [ ] Keep `tools/blender_assets.py audit` as the single final gate; add a regression test for the
|
||||||
intake report/adaptation using a deterministic synthetic or licence-cleared fixture.
|
intake report/adaptation using a deterministic synthetic or licence-cleared fixture.
|
||||||
- [ ] Document the adapter commands and the go/no-go checks in `docs/asset-tooling.md`.
|
- [ ] Document the adapter commands and the go/no-go checks in `docs/asset-tooling.md`.
|
||||||
|
|
||||||
### 0.11.3 One-character prototype
|
### 0.11.3 One-character prototype
|
||||||
|
|
||||||
- [ ] Adapt one Quaternius CC0 variant and capture front, three-quarter, profile, back,
|
- [x] Prototype one Quaternius CC0 variant: weld/decimate to budget and capture Idle/Walk
|
||||||
full-body and crowd views plus a walk cycle.
|
renders. (12,518 imported verts -> 3,199 after weld -> 2,423 / 4,654 tris after a 0.75
|
||||||
- [ ] Measure the prototype against the `npc_casual` controls: silhouette, face style, hands,
|
decimate; Idle/Walk quality is good. Preview in
|
||||||
gear fit, rest pose and walk pose.
|
`docs/blender_previews/sheet_npc_sources_research.jpg`.)
|
||||||
- [ ] Make a go/no-go decision on Option B; if no-go, remove the prototype from the pipeline and
|
- [x] Measure the prototype against the `npc_casual` controls: silhouette, rest pose, body
|
||||||
continue with Option A.
|
proportions and gear fit. (No-go for a contract rebuild: T-pose 62-bone realistic rig,
|
||||||
|
~0.96 m hip, ~1.68 m arm span and ~0.153 m shoulder joint do not match the arm-down
|
||||||
|
13-bone contract. Keep as reference; a second rig/animation path needs its own ADR.)
|
||||||
|
- [x] Make a go/no-go decision on Option B. (No-go for 0.11.0; proceed with the procedural
|
||||||
|
generator and keep Quaternius as a visual/style reference.)
|
||||||
|
|
||||||
### 0.11.4 Roster and runtime
|
### 0.11.4 Roster and runtime
|
||||||
|
|
||||||
- [ ] Approve four new looks (age/build/hair/outfit variation across everyday, workwear and
|
- [x] Approve four crowd-variety looks (build, head silhouette, hair/beard, outer layer and
|
||||||
responder families; no clothing that labels the NPC's behaviour).
|
accessory; no clothing that labels the NPC's behaviour). (`npc_crowd_a` bun/slim/sunglasses,
|
||||||
- [ ] Build or adapt the approved variants and add them to the manifest with roles and tint data.
|
`npc_crowd_b` bald/broad/beard/shoulder bag, `npc_crowd_c` coat/umbrella, `npc_crowd_d`
|
||||||
|
hood/cup; prototype sheet committed.)
|
||||||
|
- [ ] Add the four approved specs to `CHARACTERS`, build and commit their GLBs/AO maps, and
|
||||||
|
update the manifest with roles and tint data. (Prototype assets are local under `tmp/`;
|
||||||
|
do not add them to the 0.10.0 release candidate.)
|
||||||
- [ ] Replace the fixed `character_model_for()` mapping with deterministic per-role pools and add
|
- [ ] Replace the fixed `character_model_for()` mapping with deterministic per-role pools and add
|
||||||
tests for repeatability and duplicate avoidance.
|
tests for repeatability and duplicate avoidance.
|
||||||
- [ ] Rebuild and verify gear fit for every new variant (`blender_assets.py fit` plus the runtime
|
- [ ] Rebuild and verify gear fit for every new variant (`blender_assets.py fit` plus the runtime
|
||||||
@@ -256,6 +272,16 @@ after the 0.10.0 release candidate is published; this milestone must not delay t
|
|||||||
- [ ] Exit: a reviewed 12-character library passes contract audit, portrait/gear acceptance,
|
- [ ] Exit: a reviewed 12-character library passes contract audit, portrait/gear acceptance,
|
||||||
the 24-NPC budget and licence/provenance review without changing the runtime contract.
|
the 24-NPC budget and licence/provenance review without changing the runtime contract.
|
||||||
|
|
||||||
|
### 0.11.6 Deferred MakeHuman local pipeline
|
||||||
|
|
||||||
|
- [x] Evaluate the MakeHuman CC0 base mesh for a later separate local development pipeline.
|
||||||
|
(19,158 verts / 36,972 tris; scaled to 1.82 m; decimate 0.35 -> 3,780 verts / 6,468 tris;
|
||||||
|
UVs present, no normals/material groups/rig. Feasible only with retopology, a custom rig and
|
||||||
|
project-owned clothing; keep out of CI/build.)
|
||||||
|
- [ ] Decide whether body-shape diversity still matters after the 12-character library lands; if
|
||||||
|
yes, prototype the local MPFB/MakeHuman pipeline outside the repo and commit only the final
|
||||||
|
CC0-derived assets with provenance.
|
||||||
|
|
||||||
## Future 0.x / non-blocking candidates
|
## Future 0.x / non-blocking candidates
|
||||||
|
|
||||||
- [ ] Live 3D body-camera replay.
|
- [ ] Live 3D body-camera replay.
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# ADR-0015: NPC model variety sourcing
|
||||||
|
|
||||||
|
- **Status:** Accepted (post-0.10.0 planning)
|
||||||
|
- **Date:** 2026-11-03
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
The library has eight skinned characters, and role/seed selection reuses them
|
||||||
|
across the three venues. Crowds therefore repeat the same faces, builds and
|
||||||
|
outfits. The existing contract is strict: `npc_base` mesh node, 13 named bones at
|
||||||
|
fixed rest positions, five tint slots, front on Blender −Y and an 8,000
|
||||||
|
triangle/vertex budget.
|
||||||
|
|
||||||
|
A review compared free/open-source sources against that contract. Quaternius
|
||||||
|
Ultimate Modular (CC0), Kenney Blocky Characters (CC0), Khronos CesiumMan and
|
||||||
|
RiggedFigure (CC BY 4.0) and the MakeHuman base mesh (CC0) were imported and
|
||||||
|
measured. None was a drop-in; the full results are in
|
||||||
|
[`docs/npc-model-sourcing.md`](../npc-model-sourcing.md).
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
1. **Ship only CC0, or CC BY with recorded attribution.** No service asset whose
|
||||||
|
terms restrict redistribution may be used.
|
||||||
|
2. **Extend the project-owned procedural generator as the primary path** for
|
||||||
|
shipped NPC variety. The first target is four crowd-variety looks, bringing
|
||||||
|
the library to twelve characters.
|
||||||
|
3. **Keep Quaternius as a reviewed reference/prototype, not a shipped base.** A
|
||||||
|
contract retarget is a no-go because the source is a T-pose 62-bone realistic
|
||||||
|
rig with substantially different proportions from the arm-down 13-bone
|
||||||
|
contract. A future external-rig path would need its own ADR covering its
|
||||||
|
skeleton, animation source and per-model gear offsets.
|
||||||
|
4. **MakeHuman is deferred to a separate local development pipeline.** Its CC0
|
||||||
|
base mesh can be decimated into budget, but it needs retopology, a custom rig
|
||||||
|
and project-owned clothing before it is usable. It must not become a CI or
|
||||||
|
build dependency.
|
||||||
|
5. **Commit research previews with attribution.** CC-BY preview images are
|
||||||
|
development-only and are not bundled with the game or its release packages.
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
### Positive
|
||||||
|
|
||||||
|
- The shipped library keeps one art direction, one skeleton and one audit gate.
|
||||||
|
- Crowd variety lands without a new runtime dependency or a second animation
|
||||||
|
system.
|
||||||
|
- The licence position is simple: project-owned assets plus explicit CC-BY
|
||||||
|
attribution where a preview or future asset requires it.
|
||||||
|
- The Quaternius evaluation removes a tempting but high-risk retarget from the
|
||||||
|
critical path.
|
||||||
|
|
||||||
|
### Negative
|
||||||
|
|
||||||
|
- Procedural variation is still limited by the existing face and clothing
|
||||||
|
vocabulary; four variants do not provide full age/body diversity.
|
||||||
|
- Quaternius' animation set remains unused unless a second rig path is approved.
|
||||||
|
- MakeHuman body-shape diversity is postponed.
|
||||||
|
- External previews add a small documentation footprint that must stay out of
|
||||||
|
release packages.
|
||||||
|
|
||||||
|
## Alternatives considered
|
||||||
|
|
||||||
|
- **Retarget Quaternius onto the `npc_base` contract.** Rejected for now:
|
||||||
|
welding brings the geometry inside budget, but the rest pose and body
|
||||||
|
proportions differ enough that a contract rebuild would either distort the
|
||||||
|
model or require a full proportion warp.
|
||||||
|
- **Use Quaternius' own rig and animations directly.** Deferred: attractive
|
||||||
|
animation quality, but it adds a second skeleton/animation path and per-model
|
||||||
|
gear offsets to `NpcAvatar`.
|
||||||
|
- **Use MakeHuman as the primary body source.** Rejected for this milestone: high
|
||||||
|
polygon count, no rig in the base mesh and a separate authoring dependency.
|
||||||
|
- **Use Mixamo or Ready Player Me.** Rejected: service terms are not a simple
|
||||||
|
free/open-source redistribution basis for shipped meshes.
|
||||||
@@ -18,3 +18,4 @@ Each ADR records the context, decision, consequences and alternatives for a dura
|
|||||||
- [0012-surface-materials-and-generated-props](0012-surface-materials-and-generated-props.md)
|
- [0012-surface-materials-and-generated-props](0012-surface-materials-and-generated-props.md)
|
||||||
- [0013-blender-authored-npc-characters](0013-blender-authored-npc-characters.md)
|
- [0013-blender-authored-npc-characters](0013-blender-authored-npc-characters.md)
|
||||||
- [0014-runtime-image-root](0014-runtime-image-root.md)
|
- [0014-runtime-image-root](0014-runtime-image-root.md)
|
||||||
|
- [0015-npc-model-variety-sourcing](0015-npc-model-variety-sourcing.md)
|
||||||
@@ -131,7 +131,8 @@ Contract and integration notes: [`blender-assets.md`](blender-assets.md).
|
|||||||
|
|
||||||
Sourcing and expansion research (no external model is shipped yet):
|
Sourcing and expansion research (no external model is shipped yet):
|
||||||
[`npc-model-sourcing.md`](npc-model-sourcing.md) compares Quaternius, Kenney, Khronos and
|
[`npc-model-sourcing.md`](npc-model-sourcing.md) compares Quaternius, Kenney, Khronos and
|
||||||
MakeHuman sources against the character contract and records the pending 0.11.0 decision.
|
MakeHuman sources against the character contract and records the 2026-11-03 direction
|
||||||
|
(procedural generator first, Quaternius reference, MakeHuman deferred).
|
||||||
|
|
||||||
| Characters | Props |
|
| Characters | Props |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ Committed contact sheets and local Blender renders for the character, gear and p
|
|||||||
| <img src="security_podium.png" width="280" alt="security_podium.png"> | [`security_podium.png`](security_podium.png) |
|
| <img src="security_podium.png" width="280" alt="security_podium.png"> | [`security_podium.png`](security_podium.png) |
|
||||||
| <img src="sedan.png" width="280" alt="sedan.png"> | [`sedan.png`](sedan.png) |
|
| <img src="sedan.png" width="280" alt="sedan.png"> | [`sedan.png`](sedan.png) |
|
||||||
| <img src="sheet_npc.jpg" width="280" alt="sheet_npc.jpg"> | [`sheet_npc.jpg`](sheet_npc.jpg) |
|
| <img src="sheet_npc.jpg" width="280" alt="sheet_npc.jpg"> | [`sheet_npc.jpg`](sheet_npc.jpg) |
|
||||||
|
| <img src="sheet_npc_sources_research.jpg" width="280" alt="sheet_npc_sources_research.jpg"> | [`sheet_npc_sources_research.jpg`](sheet_npc_sources_research.jpg) |
|
||||||
|
| <img src="sheet_npc_crowd_prototypes.jpg" width="280" alt="sheet_npc_crowd_prototypes.jpg"> | [`sheet_npc_crowd_prototypes.jpg`](sheet_npc_crowd_prototypes.jpg) |
|
||||||
| <img src="sheet_npc_baseline.jpg" width="280" alt="sheet_npc_baseline.jpg"> | [`sheet_npc_baseline.jpg`](sheet_npc_baseline.jpg) |
|
| <img src="sheet_npc_baseline.jpg" width="280" alt="sheet_npc_baseline.jpg"> | [`sheet_npc_baseline.jpg`](sheet_npc_baseline.jpg) |
|
||||||
| <img src="sheet_npc_baseline_compare-p1.jpg" width="280" alt="sheet_npc_baseline_compare-p1.jpg"> | [`sheet_npc_baseline_compare-p1.jpg`](sheet_npc_baseline_compare-p1.jpg) |
|
| <img src="sheet_npc_baseline_compare-p1.jpg" width="280" alt="sheet_npc_baseline_compare-p1.jpg"> | [`sheet_npc_baseline_compare-p1.jpg`](sheet_npc_baseline_compare-p1.jpg) |
|
||||||
| <img src="sheet_npc_baseline_compare-body.jpg" width="280" alt="sheet_npc_baseline_compare-body.jpg"> | [`sheet_npc_baseline_compare-body.jpg`](sheet_npc_baseline_compare-body.jpg) |
|
| <img src="sheet_npc_baseline_compare-body.jpg" width="280" alt="sheet_npc_baseline_compare-body.jpg"> | [`sheet_npc_baseline_compare-body.jpg`](sheet_npc_baseline_compare-body.jpg) |
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
+111
-59
@@ -1,8 +1,12 @@
|
|||||||
# NPC model sourcing and expansion plan
|
# NPC model sourcing and expansion plan
|
||||||
|
|
||||||
Status: **research complete, direction not chosen (2026-11-03).** No downloaded
|
Status: **direction chosen 2026-11-03.** The procedural generator is the primary
|
||||||
model is committed to the game or included in a release. The local evaluation
|
path, the Quaternius CC0 pack is a reviewed reference/prototype, and MakeHuman is
|
||||||
files live under `tmp/npc-research/` (gitignored).
|
deferred to a separate local development pipeline. No downloaded source model is
|
||||||
|
committed to the game or included in a release; the committed research preview
|
||||||
|
sheets carry the required attribution. Local evaluation files live under
|
||||||
|
`tmp/npc-research/` (gitignored). The decision is recorded in
|
||||||
|
[ADR-0015](adr/0015-npc-model-variety-sourcing.md).
|
||||||
|
|
||||||
This page records the free/open-source character sources that were reviewed, how
|
This page records the free/open-source character sources that were reviewed, how
|
||||||
they behave when imported into the existing Blender tooling, and the options for
|
they behave when imported into the existing Blender tooling, and the options for
|
||||||
@@ -123,21 +127,80 @@ This is the strongest answer to "everyone has the same body", but requires an
|
|||||||
offline authoring step, decimation/retopology and a custom rig/weight step. It
|
offline authoring step, decimation/retopology and a custom rig/weight step. It
|
||||||
should be treated as a later pipeline project, not a quick content drop.
|
should be treated as a later pipeline project, not a quick content drop.
|
||||||
|
|
||||||
## Recommended direction
|
## Decision and prototype outcome
|
||||||
|
|
||||||
1. **Do not add raw external models.** Keep the current library and contract
|
The project owner reviewed this page on 2026-11-03. The decision is:
|
||||||
unchanged until a human has reviewed this page.
|
|
||||||
2. **Prototype Option B once** (one Quaternius character) behind a new intake
|
|
||||||
command. If the walk pose, face style and gear fit pass, use it for a small
|
|
||||||
set of silhouette donors and keep the project's faces/hands where possible.
|
|
||||||
3. **Fall back to Option A** for the remaining variants. Procedural variation
|
|
||||||
(age, build, hair, outfit colour/layers, accessory mix) is cheaper and keeps
|
|
||||||
the library coherent.
|
|
||||||
4. **Defer Option C** until the release candidate is out and there is a concrete
|
|
||||||
need for body-shape diversity that A/B cannot meet.
|
|
||||||
|
|
||||||
This is a proposal, not a decision. The review questions are at the end of the
|
1. **CC0 is acceptable** for shipped character assets. CC-BY is acceptable only
|
||||||
page.
|
with attribution in `CREDITS.md`; service assets whose terms restrict
|
||||||
|
redistribution remain excluded.
|
||||||
|
2. **Extend the procedural generator** as the primary path, starting with
|
||||||
|
crowd-variety looks.
|
||||||
|
3. **Prototype Quaternius** as a secondary source. It is not approved for
|
||||||
|
shipping yet; the contract-retarget result below is a no-go for the current
|
||||||
|
skeleton.
|
||||||
|
4. **Use crowd variety** as the first visual goal, not role-specific costumes.
|
||||||
|
5. **Evaluate MakeHuman for a later, separate local development pipeline.** It
|
||||||
|
is not part of the normal build, CI or release flow.
|
||||||
|
6. **Commit the research previews with attribution.** The CC-BY entries are
|
||||||
|
listed in `CREDITS.md` and remain development-only.
|
||||||
|
|
||||||
|
### Quaternius prototype
|
||||||
|
|
||||||
|
The prototype used `Casual_Hoodie.glb`:
|
||||||
|
|
||||||
|
- **Geometry budget is not the blocker.** Imported: 12,518 vertices / 6,206
|
||||||
|
triangles. After welding seam splits: 3,199 vertices / 6,206 triangles. After
|
||||||
|
a 0.75 decimate: 2,423 vertices / 4,654 triangles, comfortably inside the
|
||||||
|
library budget.
|
||||||
|
- **Animation quality is attractive.** The imported Idle and Walk clips read
|
||||||
|
well at game distance, and the model brings 24 animations.
|
||||||
|
- **The contract rest pose is the blocker.** The source is a T-pose 62-bone rig
|
||||||
|
with realistic proportions: upper leg starts near 0.96 m, arm span is about
|
||||||
|
1.68 m, and the shoulder joint sits near x = 0.153 m. The project contract is
|
||||||
|
an arm-down 13-bone rig with a hip near 0.62 m, a shoulder near x = 0.27 m and
|
||||||
|
a hand near z = 0.78 m. Rebuilding the contract armature around this mesh would
|
||||||
|
either distort the body substantially or require a full proportion warp.
|
||||||
|
- **Decision:** do not retarget Quaternius to the contract now. Keep it as a
|
||||||
|
silhouette/style reference and, if a second rig path is ever wanted, prototype
|
||||||
|
it as its own animation path (its own skeleton, AnimationPlayer clips and
|
||||||
|
per-model gear offsets) rather than forcing it into `npc_base`. That is a
|
||||||
|
separate architecture decision, not an asset conversion.
|
||||||
|
|
||||||
|
Preview: [`blender_previews/sheet_npc_sources_research.jpg`](blender_previews/sheet_npc_sources_research.jpg).
|
||||||
|
|
||||||
|
### Generator crowd prototype
|
||||||
|
|
||||||
|
Four proposed crowd specs were built with the existing generator in a temporary
|
||||||
|
output directory. All four audit clean and stay inside the character budget:
|
||||||
|
|
||||||
|
| Prototype | Look | Tris / verts | Gear |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| `npc_crowd_a` | slim, bun, sunglasses | 4,644 / 4,356 | sunglasses |
|
||||||
|
| `npc_crowd_b` | broad, bald, beard | 4,550 / 4,453 | shoulder bag |
|
||||||
|
| `npc_crowd_c` | average, short hair, long coat | 5,118 / 5,086 | umbrella |
|
||||||
|
| `npc_crowd_d` | slim, short hair, hood up | 5,258 / 4,907 | cup |
|
||||||
|
|
||||||
|
They vary build, head silhouette, hair/beard and outer layer while keeping the
|
||||||
|
existing face language. They are **not in the shipped catalogue**; production
|
||||||
|
integration belongs to milestone 0.11.4 after the 0.10.0 release candidate.
|
||||||
|
|
||||||
|
Preview: [`blender_previews/sheet_npc_crowd_prototypes.jpg`](blender_previews/sheet_npc_crowd_prototypes.jpg).
|
||||||
|
|
||||||
|
### MakeHuman local-pipeline evaluation
|
||||||
|
|
||||||
|
The CC0 base mesh is 19,158 vertices / 18,486 polygons (36,972 triangles after
|
||||||
|
triangulation), with 21,334 UV coordinates but no normals, material groups or
|
||||||
|
rig. Scaling it to 1.82 m and decimating to 0.35 produced 3,780 vertices / 6,468
|
||||||
|
triangles, which fits the geometry budget but is a collapse-decimation result,
|
||||||
|
not production topology.
|
||||||
|
|
||||||
|
MakeHuman is therefore **feasible only as a separate local body-shape pipeline**:
|
||||||
|
generate a small set of bodies locally with MPFB/MakeHuman, export the CC0
|
||||||
|
meshes, decimate or retopologise them, build the contract rig and add
|
||||||
|
project-owned heads, hands, clothing and gear. It must not become a CI or build
|
||||||
|
dependency, and only the final CC0-derived assets with recorded provenance may be
|
||||||
|
committed. This is deferred; it is not part of the 0.11.0 crowd-variety work.
|
||||||
|
|
||||||
## Provisional NPC roster
|
## Provisional NPC roster
|
||||||
|
|
||||||
@@ -147,37 +210,30 @@ across age, build and style, not costumes that telegraph the outcome.
|
|||||||
|
|
||||||
| Look family | Current | Proposed additions | Variation axes |
|
| Look family | Current | Proposed additions | Variation axes |
|
||||||
| --- | --- | --- | --- |
|
| --- | --- | --- | --- |
|
||||||
| Everyday | `npc_casual`, `npc_jacket`, `npc_coat`, `npc_hoodie`, `npc_dress` | older casual, denim jacket, short coat, open hoodie, second dress | age, build, height, hair, facial hair, outfit colour |
|
| Everyday | `npc_casual`, `npc_jacket`, `npc_coat`, `npc_hoodie`, `npc_dress` | `npc_crowd_a` (bun/slim), `npc_crowd_b` (bald/broad), `npc_crowd_c` (coat/umbrella), `npc_crowd_d` (hood/cup) | build, height, hair, facial hair, outer layer, accessory |
|
||||||
| Workwear | `npc_vest`, `npc_guard` | second hi-vis build, venue-security build, cleaner/vendor apron | build, height, headwear, badge/radio gear |
|
| Workwear | `npc_vest`, `npc_guard` | later: second hi-vis build, venue-security build | build, height, headwear, badge/radio gear |
|
||||||
| Responder | `npc_firefighter` | paramedic/medical responder (only if the design supports it) | turnout vs medical kit, build, helmet |
|
| Responder | `npc_firefighter` | later: paramedic/medical responder only if the design supports it | turnout vs medical kit, build, helmet |
|
||||||
| Crowd/LOD | none | Kenney blocky or a decimated library variant for distant crowds | silhouette and palette only |
|
| Crowd/LOD | none | optional Kenney blocky or a decimated library variant for distant crowds | silhouette and palette only |
|
||||||
|
|
||||||
A first target is **12 library characters** (the current eight plus four new
|
A first target is **12 library characters** (the current eight plus the four
|
||||||
looks), not twenty. That is enough to break the clone effect without doubling
|
crowd prototypes), not twenty. That is enough to break the clone effect without
|
||||||
the portrait QA matrix. The existing `character_model_for()` mapping becomes a
|
doubling the portrait QA matrix. `character_model_for()` becomes a pool per role
|
||||||
pool per role family with a deterministic seed choice; the current two-way
|
family with a deterministic seed choice; the current two-way alternation for
|
||||||
alternation for guests, trespassers and threats is the template.
|
guests, trespassers and threats is the template.
|
||||||
|
|
||||||
## Implementation plan
|
## Implementation plan
|
||||||
|
|
||||||
The actionable tasks live in `TODO.md` under milestone 0.11.0. The workstreams
|
The actionable tasks live in `TODO.md` under milestone 0.11.0. The workstreams
|
||||||
are:
|
are:
|
||||||
|
|
||||||
1. **Decision and licence gate.** Review this page, choose A/B/C, record the
|
1. **Decision and licence gate.** Complete: ADR-0015, the CC0/CC-BY rule and the
|
||||||
decision in an ADR, and add a source allow-list (CC0 preferred; CC-BY only
|
committed preview sheets.
|
||||||
with attribution in `CREDITS.md`; no service assets whose terms restrict
|
2. **Generator crowd variants.** Complete as a prototype (four specs, clean
|
||||||
redistribution).
|
audit, review sheet). Production integration is pending the 0.10.0 release.
|
||||||
2. **Intake/validator.** Add an `inspect` report and an `adapt` path. The
|
3. **Quaternius intake.** The contract-retarget prototype is a no-go. Keep the
|
||||||
validator should check bones, rest positions, node name, slots, budgets,
|
source as a reference; a second-rig/animation path would need its own ADR.
|
||||||
ground/height, UVs and skinning before and after adaptation. Keep the
|
4. **Roster build and runtime.** Add the four approved specs to `CHARACTERS`,
|
||||||
existing `audit` as the final gate rather than creating a second contract.
|
build and commit their GLBs, update the manifest, and extend the role pools.
|
||||||
3. **One-character prototype.** Adapt a single Quaternius CC0 variant; capture
|
|
||||||
front/three-quarter/profile/full-body/crowd views and a walk cycle; compare
|
|
||||||
against `npc_casual` and `sheet_npc_baseline.jpg`. Stop if the retarget does
|
|
||||||
not pass.
|
|
||||||
4. **Roster build.** Add four approved variants, update the manifest, and extend
|
|
||||||
the runtime selection pools. Rebuild gear fit and check each new variant with
|
|
||||||
the existing acceptance criteria.
|
|
||||||
5. **QA and integration.** Run the 24-NPC budget, portrait baseline, gear fit,
|
5. **QA and integration.** Run the 24-NPC budget, portrait baseline, gear fit,
|
||||||
headless suite and release build. Record provenance and any accepted limits.
|
headless suite and release build. Record provenance and any accepted limits.
|
||||||
Only then update `CHANGELOG.md` and `docs/development-status.md`.
|
Only then update `CHANGELOG.md` and `docs/development-status.md`.
|
||||||
@@ -196,33 +252,29 @@ are:
|
|||||||
- Map materials by semantic role, not by source name. A source "Purple" or
|
- Map materials by semantic role, not by source name. A source "Purple" or
|
||||||
"Worker_Vest" needs an explicit mapping to `cloth`, `pants`, `skin`, `hair` or
|
"Worker_Vest" needs an explicit mapping to `cloth`, `pants`, `skin`, `hair` or
|
||||||
`accessory`; do not rely on colour heuristics.
|
`accessory`; do not rely on colour heuristics.
|
||||||
- Rebuild the armature at the contract rest positions and transfer weights, or
|
|
||||||
prove that a renamed external rig produces the same rest and pose behaviour.
|
|
||||||
Do not add a second skeleton format to `NpcAvatar`.
|
|
||||||
- Keep the face direction unambiguous. The front is Blender −Y; verify it with
|
- Keep the face direction unambiguous. The front is Blender −Y; verify it with
|
||||||
a capture, not by guessing from the source file.
|
a capture, not by guessing from the source file.
|
||||||
|
- For any future external-rig path, do not silently add a second skeleton format
|
||||||
|
to `NpcAvatar`. Record the per-model skeleton, animation source and gear
|
||||||
|
offsets as an explicit contract.
|
||||||
|
|
||||||
## Review questions
|
## Review outcome
|
||||||
|
|
||||||
The project owner should answer these before the 0.11.0 work starts:
|
The project owner answered the review questions on 2026-11-03:
|
||||||
|
|
||||||
1. Are third-party CC0 characters acceptable in shipped game assets, or should
|
| Question | Answer |
|
||||||
the library stay entirely project-owned?
|
| --- | --- |
|
||||||
2. If yes, is the Quaternius CC0 pack acceptable as a silhouette/outfit donor
|
| Are third-party CC0 characters acceptable? | Yes. |
|
||||||
with a rebuilt project-style head and hands?
|
| Which direction? | Prototype Quaternius and extend the procedural generator. |
|
||||||
3. Which four role families would benefit most from a new look: everyday
|
| Which looks first? | Crowd variety. |
|
||||||
guests, workwear, responders, or crowd variety?
|
| Should MakeHuman be pursued? | Evaluate it for a later, separate local development pipeline. |
|
||||||
4. Is the MakeHuman/MPFB body-shape pipeline worth a later investment, or is
|
| Commit the previews? | Yes, with CC-BY attribution. |
|
||||||
procedural variation enough?
|
|
||||||
5. Should the preview sheet be committed as a review artefact (with attribution
|
|
||||||
for the CC-BY entries), or stay local under `tmp/`?
|
|
||||||
|
|
||||||
Until those answers exist, the safe default is **Option A: extend the owned
|
|
||||||
procedural generator and keep external models as references only.**
|
|
||||||
|
|
||||||
## Downloaded example provenance
|
## Downloaded example provenance
|
||||||
|
|
||||||
Files were downloaded on 2026-11-03 and kept out of version control:
|
Source models were downloaded on 2026-11-03 and kept out of version control. The two
|
||||||
|
research preview sheets are committed under `docs/blender_previews/`; the CC-BY
|
||||||
|
attribution is recorded in `CREDITS.md`.
|
||||||
|
|
||||||
| File | Source | SHA-256 |
|
| File | Source | SHA-256 |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
|
|||||||
Reference in new issue
Block a user