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:
1 parent
7efb5024ec
commit
d513e0b82c
109 files changed
+1916
-114
No files matched your search
@@ -57,3 +57,9 @@ assets/models/generated/npc_base_*_normal.png
|
|||||||
|
|
||||||
# Local AppImage extraction
|
# Local AppImage extraction
|
||||||
squashfs-root/
|
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
|
||||||
@@ -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
|
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)`.
|
`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.
|
`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
|
- **Blender asset library (v0.6.0, built + audited 2026-11-01, not integrated):**
|
||||||
`assets/models/blender/{npc,npc_gear,props}/` plus `manifest.json`, `docs/blender_previews/`,
|
`tools/blender_assets.py` (`build`/`render` in Blender; `audit`/`sheet`/`list` stdlib) writes
|
||||||
and (when finished) `docs/blender-assets.md`. Contract: 8 character variants (same bones/slots
|
`assets/models/blender/{npc,npc_gear,props}/*.glb`, `manifest.json` (integration source of
|
||||||
as `npc_base`), 18 gear pieces in attach-point space (head/hand/back/chest), 22 props; the first
|
truth), sources in `assets/models/blender_src/` (`.gdignore`d), and review sheets
|
||||||
nine replace current furniture/lamps/trees/cone, the rest are new dressing. Treat the manifest
|
`docs/blender_previews/sheet_*.jpg` (per-asset PNG renders are gitignored). 8 characters, 18
|
||||||
as the source of truth and run `python3 tools/blender_assets.py audit`/`sheet` before wiring.
|
gear, 20 props; notes in `docs/blender-assets.md`. Characters are drop-in for `npc_base`
|
||||||
At the time of writing only `npc_casual` existed (7,756 tris / 5,616 verts, above the current
|
(same mesh node name, bones at the same rest positions, five tint slots) and stay under the
|
||||||
6,000/4,000 character budget) — reconcile the budget before integration. Don't edit the
|
6000/4000 budget only because of body decimation (0.36) + `smart_project` at 80°: glTF vertex
|
||||||
generator while its Blender process is running.
|
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
|
- **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
|
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.
|
line-up, back row on a platform) and the `prop_gallery` catalogue entry compares it.
|
||||||
|
|||||||
@@ -413,7 +413,7 @@ existing AI tools remain the source of art direction for fabric textures, palett
|
|||||||
screen-design compare/judge gate.
|
screen-design compare/judge gate.
|
||||||
|
|
||||||
The library targets 8 character variants (casual, jacket, coat, vest, dress, hoodie, firefighter,
|
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
|
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
|
`Rig/Head` focus anchor, seed-driven outfit determinism, collider/navigation footprints, and the
|
||||||
frame budget measured by `smoke_npc_budget.gd`. See
|
frame budget measured by `smoke_npc_budget.gd`. See
|
||||||
|
|||||||
@@ -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
|
`.glb` and regenerates the procedural normal + packed ORM maps. `palette` writes
|
||||||
`assets/textures/npc/palette.json` using `model_pipeline.dominant_colors`.
|
`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 |
|
||||||
|
| --- | --- |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
|
```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
|
### Confirmed game assets
|
||||||
|
|
||||||
Everything below is audited and shipped in the game; development-only outputs
|
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/architecture.md`](docs/architecture.md) — arc42-style architecture documentation.
|
||||||
- [`docs/adr/`](docs/adr/) — Architecture Decision Records.
|
- [`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/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
|
## Development Status
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,18 @@
|
|||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
Godot 4.3 prototype. Latest release **v0.5.0** (NPC characters and player movement). Headless
|
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
|
timeline, audio, scenario-content, props, NPC-budget, movement, and windowed focus/radial smokes
|
||||||
pass. Anonymous downloads are enabled on the host.
|
pass. Anonymous downloads are enabled on the host.
|
||||||
|
|
||||||
The scheduled presentation pass is complete (see `DONE.md`). The next scheduled pass is the
|
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).
|
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 asset library built (2026-11-01):** `tools/blender_assets.py` generated 8 NPC
|
||||||
> Blender) to generate a larger library: 8 NPC character variants, 18 gear pieces, and 22
|
> character variants, 18 gear pieces, and 20 street/venue props under `assets/models/blender/`
|
||||||
> street/venue props under `assets/models/blender/`, with a manifest and preview renders.
|
> (audit clean, Godot import clean, see [`docs/blender-assets.md`](docs/blender-assets.md)).
|
||||||
> Do not edit the generator while that process is running. Treat
|
> Treat `assets/models/blender/manifest.json` as the integration source of truth; nothing is
|
||||||
> `assets/models/blender/manifest.json` as the integration source of truth, and audit the
|
> wired into the game yet.
|
||||||
> finished outputs before wiring anything into the game.
|
|
||||||
|
|
||||||
## Graphics quality — Blender-authored NPC characters (v0.6.0)
|
## 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-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.
|
- [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),
|
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
|
generator `tools/blender_assets.py`, review sheets `docs/blender_previews/sheet_*.jpg`,
|
||||||
integration notes are being written to `docs/blender-assets.md`). The library currently targets
|
integration notes [`docs/blender-assets.md`](docs/blender-assets.md). The library has
|
||||||
8 `npc` variants, 18 `npc_gear` pieces, and 22 `props`; each entry records path, triangle/vertex
|
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.
|
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
|
- [x] 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
|
reconcile every failure. Characters were reduced to fit the unchanged 6,000/4,000 contract
|
||||||
(7,756 tris / 5,616 verts): reduce the mesh or raise/annotate the character budget in the
|
(now 3,788–4,640 tris / 3,195–3,962 verts); the audit also rejects zero-area triangles.
|
||||||
plan before integrating.
|
- [x] Run `python3 tools/blender_assets.py sheet` and review the contact sheets; reject assets
|
||||||
- [ ] 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.
|
whose silhouette, grounded origin, or face direction (+Z in Godot) is wrong.
|
||||||
- [ ] Commit the finished library with the generator, `.blend` sources, manifest, previews, and
|
- [ ] 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
|
`docs/blender-assets.md`; add generated/preview folders to `.gitignore` only where CI can
|
||||||
rebuild them offline. Keep the audit runnable without Blender.
|
rebuild them offline. Keep the audit runnable without Blender. (`.gitignore` already
|
||||||
- [ ] Add `tools/test_blender_assets.py` for the manifest contract (all catalogue entries present,
|
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/`).
|
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
|
- [ ] 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` /
|
(`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.
Binary file not shown.
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.
@@ -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.
|
- `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/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/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.
|
- `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.
|
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
Reference in new issue
Block a user