Give street props colliders, zoned placements and variants
Full build / Full desktop build + optional release (push) Successful in 4m2s
Full build / Import + headless tests (push) Successful in 31s

Props were decoration: the guard and guests walked straight through benches,
bins, bollards and planters. They now block movement and steer guests around.

Collision
- _add_prop_model() fits a StaticBody3D from the model's mesh bounds in
  holder-local space: a cylinder for bollard/bin/hydrant, a box otherwise, so
  placement rotation and variant scale carry over.
- Fallback primitives go through the same fit, so a missing .glb cannot silently
  remove collision.
- Each prop also publishes a NavigationObstacle3D; NpcAvatar enables agent
  avoidance and moves with the safe velocity from velocity_computed. The navmesh
  stays a flat walkable plane and avoidance does the steering.

Placement
- PROP_PLACEMENTS groups furniture by entrance, mid-block and curb zones, with a
  static placement_problems() validator for bounds, overlap/min-spacing,
  duplicates, and the door/steps/guest-lane exclusions.
- variant_for(index) gives deterministic yaw jitter, subtle scale, and optional
  clutter (bag by the bin, crate by the newspaper boxes, cone by the hydrant).

Verification
- New windowed smoke_props.gd: guard walks into a bench and stops; a guest
  headed beyond the bench routes around it and never enters the collider.
- Headless 182 -> 187: placement validation and its failure modes, variant
  determinism/range, collider + obstacle on every placed prop, fallback collider.
- Other smokes (PLAN verbs, crowd, emergency, timeline) still pass; Python
  tooling 53/53; screenshots recaptured; compare 9 good / 0 bad.
- Version 0.4.0. TODO: collision/placement section moved to DONE; prop pipeline
  checks remain.
This commit is contained in:
zwitschi committed 2026-11-01 10:16:53 +01:00
1 parent a3e90accdd
commit bb40a98537
18 files changed
+518 -66

No files matched your search

+6 -35
View File
@@ -1,44 +1,15 @@
# TODO
Godot 4.3 prototype. Latest release **v0.3.3** (staged captures for the new screens). Headless
suite **182/182** plus **53** Python tooling tests; the session, PLAN-verb, crowd, emergency,
timeline, audio, scenario-content, and windowed focus/radial smokes pass. Anonymous downloads are
enabled on the host.
Godot 4.3 prototype. Latest release **v0.4.0** (prop collision, placement, variants). Headless
suite **187/187** plus **53** Python tooling tests; the session, PLAN-verb, crowd, emergency,
timeline, audio, scenario-content, props, and windowed focus/radial smokes pass. Anonymous
downloads are enabled on the host.
The three sections below are the planned presentation pass: props, NPC characters, and player
movement. Each task is meant to be a small, reviewable slice with its own verification.
The sections below are the rest of the presentation pass: prop pipeline checks, NPC characters,
and player movement. Each task is meant to be a small, reviewable slice with its own verification.
## Better Props
### Collision and placement
- [ ] Give every generated prop a real collider. Add a simple box/cylinder collision shape to the
`.glb` (or emit a `physics` block per part that `WorldBuilder` turns into a
`StaticBody3D`), so benches, bins, planters, hydrants, and newspaper boxes cannot be walked
through.
- [ ] Add a windowed check that the guard and NPCs path around props instead of through them, and
that the fallback primitive props get the same colliders as the modelled ones.
- [ ] Replace the hard-coded prop positions in `_build_street_detail()` with a placement table
(zone, offset, rotation, variant) so clusters read as street furniture: entrance pair,
curb line, mid-block, wall side. Assert no overlaps with the door, steps, or spawn lane.
- [ ] Reuse one `PackedScene` per prop type but expose deterministic variants (rotation, scale,
optional accessory such as a chain, sign, or bag) so repeated props stop looking cloned.
### New props and detail
- [ ] Add street-sign props: parking sign, no-parking sign, one-way sign, and a small post
(text via the atlas, not a texture per sign).
- [ ] Add a bus-stop shelter with a bench, roof, and side panel; a bike rack; a mailbox; and a
phone booth or newspaper stand.
- [ ] Add a traffic signal (pole, arm, three lenses) and a street lamp variant that matches the
lamps placed by `WorldBuilder`.
- [ ] Add cafe/shop clutter: sandwich board, stacked crates, café table + two chairs, and a tied
trash-bag pile for the Joke Shop edge.
- [ ] Detail the existing six props: chamfered edges on boxes, rim rings on bollard and bin,
bolts on the hydrant, bench slats with gaps, visible soil plus foliage on the planter.
- [ ] Add a close-range detail layer: pack a subtle grunge/AO strip into the atlas (or a shared
detail normal) so props do not read as flat-coloured boxes at conversation distance.
### Pipeline and checks
- [ ] Extend `audit_glb()` with a triangle budget, degenerate-triangle test, `TEXCOORD_0` inside