gap: you walk and drive straight through a level crossing #285

Merged
viberfox-agent merged 1 commit from fix/234-crossing-mast-colliders into main 2026-09-03 01:38:01 +00:00
Collaborator

Closes #234

Merged by the autopilot (docs/direction.md) after every Actions job passed on the branch head.

Closes #234 Merged by the autopilot (docs/direction.md) after every Actions job passed on the branch head.
fix(geo): make a level crossing's masts solid
All checks were successful
CI / test cartopolis (pull_request) Successful in 8m25s
CI / wasm & android targets (pull_request) Has been skipped
b11c098e74
A crossing's masts, lamp heads and raised bars were drawn and solid to
nothing: the avatar walked straight through an installation standing on a
street verge. Crossings are meshed into the furniture group but are never
`FurnitureInstance`s, and `CellPlaces::furniture`/`vehicles` were the only
two lists reaching `collision::sync_prop_colliders`, so a crossing reached
the collider index by no route at all.

The precedent the module note cited does not carry. A navigation mark gets
no collider because it stands on water the avatar cannot walk on — the same
reason `prop_radius` gives a moored boat zero, in as many words. A crossing
mast is 0.22 m square and 3.1 m tall standing `VERGE_M` = 0.5 m outside the
kerb of a street the avatar walks along: the lamp column's case, which the
same table gives 0.25 m for.

`crossings::mast_centres` publishes the two mast centres in tile-local
metres, and `push_crossing` now places its boxes off the same `Layout` and
through the same `furniture::place_ground` rotation, so there is one
derivation of `road_half + VERGE_M`, `clearance_m` and the object-to-tile
turn rather than two that can drift apart. A geo test reads the centres back
off the built mesh at four yaws — a yaw-0 check passes with the rotation's
sign flipped, which is the mistake `interiors`' door normals made twice.

The client takes them through a new bare-collider channel,
`CellPlaces::colliders`: solid and silent circles that reach `props()` and
can never become an `Interactable`, for the reason a lamp gets no prompt. A
`FurnitureKind` variant would have meant a mesh recipe nothing calls plus
three arms saying "never reached", and `BuildingColliders::set_feature_cell`
would have clobbered `street_detail`, which owns that key space on the same
z14 grid. Turning the Furniture layer off still removes them, with no new
gate: the crossings are only placed under `wants.furniture` and
`sync_prop_colliders` already clears props when the layer is off.

`ShotMetrics::prop_colliders` counts `WorldPlaces::props()`, because the
collider index is invisible to a capture — which is how a settled shot with
`level_crossings = 3` on screen photographed three installations nothing
could walk into. Read against `level_crossings` it separates "drawn" from
"solid" in a headless run.

Ambient traffic is unaffected: `systems::traffic` consults no collider at
all. The raised bar's inner 0.12 m stays uncovered — it starts 1.05 m off
the ground and these are height-free circles.

Refs #234
viberfox-agent deleted branch fix/234-crossing-mast-colliders 2026-09-03 01:38:01 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jeroen/cartopolis!285
No description provided.