Compare commits
4
Commits
46f1e41874
...
1921bfae91
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1921bfae91 | ||
|
|
78485259b7 | ||
|
|
fef3af44c0 | ||
|
|
bfe3c5a701 |
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
|
||||
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
|
||||
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
|
||||
|
||||
@@ -4,6 +4,23 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
|
||||
|
||||
## Decisions
|
||||
|
||||
- **NPC model variety decision (2026-11-03, ADR-0015):** CC0 is acceptable for shipped
|
||||
assets; CC-BY only with attribution in `CREDITS.md`; no service assets with redistribution
|
||||
restrictions. The **procedural generator is the primary path**. Four crowd-variety specs were
|
||||
prototyped with the existing builder (`npc_crowd_a` bun/slim/sunglasses, `npc_crowd_b`
|
||||
bald/broad/beard/shoulder bag, `npc_crowd_c` coat/umbrella, `npc_crowd_d` hood/cup); all audit
|
||||
clean at 4,550–5,258 tris / 4,356–5,086 verts. Prototype assets stay in
|
||||
`tmp/npc-research/generator_proto/`; do not add them to the 0.10.0 release candidate.
|
||||
**Quaternius is a reference, not a shipped base:** welding brings `Casual_Hoodie` from 12,518
|
||||
to 3,199 verts and a 0.75 decimate to 2,423 verts / 4,654 tris, and its Idle/Walk clips read
|
||||
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
|
||||
denominator/cohort rules for the 36 venue/difficulty/phase cells, seeds 1–100,
|
||||
access/emergency error rates and matched calm vs emergency-first comparisons.
|
||||
|
||||
@@ -189,3 +189,4 @@ The game should feel like a tense workplace simulation with occasional crisis mo
|
||||
- A rare Bob Dobbs cameo (Easter-egg appearance; placement note in `MEMORY.md`).
|
||||
- Specific unusual NPC behaviors, such as slapping their own face, using hands as scissors, or interacting with props unexpectedly.
|
||||
- Live 3D body-camera replay; additional venues or seasonal events; real voice/dialogue audio; an image-to-mesh prop pipeline.
|
||||
- More varied NPC silhouettes (age, build, hair and outfit), using either an extended procedural character generator or a reviewed CC0/CC-BY source; the evaluation and pending decision are in `docs/npc-model-sourcing.md`.
|
||||
@@ -181,7 +181,11 @@ verify every distribution path. This is the next minor release after the 0.9.x p
|
||||
`check_screenshots.sh` and the pinned vision judge, recording model/spend/verdicts.
|
||||
- [ ] Run the manual smoke checklist on every target and attach/link the release-candidate evidence.
|
||||
- [ ] Verify the tutorial/campaign/help text at maximum font scale and with the longest strings.
|
||||
- [ ] Remove or archive stale plans/notes and confirm no contradictory version/status claims remain.
|
||||
- [x] Remove or archive stale plans/notes and confirm no contradictory version/status claims remain.
|
||||
- [x] Document the character development toolchain in `docs/architecture.md`: base vs library
|
||||
sources, tool/artifact/gate table, runtime attach/animation contracts and rebuild discipline.
|
||||
(Added §5 "Character development tooling" plus risk and ownership-map updates;
|
||||
documentation check passed.)
|
||||
|
||||
### Release-candidate QA and exit
|
||||
|
||||
@@ -196,6 +200,92 @@ verify every distribution path. This is the next minor release after the 0.9.x p
|
||||
- [ ] Exit: the release candidate is content-locked, externally played, legally reviewed,
|
||||
documented, reproducibly built, and approved as the 0.10.0 release candidate.
|
||||
|
||||
## Milestone 0.11.0 — NPC model variety
|
||||
|
||||
Goal: break the eight-character clone effect with four licence-cleared crowd-variety looks while
|
||||
keeping the frozen `npc_base` bone, tint-slot and gear-attach contract. The procedural generator is
|
||||
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
|
||||
|
||||
- [x] Research free/open-source character sources and evaluate at least three downloads against
|
||||
the existing Blender contract. (Measured Quaternius CC0, Kenney CC0, Khronos
|
||||
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
|
||||
`docs/npc-model-sourcing.md`.)
|
||||
- [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
|
||||
decision in an ADR and in `MEMORY.md`. (2026-11-03: extend the procedural generator as the
|
||||
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.
|
||||
(ADR-0015; the CC-BY research previews are attributed in `CREDITS.md`.)
|
||||
- [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
|
||||
|
||||
- [ ] 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.
|
||||
- [ ] Add an `adapt` path for future external assets: scale/ground, weld seams, decimate, map the
|
||||
five tint slots, and either rebuild the contract armature or record an explicit second-rig
|
||||
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
|
||||
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`.
|
||||
|
||||
### 0.11.3 One-character prototype
|
||||
|
||||
- [x] Prototype one Quaternius CC0 variant: weld/decimate to budget and capture Idle/Walk
|
||||
renders. (12,518 imported verts -> 3,199 after weld -> 2,423 / 4,654 tris after a 0.75
|
||||
decimate; Idle/Walk quality is good. Preview in
|
||||
`docs/blender_previews/sheet_npc_sources_research.jpg`.)
|
||||
- [x] Measure the prototype against the `npc_casual` controls: silhouette, rest pose, body
|
||||
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
|
||||
|
||||
- [x] Approve four crowd-variety looks (build, head silhouette, hair/beard, outer layer and
|
||||
accessory; no clothing that labels the NPC's behaviour). (`npc_crowd_a` bun/slim/sunglasses,
|
||||
`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
|
||||
tests for repeatability and duplicate avoidance.
|
||||
- [ ] Rebuild and verify gear fit for every new variant (`blender_assets.py fit` plus the runtime
|
||||
gear checks).
|
||||
|
||||
### 0.11.5 QA and release
|
||||
|
||||
- [ ] Run the 24-NPC budget smoke, portrait baseline, gear fit, headless suite and a release build
|
||||
with the expanded library.
|
||||
- [ ] Update `CREDITS.md`, `docs/development-status.md`, `docs/npc-visual-review.md` and
|
||||
`CHANGELOG.md`; record any accepted visual limits.
|
||||
- [ ] 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.
|
||||
|
||||
### 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
|
||||
|
||||
- [ ] Live 3D body-camera replay.
|
||||
|
||||
@@ -13,6 +13,7 @@ This folder holds the project documentation, visual references and generated QA
|
||||
- [`asset-tooling.md`](asset-tooling.md) — image/model pipelines and screenshot gates
|
||||
- [`npc-visual-review.md`](npc-visual-review.md) — NPC visual baseline, acceptance criteria and ranked gaps
|
||||
- [`npc-proportion-audit.md`](npc-proportion-audit.md) — NPC proportion ratios and stylized guide results
|
||||
- [`npc-model-sourcing.md`](npc-model-sourcing.md) — free/open-source character sources, contract evaluation and the 0.11.0 expansion plan
|
||||
- [`development-status.md`](development-status.md) — implemented features and current gaps
|
||||
- [`accessibility.md`](accessibility.md) — accessibility statement and known gaps
|
||||
- [`known-limitations.md`](known-limitations.md) — release-candidate blockers and accepted limits
|
||||
|
||||
@@ -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)
|
||||
- [0013-blender-authored-npc-characters](0013-blender-authored-npc-characters.md)
|
||||
- [0014-runtime-image-root](0014-runtime-image-root.md)
|
||||
- [0015-npc-model-variety-sourcing](0015-npc-model-variety-sourcing.md)
|
||||
@@ -127,6 +127,48 @@ Contracts that keep the pipeline replaceable:
|
||||
- UI/scene art is loaded through `UiArt` with a null/neutral fallback; composed images live in `assets/images/`, not in the docs reference tree (ADR-0014).
|
||||
- CI stays offline: only committed `.glb`/`.png`/`.tres` and Godot are needed; optional AI/Blender steps are reproducible development tools.
|
||||
|
||||
### Character development tooling
|
||||
|
||||
Characters have two authored sources and one procedural fallback. The eight-variant
|
||||
Blender library (`assets/models/blender/npc/`) is the normal presentation path; the
|
||||
older skinned `npc_base` (`assets/models/generated/npc_base.glb`) remains a frozen
|
||||
contract and fallback; `NpcAvatar`'s procedural rig is the offline last resort.
|
||||
Blender is a developer tool only — runtime, tests and CI consume committed GLBs and
|
||||
maps.
|
||||
|
||||
| Tool | Role | Committed artifact | Verification gate |
|
||||
| --- | --- | --- | --- |
|
||||
| `tools/npc_pipeline.py` | Builds the skinned base avatar, five-slot material maps, palette and AI-fabric preparation (`prepare`/`palette`) | `npc_base.glb`, `assets/textures/npc/*_{albedo,normal,orm}.png`, `palette.json` | `audit_glb` against the frozen 6,000-triangle / 4,000-vertex base contract |
|
||||
| `tools/blender_assets.py` | Builds/renders the library: 8 characters, 18 gear pieces, 20 props, plus `manifest.json`; stdlib `audit`/`fit`/`sheet`/`list` | `assets/models/blender/{npc,npc_gear,props}/*.glb` | Library cap 8,000 tris / 8,000 verts per character, 1,500 per gear, 4,000 per prop; grounding, UV, degenerate-triangle, attach-fit and manifest coverage checks |
|
||||
| `tools/bake_ao.py` | Bakes per-asset AO maps | `<asset>_ao.png` (256²) | Wired through `Materials.apply_ao()`/`SurfaceMaterials`; cloth/pants opt out (see below) |
|
||||
| `tools/npc_proportions.py` | Measures exported GLB rest pose (height, head, shoulders, hips, torso, limbs, feet) against the stylized guide | report / JSON in `docs/npc-proportion-audit.md` | All eight variants must stay inside the guide after a body change |
|
||||
| `tools/npc_baseline.py` | Assembles neutral-baseline sheets and before/after comparisons | `docs/blender_previews/sheet_npc_baseline*.jpg` | Human review against `docs/npc-visual-review.md` |
|
||||
| `src/test/capture_npc_baseline.gd` | Fixed-camera studio baseline, 8 variants × 6 views | local `tmp/` frames | Neutral silhouette/face/gear review |
|
||||
| `src/test/capture_npc_review.gd` | Final-context gate: 8 variants × 2 venues × day/night × 3 distances = 96 frames, crowd hidden, review-only `character_override` for the guard | local `tmp/` frames | Pre-build acceptance gate for gear fit and venue lighting |
|
||||
| `src/test/capture_realism.gd` | Venue realism stages plus a frozen portrait and surface close-ups | `docs/screens/realism/<run>/` | Optional vision judge; portrait is the only avatar-detail capture |
|
||||
|
||||
Runtime contracts that must survive any character change:
|
||||
|
||||
- `NpcAvatar.character_model_for(role, seed)` selects the library variant; `character_override`
|
||||
exists only to stage roles without a spawned model (for example the guard).
|
||||
- The armature node names, `Rig/Head`, the Hip/Knee/Shoulder/Elbow/Hand proxies and the
|
||||
**+Z visual front** are frozen; animation and `yaw_towards()` depend on them.
|
||||
- Only the five contract slots are tinted. Fixed detail materials (eyes, reflective bands,
|
||||
rubber) stay untouched, gear is placed by `GEAR_ATTACH`, and `GEAR_OFFSETS` plus
|
||||
`HAND_ITEM_FORWARD` are runtime attach-space corrections, not authoring changes.
|
||||
- Cloth/pants use `Materials.NPC_FABRIC_UV_SCALE` (4×) and skip the baked per-character AO;
|
||||
skin/hair/gear keep AO. Do not reintroduce the blotchy cloth AO.
|
||||
- `apply_lod()` swaps to an impostor at 26 m; the 24-NPC budget smoke (6.94 ms, 168 meshes,
|
||||
131,616 triangles) is the performance gate. Changing either triangle cap requires
|
||||
re-measuring that smoke and the Web/Compatibility path.
|
||||
- Rebuild only the assets whose geometry changed (Blender GLB export is byte-nondeterministic),
|
||||
then run `godot --headless --path . --import`; never commit a no-op full rebuild.
|
||||
|
||||
Evidence and detailed contracts live in [`blender-assets.md`](blender-assets.md),
|
||||
[`npc-visual-review.md`](npc-visual-review.md) and
|
||||
[`npc-proportion-audit.md`](npc-proportion-audit.md); command-level usage is in
|
||||
[`asset-tooling.md`](asset-tooling.md).
|
||||
|
||||
### Content authoring and runtime data flow
|
||||
|
||||
`ScenarioFactory` is the source of truth for the three authored venues. `tools/export_venues.gd`
|
||||
@@ -272,6 +314,7 @@ Architecture decisions are recorded as ADRs:
|
||||
- Accessibility and localization coverage is partial; a public release needs subtitles/captions, colour-independent cues, remapping, text expansion tests and at least a documented localization workflow.
|
||||
- Unsigned macOS builds, AI asset provenance and any storefront/legal requirements are release blockers for a public release.
|
||||
- Documentation drift has already occurred (release version, implemented status and obsolete plan docs); the ownership map and roadmap must be kept current in the same change as the implementation.
|
||||
- Character quality is only partly automatable: proportions, budgets and gear fit are measured, but face realism and venue-lighting readability still need the baseline/review sheets and human sign-off after any mesh, map or material change.
|
||||
|
||||
## 12. Documentation Consolidation and Ownership
|
||||
|
||||
@@ -287,6 +330,8 @@ architecture document.
|
||||
| [`docs/adr/`](adr/) | Immutable decision records with context and consequences | Decision history linked from §9 |
|
||||
| [`docs/asset-tooling.md`](asset-tooling.md) | Build/audit/capture commands and pipeline usage | Operational appendix to the pipeline section |
|
||||
| [`docs/blender-assets.md`](blender-assets.md) | Blender character/gear/prop contracts and attach points | Detailed asset contract appendix |
|
||||
| [`docs/npc-visual-review.md`](npc-visual-review.md) | NPC baseline views, acceptance criteria and ranked visual gaps | Visual-QA appendix to the character tooling section |
|
||||
| [`docs/npc-proportion-audit.md`](npc-proportion-audit.md) | Measured proportions against the stylized guide | Measurement appendix to the character tooling section |
|
||||
| [`docs/getting-started.md`](getting-started.md) | Setup, commands, controls | Developer onboarding |
|
||||
| [`docs/RELEASING.md`](RELEASING.md) | Release checklist and CI/publishing steps | Deployment appendix to §7 |
|
||||
| [`docs/smoke-checklist.md`](smoke-checklist.md) | Manual verification script | QA appendix to §10 |
|
||||
|
||||
@@ -129,6 +129,11 @@ with colliders/avoidance and drives their emissive parts from the day/night
|
||||
cycle. The single `npc_base.glb` and primitive props remain offline fallbacks.
|
||||
Contract and integration notes: [`blender-assets.md`](blender-assets.md).
|
||||
|
||||
Sourcing and expansion research (no external model is shipped yet):
|
||||
[`npc-model-sourcing.md`](npc-model-sourcing.md) compares Quaternius, Kenney, Khronos and
|
||||
MakeHuman sources against the character contract and records the 2026-11-03 direction
|
||||
(procedural generator first, Quaternius reference, MakeHuman deferred).
|
||||
|
||||
| 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="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_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_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) |
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
@@ -0,0 +1,308 @@
|
||||
# NPC model sourcing and expansion plan
|
||||
|
||||
Status: **direction chosen 2026-11-03.** The procedural generator is the primary
|
||||
path, the Quaternius CC0 pack is a reviewed reference/prototype, and MakeHuman is
|
||||
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
|
||||
they behave when imported into the existing Blender tooling, and the options for
|
||||
creating a larger NPC model library. The runtime contract and current library are
|
||||
documented in [`blender-assets.md`](blender-assets.md) and
|
||||
[`npc-visual-review.md`](npc-visual-review.md).
|
||||
|
||||
## Why this review exists
|
||||
|
||||
The library has eight skinned characters, and `NpcAvatar.character_model_for()`
|
||||
reuses them across role families. That is enough for a release candidate, but
|
||||
crowds repeat the same faces, builds and outfits. Three venues, a 24-NPC budget
|
||||
and close-up portraits make that repetition visible.
|
||||
|
||||
Any expansion must preserve the existing integration contract:
|
||||
|
||||
- mesh node `npc_base` under a `Skeleton3D`;
|
||||
- bones `Head`, `HipL/R`, `KneeL/R`, `ShoulderL/R`, `ElbowL/R`, `HandL/R` plus
|
||||
`Hips`, `Spine`, `Neck` at the contract rest positions;
|
||||
- five tint slots (`skin`, `cloth`, `pants`, `accessory`, `hair`);
|
||||
- front on Blender −Y / Godot +Z, feet near the floor, 1.6–2.1 m height;
|
||||
- at most 8,000 triangles and 8,000 glTF vertices per character;
|
||||
- gear attach points at head, back, chest and hand.
|
||||
|
||||
The existing `audit` command is the gate. A source that looks good in a preview
|
||||
but fails `audit` is not usable without an adaptation step.
|
||||
|
||||
## What was evaluated
|
||||
|
||||
Blender 5.2.0 LTS (Flatpak) imported each file in background mode. Measurements
|
||||
below come from the imported scene, because external GLBs often carry node
|
||||
transforms that the project's audit (which reads accessor-local bounds) does not
|
||||
apply. "Vertices" are the imported, seam-split counts that matter for the glTF
|
||||
budget, not the source file's vertex count.
|
||||
|
||||
| Source | Licence | Files checked | Geometry / rig | Height | Verdict |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| **Quaternius Ultimate Modular Men / Women** (mirrored GLB pack) | CC0 1.0 | `Casual_Hoodie.glb`, `Worker.glb`, `Casual.glb` | 5,240–6,424 tris; 10,534–12,968 verts; 62 bones; 24 animations; 4 skinned meshes on one armature | 1.80–1.87 m | **Best silhouette/outfit match.** Fails the contract: wrong bone names/rest positions, no tint slots, no `npc_base` node, vertex budget exceeded. |
|
||||
| **Kenney Blocky Characters 2.0** | CC0 1.0 | full pack (18 characters), `character-a.glb`, `character-f.glb` | 72 tris; 143 verts; static, no armature; one texture atlas per character | 2.7 m imported (needs 0.67× scale) | **Not a close-up character.** Useful as a crowd/impostor LOD or placeholder, but cannot be driven by the skeleton and has no separate face/clothing slots. |
|
||||
| **Khronos CesiumMan** | CC BY 4.0 (© Cesium) | `CesiumMan.glb` | 4,672 tris; 3,273 verts; 19-bone walk rig; 1 material/texture; 1 animation | 1.45 m | **Technical retarget test only.** One outfit and one look, wrong rig, short; works as a skinning/pose reference. Attribution is required. |
|
||||
| **Khronos RiggedFigure** | CC BY 4.0 (© Cesium) | `RiggedFigure.glb` | 256 tris; 370 verts; 19-bone walk rig; no UVs; 1 animation | 1.48 m | **Rig smoke test only.** A mannequin with no usable surface detail. |
|
||||
| **MakeHuman core base mesh / MPFB** | Core assets CC0 1.0; application AGPL/GPL | `makehuman/data/3dobjs/base.obj` | 19,158 verts; 18,486 polygons; 36,972 tris; no rig in the base mesh | ~16.9 model units before scaling | **Best body-shape diversity, highest pipeline cost.** Needs scaling, decimation/retopology and a generated rig. The MakeHuman/MPFB tool itself is not bundled. |
|
||||
|
||||
Local review sheet (front views, not committed):
|
||||
`tmp/npc-research/previews/contact_sheet.jpg`.
|
||||
|
||||
Rejected without downloading: Mixamo and Ready Player Me. Both are useful
|
||||
services, but their terms are not a simple free/open-source redistribution basis
|
||||
for shipped character meshes. Sketchfab, Poly Pizza and OpenGameArt can contain
|
||||
excellent CC0 work, but each asset needs a case-by-case licence and provenance
|
||||
check; they are not a consistent library source.
|
||||
|
||||
### Measured contract failures
|
||||
|
||||
Every example fails the unmodified `audit` contract:
|
||||
|
||||
| Check | Quaternius | Kenney | CesiumMan | RiggedFigure | MakeHuman base |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| `npc_base` mesh node | no | no | no | no | no |
|
||||
| Required 13 bones | no (62 different names) | no rig | no (19 different names) | no (19 different names) | no rig |
|
||||
| Five tint slots | no | no | no | no | no |
|
||||
| ≤ 8,000 tris | yes | yes | yes | yes | no |
|
||||
| ≤ 8,000 verts | no (10.5–13k) | yes | yes | yes | no (19k) |
|
||||
| Feet on floor | yes | yes (2.7 m scale) | yes (−11 mm) | yes | no (needs scaling) |
|
||||
| Height 1.6–2.1 m | yes | no (2.7 m) | no (1.45 m) | no (1.48 m) | needs scale |
|
||||
| Skinned / UV mapped | yes / yes | no / yes | yes / yes | yes / no | no / no |
|
||||
|
||||
The practical conclusion is that **there is no drop-in download**. External
|
||||
sources need a deliberate intake step, and the expensive part is not decimation:
|
||||
it is rebuilding or retargeting the skeleton and material slots without breaking
|
||||
the animation proxies and gear placement.
|
||||
|
||||
The table uses Blender-imported world bounds. The stdlib `audit` reads accessor-local
|
||||
bounds and ignores node transforms, so an unapplied external GLB can fail floor/height
|
||||
checks even when the imported scene looks correct. The intake step must apply
|
||||
transforms before it measures and exports.
|
||||
|
||||
## Options
|
||||
|
||||
### Option A — extend the procedural generator
|
||||
|
||||
Add more variation to `tools/blender_assets.py` rather than importing models:
|
||||
body builds, height ranges, head/face shapes, hair and facial hair, outfit
|
||||
layers, and more `CHARACTERS` specs. This keeps a single owned style, needs no
|
||||
third-party licence review, and stays inside the existing builder/audit flow.
|
||||
|
||||
- **Strengths:** lowest integration risk, deterministic, no new dependencies.
|
||||
- **Limits:** the current face and clothing vocabulary is intentionally simple;
|
||||
more variants may still read as the same model with a different coat.
|
||||
- **Best for:** a quick 4–8 variant expansion and filling obvious role gaps.
|
||||
|
||||
### Option B — Quaternius CC0 intake with a contract adapter
|
||||
|
||||
Use Quaternius meshes as silhouette/outfit donors and adapt them to the project
|
||||
contract. The visible result is a different body/clothing language from the
|
||||
current library, so the adapter must also normalise head/hand style or rebuild
|
||||
those parts.
|
||||
|
||||
- **Strengths:** best free outfit/hair variety, animations included, CC0,
|
||||
already close to game proportions, front axis and floor contact.
|
||||
- **Work:** weld/decimate to the vertex budget, remap materials to the five
|
||||
slots, rebuild the armature at the contract rest positions, transfer weights,
|
||||
repose/normalise proportions, rename the mesh node, export, audit and compare
|
||||
in the acceptance harness.
|
||||
- **Main risk:** retargeting a 62-bone T-pose rig to the 13-bone arm-down
|
||||
contract. Hip/knee rest heights differ substantially (Quaternius upper leg
|
||||
starts near 0.96 m; the contract hip starts near 0.62 m), so a naive
|
||||
nearest-bone weight transfer can produce a good still image and bad walk
|
||||
poses. Prototype one character before committing to a roster.
|
||||
- **Best for:** a larger, visibly different library if the prototype passes the
|
||||
portrait and walk gates.
|
||||
|
||||
### Option C — MakeHuman/MPFB body-shape pipeline
|
||||
|
||||
Generate a range of ages, builds and body shapes from the CC0 MakeHuman base
|
||||
mesh, then replace the head/hands and dress them with project-owned clothing.
|
||||
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
|
||||
should be treated as a later pipeline project, not a quick content drop.
|
||||
|
||||
## Decision and prototype outcome
|
||||
|
||||
The project owner reviewed this page on 2026-11-03. The decision is:
|
||||
|
||||
1. **CC0 is acceptable** for shipped character assets. CC-BY is acceptable only
|
||||
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**.
|
||||
The boundary for that future work is:
|
||||
|
||||
- MPFB/MakeHuman is installed and run by a contributor, never by CI or the game
|
||||
build.
|
||||
- Generated bodies and intermediate exports stay in `tmp/` (gitignored); the
|
||||
CC0 base mesh is not committed.
|
||||
- The contributor scales to 1.8–1.9 m, decimates or retopologises to roughly
|
||||
6–7k triangles, and checks the silhouette against `npc-visual-review.md`.
|
||||
- The body gets the contract armature, weights, project-owned head/hands,
|
||||
clothing and gear; it must pass `blender_assets.py audit` and `fit`.
|
||||
- Only the final CC0-derived GLB and its provenance note are committed. The
|
||||
application code and any non-CC0 assets stay outside the repository.
|
||||
|
||||
This is deferred; it is not part of the 0.11.0 crowd-variety work.
|
||||
|
||||
## Provisional NPC roster
|
||||
|
||||
The design rule stays: clothes, props and behaviour carry the read; a model must
|
||||
not label a person as "the threat". The roster therefore adds ordinary adults
|
||||
across age, build and style, not costumes that telegraph the outcome.
|
||||
|
||||
| Look family | Current | Proposed additions | Variation axes |
|
||||
| --- | --- | --- | --- |
|
||||
| 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` | later: second hi-vis build, venue-security build | build, height, headwear, badge/radio gear |
|
||||
| Responder | `npc_firefighter` | later: paramedic/medical responder only if the design supports it | turnout vs medical kit, build, helmet |
|
||||
| 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 the four
|
||||
crowd prototypes), not twenty. That is enough to break the clone effect without
|
||||
doubling the portrait QA matrix. `character_model_for()` becomes a pool per role
|
||||
family with a deterministic seed choice; the current two-way alternation for
|
||||
guests, trespassers and threats is the template.
|
||||
|
||||
## Implementation plan
|
||||
|
||||
The actionable tasks live in `TODO.md` under milestone 0.11.0. The workstreams
|
||||
are:
|
||||
|
||||
1. **Decision and licence gate.** Complete: ADR-0015, the CC0/CC-BY rule and the
|
||||
committed preview sheets.
|
||||
2. **Generator crowd variants.** Complete as a prototype (four specs, clean
|
||||
audit, review sheet). Production integration is pending the 0.10.0 release.
|
||||
3. **Quaternius intake.** The contract-retarget prototype is a no-go. Keep the
|
||||
source as a reference; a second-rig/animation path would need its own ADR.
|
||||
4. **Roster build and runtime.** Add the four approved specs to `CHARACTERS`,
|
||||
build and commit their GLBs, update the manifest, and extend the role pools.
|
||||
5. **QA and integration.** Run the 24-NPC budget, portrait baseline, gear fit,
|
||||
headless suite and release build. Record provenance and any accepted limits.
|
||||
Only then update `CHANGELOG.md` and `docs/development-status.md`.
|
||||
|
||||
### Adapter notes
|
||||
|
||||
- Apply node transforms before measuring or exporting. CesiumMan imports with a
|
||||
Z-up root and an `Icosphere` helper object; exclude helpers, not just the mesh
|
||||
names, when measuring.
|
||||
- Weld duplicate seam vertices before decimating. Quaternius' 12k imported
|
||||
vertices are mostly UV/normal splits; the underlying surface is much smaller,
|
||||
but the glTF budget counts the splits after export.
|
||||
- Decimate to a target below 8,000 tris/verts, then re-unwrap only if the
|
||||
existing UVs cannot survive the material remap. The current library uses
|
||||
smart projection at 80° to keep islands large.
|
||||
- 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
|
||||
`accessory`; do not rely on colour heuristics.
|
||||
- Keep the face direction unambiguous. The front is Blender −Y; verify it with
|
||||
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 outcome
|
||||
|
||||
The project owner answered the review questions on 2026-11-03:
|
||||
|
||||
| Question | Answer |
|
||||
| --- | --- |
|
||||
| Are third-party CC0 characters acceptable? | Yes. |
|
||||
| Which direction? | Prototype Quaternius and extend the procedural generator. |
|
||||
| Which looks first? | Crowd variety. |
|
||||
| Should MakeHuman be pursued? | Evaluate it for a later, separate local development pipeline. |
|
||||
| Commit the previews? | Yes, with CC-BY attribution. |
|
||||
|
||||
## Downloaded example provenance
|
||||
|
||||
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 |
|
||||
| --- | --- | --- |
|
||||
| `quaternius/Casual_Hoodie.glb` | `raw.githubusercontent.com/LuanDucate/Ducz.CharacterCreator/HEAD/public/models/Male/Casual_Hoodie.glb` (Quaternius CC0) | `f5b722199f7628b24550989af4230f65d5230727df9c326fd2b3e360effe5249` |
|
||||
| `quaternius/Worker.glb` | same mirror, `Male/Worker.glb` | `8d0f454336c2effc5c08f63a177af3a82d1a7af025ca9588b40e4c90c4703534` |
|
||||
| `quaternius/Casual.glb` | same mirror, `Female/Casual.glb` | `bc2d84fba249ebaa0629cb9d133ad37234196e4b8004aa205a6397abed04e05c` |
|
||||
| `kenney_blocky_characters.zip` | `kenney.nl/assets/blocky-characters` | `5e123859aa0c1598342b600c6db197024a1d63eb9ec531398b310725f589887e` |
|
||||
| `khronos/CesiumMan.glb` | `github.com/KhronosGroup/glTF-Sample-Assets` | `b7001eaeea8254bd44773bcd247e78696d94169388fbb2a1800fc69434e777d9` |
|
||||
| `khronos/RiggedFigure.glb` | same repository | `d6be85417d3e256861ee733eea6916093a7af7c79c16366181fd8abcaeb38cf5` |
|
||||
| `makehuman/base.obj` | `github.com/makehumancommunity/makehuman/blob/master/makehuman/data/3dobjs/base.obj` | `8e761e6624b8f54536409135d1636da63b32486a90d4897f84e121d144f6fb4c` |
|
||||
|
||||
Source terms:
|
||||
|
||||
- Quaternius packs are CC0 1.0 according to the pack page and the mirror's
|
||||
credits. The mirror is a convenience download; the original pack page is
|
||||
<https://quaternius.com/packs/ultimatemodularcharacters.html>.
|
||||
- Kenney Blocky Characters 2.0 is CC0 1.0; the pack's `License.txt` is included
|
||||
in the download.
|
||||
- CesiumMan and RiggedFigure are CC BY 4.0, © 2017 Cesium. If any derivative is
|
||||
committed or shipped, the attribution must be added to `CREDITS.md`.
|
||||
- MakeHuman core assets are CC0 per `LICENSE.ASSETS.md`; the application source
|
||||
is AGPL and is not bundled.
|
||||
Reference in new issue
Block a user