Integrate the Blender character, gear and prop library
NpcAvatar - select one of 8 library character variants by role/seed (with npc_base and the procedural rig as fallbacks), keep Rig/Head and the existing bone animation - tint only skin/cloth/pants/accessory/hair; fixed detail materials keep their colour, npc_vest keeps its hi-vis vest, firefighter/guard use dark uniform tints - attach caps, hoods, helmets, backpacks, SCBA tanks, lanyards and hand items at the documented head/back/chest/hand points (primitive fallbacks retained) WorldBuilder - prefer assets/models/blender/props/ for the six replacements and the new street dressing (street lamp/tree, palms, planters, A-frame, cone, barrier, stanchion, podium, handrail, wall lantern, double door, marquee, sedan) - fit the same colliders/navigation obstacles and keep the placement validator; collect library emissives (bulbs, marquee face, wall lanterns, door LED, sedan lights) for set_night_mode() - add a library triangle counter + 60k budget check (current ~27,986); toggle prop gallery to the library models; fix the marquee label placement Tests/smoke - character selection/gear attach/fixed-material tint tests; library prop load, emissive and triangle-budget tests; smoke_props routes a guest around a stanchion in open sidewalk (the old bench route is now crowded by trees) - headless 222/222, Python 68/68, all smokes pass, compare 11 good / 0 bad Docs: TODO Phase 3.5 moved to DONE, README/architecture/blender-assets/plan describe the integrated runtime, MEMORY records the integration rules.
This commit is contained in:
1 parent
d513e0b82c
commit
d8cfddbf89
23 files changed
+531
-165
No files matched your search
@@ -1,18 +1,18 @@
|
||||
# TODO
|
||||
|
||||
Godot 4.3 prototype. Latest release **v0.5.0** (NPC characters and player movement). Headless
|
||||
suite **218/218** plus **68** Python tooling tests; the session, PLAN-verb, crowd, emergency,
|
||||
suite **222/222** 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).
|
||||
|
||||
> **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.
|
||||
> **Blender asset library integrated (2026-11-01):** 8 NPC character variants, 18 gear pieces,
|
||||
> and 20 street/venue props are now loaded by `NpcAvatar` and `WorldBuilder` from
|
||||
> `assets/models/blender/` (manifest as source of truth, see
|
||||
> [`docs/blender-assets.md`](docs/blender-assets.md)). The procedural rig and primitive props
|
||||
> remain offline fallbacks; AO/ORM baking is the remaining Phase 4 follow-up.
|
||||
|
||||
## Graphics quality — Blender-authored NPC characters (v0.6.0)
|
||||
|
||||
@@ -64,59 +64,6 @@ 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
|
||||
|
||||
Contract and outputs: [`assets/models/blender/manifest.json`](assets/models/blender/manifest.json),
|
||||
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.
|
||||
|
||||
- [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. (`.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` /
|
||||
`npc_firefighter` / `npc_guard`), with the existing `npc_base.glb` and procedural rig as
|
||||
fallbacks; record the chosen path for tests.
|
||||
- [ ] Keep `outfit_for()` tinting the `skin`/`cloth`/`pants`/`accessory`/`hair` slots on every
|
||||
variant and keep `Rig/Head` as the focus/nametag anchor.
|
||||
- [ ] Replace the procedural cap/hood/backpack/sunglasses/lanyard and hand items with the
|
||||
matching `npc_gear` assets at the documented `head` / `back` / `chest` / `hand` attach
|
||||
points; fall back to the current primitives when gear is missing.
|
||||
- [ ] Load the replacement props (`bollard`, `bench`, `trash_bin`, `planter_box`,
|
||||
`newspaper_box`, `fire_hydrant`, `street_lamp`, `street_tree`, `traffic_cone`) from the
|
||||
Blender library behind the existing `WorldBuilder` model/fallback path.
|
||||
- [ ] Place the new street/venue props (`palm_tree`, `round_planter`, `a_frame_sign`,
|
||||
`wall_lantern`, `crowd_barrier`, `stanchion`, `handrail`, `security_podium`,
|
||||
`double_door`, `marquee`, `sedan`) through `PROP_PLACEMENTS`/dedicated venue slots, with
|
||||
collider + `NavigationObstacle3D` footprints and no overlap with the door/approach lane.
|
||||
- [ ] Wire the emissive parts (`street_lamp` bulb, `wall_lantern`, `double_door` lock LED,
|
||||
`marquee` bulbs/sign face, `sedan` headlights) to the day/night phase lighting instead of
|
||||
leaving them always on.
|
||||
- [ ] Use the library `street_tree`/`palm_tree` instead of the current cone trees, and the
|
||||
Blender `marquee`/`double_door` where the procedural versions currently sit; compare
|
||||
silhouettes with `screen_designs.py`.
|
||||
- [ ] Re-measure `smoke_npc_budget.gd` and add a prop draw/triangle budget check; keep
|
||||
`MAX_LIVE_NPCS` unchanged until the new characters are measured.
|
||||
- [ ] Regenerate all staged captures and run `screen_designs.py compare` + `judge`; add a
|
||||
character close-up capture (the 02 target shot) to the catalogue if needed.
|
||||
|
||||
### Phase 4 — Environment and lighting lift
|
||||
|
||||
- [ ] Bake AO for the prop set through the Blender library (replacements above) or into the ORM/albedo maps behind the existing `WorldBuilder` contract; keep the procedural fallback.
|
||||
@@ -127,9 +74,9 @@ count, bounds, material slots, and (for gear) its attach point.
|
||||
|
||||
### Phase 5 — Verification and release
|
||||
|
||||
- [ ] Headless suite green: fallback build, outfit determinism, `Rig/Head` presence, material recipe assertions, `npc_pipeline.py audit`, and `blender_assets.py audit` + manifest tests (skip Blender builds with a reason when Blender is absent).
|
||||
- [ ] Windowed smokes pass: `smoke_npc_budget.gd`, `smoke_movement.gd`, `smoke_focus_radial.gd`, `smoke_props.gd`.
|
||||
- [ ] `screen_designs.py compare` and `judge` show no regressions; `blender_assets.py sheet` contact sheets reviewed for the character/gear/prop library.
|
||||
- [x] Headless suite green: fallback build, outfit determinism, `Rig/Head` presence, material recipe assertions, `npc_pipeline.py audit`, and `blender_assets.py audit` + manifest tests (skip Blender builds with a reason when Blender is absent).
|
||||
- [x] Windowed smokes pass: `smoke_npc_budget.gd`, `smoke_movement.gd`, `smoke_focus_radial.gd`, `smoke_props.gd`.
|
||||
- [x] `screen_designs.py compare` and `judge` show no regressions; `blender_assets.py sheet` contact sheets reviewed for the character/gear/prop library.
|
||||
- [ ] Bump `config/version` to `0.6.0`.
|
||||
- [ ] Update `README.md`, `docs/architecture.md` (Level 2 gains `tools/npc_pipeline.py`), and mark ADR-0013 Accepted.
|
||||
- [ ] Publish the release per `docs/RELEASING.md`.
|
||||
|
||||
Reference in new issue
Block a user