Stage the Blender character/gear/prop library

Commit the finished generator output from the parallel Blender pass:
8 skinned NPC variants, 18 gear pieces, and 20 props under
assets/models/blender/, editable sources (gdignored), manifest, review sheets,
and the integration notes in docs/blender-assets.md.

- audit: all 46 assets clean (characters 3,788-4,640 tris, under 6000/4000)
- tests: Python manifest/audit contract and Godot import/bone/slot/ground checks
- docs: README library section, architecture/plan references, TODO Phase 3.5
  status, MEMORY integration rules
- .gitignore: per-asset preview PNGs, extracted GLB textures, blend1 backups

Nothing in the game loads the library yet; integration follows." && git log --oneline -1
This commit is contained in:
zwitschi committed 2026-11-01 14:33:30 +01:00
1 parent 7efb5024ec
commit d513e0b82c
109 files changed
+1916 -114

No files matched your search

+6
View File
@@ -57,3 +57,9 @@ assets/models/generated/npc_base_*_normal.png
# Local AppImage extraction
squashfs-root/
# Blender asset library: per-asset Cycles renders are local review output (the
# committed review artefacts are docs/blender_previews/sheet_*.jpg), and Godot
# extracts the GLB-embedded textures next to the models on import.
docs/blender_previews/*.png
assets/models/blender/**/*.png
assets/models/blender_src/*.blend1
+14 -9
View File
@@ -129,15 +129,20 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o
flat plane, so avoidance (not a baked mesh) routes guests around props. Placements live in
`PROP_PLACEMENTS` with `placement_problems()` validation; variants come from `variant_for(index)`.
`smoke_props.gd` must be windowed because the guard reads captured-mouse input.
- **Blender asset library (v0.6.0, in progress):** `tools/blender_assets.py` generates
`assets/models/blender/{npc,npc_gear,props}/` plus `manifest.json`, `docs/blender_previews/`,
and (when finished) `docs/blender-assets.md`. Contract: 8 character variants (same bones/slots
as `npc_base`), 18 gear pieces in attach-point space (head/hand/back/chest), 22 props; the first
nine replace current furniture/lamps/trees/cone, the rest are new dressing. Treat the manifest
as the source of truth and run `python3 tools/blender_assets.py audit`/`sheet` before wiring.
At the time of writing only `npc_casual` existed (7,756 tris / 5,616 verts, above the current
6,000/4,000 character budget) — reconcile the budget before integration. Don't edit the
generator while its Blender process is running.
- **Blender asset library (v0.6.0, built + audited 2026-11-01, not integrated):**
`tools/blender_assets.py` (`build`/`render` in Blender; `audit`/`sheet`/`list` stdlib) writes
`assets/models/blender/{npc,npc_gear,props}/*.glb`, `manifest.json` (integration source of
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.36) + `smart_project` at 80°: glTF vertex
count includes UV-seam splits, so extra beveled detail quickly breaks 4000.
**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
`albedo_color = WHITE` on unknown slots. Cycles CPU render ≈ 3 s/asset; Godot import of the
library is clean.
- **Prop pipeline (done):** audit enforces 400 tris / 600 verts, ground contact, UV range, no
degenerate tris, one material. `capture_prop_gallery.gd` writes `10-prop-gallery.png` (3x2 studio
line-up, back row on a platform) and the `prop_gallery` catalogue entry compares it.
+1 -1
View File
@@ -413,7 +413,7 @@ existing AI tools remain the source of art direction for fabric textures, palett
screen-design compare/judge gate.
The library targets 8 character variants (casual, jacket, coat, vest, dress, hoodie, firefighter,
guard), 18 gear pieces, and 22 props — including replacements for the current generated street
guard), 18 gear pieces, and 20 props — including replacements for the current generated street
furniture, lamps, trees, doors, marquee, and a venue car. Integration must preserve the
`Rig/Head` focus anchor, seed-driven outfit determinism, collider/navigation footprints, and the
frame budget measured by `smoke_npc_budget.gd`. See
+26
View File
@@ -250,6 +250,31 @@ which is gitignored) onto the `cloth`/`pants` albedos; `build` bakes them into t
`.glb` and regenerates the procedural normal + packed ORM maps. `palette` writes
`assets/textures/npc/palette.json` using `model_pipeline.dominant_colors`.
### Blender asset library (staged, not yet loaded by the game)
`tools/blender_assets.py` models a larger library procedurally in Blender for the
v0.6.0 integration: **8 skinned NPC characters** (casual, jacket, coat, hi-vis vest,
dress, hoodie, firefighter, guard), each a drop-in for `npc_base.glb` (same bones,
joint positions and tint slots); **18 gear pieces** authored at head/hand/back/chest
attach points (caps, hood, helmet, backpack, SCBA tank, lanyard, phone, cup,
clipboard, umbrella, camera, sign, flashlight, wand, radio, …); and **20 props**
(octagonal bollard and bin, slatted bench, hydrant, news box, planters, street lamp,
street and palm trees, A-frame sign, wall lantern, cone, crowd barrier, stanchion,
handrail, podium, double door, marquee, sedan). Contract and integration notes:
[`docs/blender-assets.md`](docs/blender-assets.md).
| Characters | Props |
| --- | --- |
| ![characters](docs/blender_previews/sheet_npc.jpg) | ![props](docs/blender_previews/sheet_props.jpg) |
```bash
flatpak run org.blender.Blender --background --python "$PWD/tools/blender_assets.py" -- build
flatpak run org.blender.Blender --background --python "$PWD/tools/blender_assets.py" -- render
python3 tools/blender_assets.py sheet # docs/blender_previews/sheet_*.jpg
python3 tools/blender_assets.py audit # no Blender needed
godot --headless --path . --import
```
### Confirmed game assets
Everything below is audited and shipped in the game; development-only outputs
@@ -445,6 +470,7 @@ The full arc42-style architecture documentation lives in [`docs/architecture.md`
- [`docs/architecture.md`](docs/architecture.md) — arc42-style architecture documentation.
- [`docs/adr/`](docs/adr/) — Architecture Decision Records.
- [`docs/plan-graphics-v0.6.md`](docs/plan-graphics-v0.6.md) — Graphics-quality plan: Blender-authored NPC characters.
- [`docs/blender-assets.md`](docs/blender-assets.md) — Blender asset library: characters, gear, props, attach points.
## Development Status
+24 -18
View File
@@ -1,19 +1,18 @@
# TODO
Godot 4.3 prototype. Latest release **v0.5.0** (NPC characters and player movement). Headless
suite **212/212** plus **60** Python tooling tests; the session, PLAN-verb, crowd, emergency,
suite **218/218** plus **68** Python tooling tests; the session, PLAN-verb, crowd, emergency,
timeline, audio, scenario-content, props, NPC-budget, movement, and windowed focus/radial smokes
pass. Anonymous downloads are enabled on the host.
The scheduled presentation pass is complete (see `DONE.md`). The next scheduled pass is the
graphics-quality work in [`docs/plan-graphics-v0.6.md`](docs/plan-graphics-v0.6.md).
> **Asset build in progress:** `tools/blender_assets.py` is being run separately (flatpak
> Blender) to generate a larger library: 8 NPC character variants, 18 gear pieces, and 22
> street/venue props under `assets/models/blender/`, with a manifest and preview renders.
> Do not edit the generator while that process is running. Treat
> `assets/models/blender/manifest.json` as the integration source of truth, and audit the
> finished outputs before wiring anything into the game.
> **Blender asset library built (2026-11-01):** `tools/blender_assets.py` generated 8 NPC
> character variants, 18 gear pieces, and 20 street/venue props under `assets/models/blender/`
> (audit clean, Godot import clean, see [`docs/blender-assets.md`](docs/blender-assets.md)).
> Treat `assets/models/blender/manifest.json` as the integration source of truth; nothing is
> wired into the game yet.
## Graphics quality — Blender-authored NPC characters (v0.6.0)
@@ -65,24 +64,31 @@ Detailed plan: [`docs/plan-graphics-v0.6.md`](docs/plan-graphics-v0.6.md) · [AD
- [x] Re-measure `smoke_npc_budget.gd`; tune `LOD_TIERS` if the skinned rig is heavier up close.
- [x] Re-verify the focus-cone smoke (`smoke_focus_radial.gd`) and the movement smoke.
### Phase 3.5 — Blender asset library integration (generator running)
### Phase 3.5 — Blender asset library integration
Contract and outputs: [`assets/models/blender/manifest.json`](assets/models/blender/manifest.json),
generator `tools/blender_assets.py`, previews `docs/blender_previews/` (the generator's
integration notes are being written to `docs/blender-assets.md`). The library currently targets
8 `npc` variants, 18 `npc_gear` pieces, and 22 `props`; each entry records path, triangle/vertex
generator `tools/blender_assets.py`, review sheets `docs/blender_previews/sheet_*.jpg`,
integration notes [`docs/blender-assets.md`](docs/blender-assets.md). The library has
8 `npc` variants, 18 `npc_gear` pieces, and 20 `props`; each entry records path, triangle/vertex
count, bounds, material slots, and (for gear) its attach point.
- [ ] Wait for the running build to finish, then run `python3 tools/blender_assets.py audit` and
reconcile every failure. The first `npc_casual` build is over the 6,000-triangle contract
(7,756 tris / 5,616 verts): reduce the mesh or raise/annotate the character budget in the
plan before integrating.
- [ ] Run `python3 tools/blender_assets.py sheet` and review the contact sheets; reject assets
- [x] Wait for the running build to finish, then run `python3 tools/blender_assets.py audit` and
reconcile every failure. Characters were reduced to fit the unchanged 6,000/4,000 contract
(now 3,788–4,640 tris / 3,195–3,962 verts); the audit also rejects zero-area triangles.
- [x] Run `python3 tools/blender_assets.py sheet` and review the contact sheets; reject assets
whose silhouette, grounded origin, or face direction (+Z in Godot) is wrong.
- [ ] Commit the finished library with the generator, `.blend` sources, manifest, previews, and
`docs/blender-assets.md`; add generated/preview folders to `.gitignore` only where CI can
rebuild them offline. Keep the audit runnable without Blender.
- [ ] Add `tools/test_blender_assets.py` for the manifest contract (all catalogue entries present,
rebuild them offline. Keep the audit runnable without Blender. (`.gitignore` already
excludes the per-asset preview PNGs, Godot-extracted GLB textures, and `*.blend1`.)
- [x] Add `src/test/tests/test_blender_assets.gd`: library imports as scenes, characters keep
bones/slots, joints match `npc_base`, bones accept the avatar pose math, props grounded.
- [ ] Tint only the five contract slots in `_apply_outfit_materials()` (fixed-colour detail
materials such as `hivis`/`reflective`/`leather` must keep their colour), and skip the
`vest` cloth→yellow override for `npc_vest` (its vest is the fixed `hivis` material).
- [ ] Bake AO/ORM for the Blender characters and props (they currently reuse tiling slot maps
or plain PBR factors).
- [x] Add `tools/test_blender_assets.py` for the manifest contract (all catalogue entries present,
audit clean, attach points known, paths inside `assets/models/blender/`).
- [ ] Let `NpcAvatar` choose a character model from the manifest by the profile's role/layer
(`npc_casual` / `npc_jacket` / `npc_coat` / `npc_vest` / `npc_dress` / `npc_hoodie` /
File diff suppressed because it is too large. Load diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Whitespace-only changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -80,6 +80,7 @@ The player interacts with NPCs, venue entrances, access artifacts, equipment, st
- `WorldBuilder` assembles the procedural venue and instantiates the generated prop models from `assets/models/generated/` with a procedural fallback.
- `tools/model_pipeline.py` builds and audits the street-prop `.glb` models and packs their colour atlases.
- `tools/npc_pipeline.py` builds and audits the skinned NPC base model (`assets/models/generated/npc_base.glb`) and its per-slot material maps, with an optional AI fabric override (ADR-0013).
- `tools/blender_assets.py` builds, renders and audits the staged Blender asset library (`assets/models/blender/{npc,npc_gear,props}/` + `manifest.json`): NPC character variants that are drop-in for `npc_base`, attach-point gear, and street/venue props. Not loaded at runtime yet (see `docs/blender-assets.md`).
- `tools/asset_pipeline.py` generates and audits role-aware textures; `tools/screen_designs.py` generates screen references and judges captures.
Confirmed game assets live in `assets/textures/ai/game_ready/` (audited surface, UI, and card textures), `assets/models/generated/` (prop and NPC `.glb` models plus their texture atlases), and `assets/textures/npc/` (NPC material maps and `palette.json`). Development-only outputs — AI concept sheets, Blender sources, raw AI fabrics — are gitignored and regenerated by the tools.
Loaded 100 of 109 files, more files were not shown because too many files have changed in this diff. Show more