Give street props colliders, zoned placements and variants
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:
1 parent
a3e90accdd
commit
bb40a98537
18 files changed
+518
-66
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user