Consistent interaction outline, preview and prompt #158

Merged
sermuns merged 1 commit from consistent-interactions into main 2026-10-24 22:36:38 +00:00
Owner

Every object E can act on now wears the vehicle's mark, per #148:

  • Outline — targeted seat props and bus stops draw the same white back-face hull as a targeted vehicle. Props are merged static soups with no per-instance geometry, so each kind's model is shelled once at startup and the hull is instanced at the prop's baked placement through prop_placement — the same function the scene builder uses, so the stroke cannot drift off the solid.
  • Preview — standing at a seat shows the half-opacity body sitting on it, mirroring the vehicle's next-free-seat ghost.
  • Prompt — e: mount / e: sit / e: call shuttle floats above the targeted object through the existing world-label pipe.

The mark follows exactly what E would do: vehicle first, then the nearest seat in reach, then the bus stop; nothing is marked while riding, sitting (where E stands up), or flying.

  • SitSpot now names the prop carrying it and nearest_bus_stop returns the stop prop's index.
  • nearest_seat got a cheap distance pre-reject so the per-frame target pick costs nothing across the campus.
  • FrameState.interact carries the targeted prop to the renderer.

Tests: prop shell/placement/placement-agrees-with-bake (scene, render), spot-and-stop prop identity + reach pre-reject (sim), interact target builders (client), slot-order guard updated. Bump: 4.5.3 → 4.6.0 (minor).

closes #148

Every object `E` can act on now wears the vehicle's mark, per #148: - **Outline** — targeted seat props and bus stops draw the same white back-face hull as a targeted vehicle. Props are merged static soups with no per-instance geometry, so each kind's model is shelled once at startup and the hull is instanced at the prop's baked placement through `prop_placement` — the same function the scene builder uses, so the stroke cannot drift off the solid. - **Preview** — standing at a seat shows the half-opacity body sitting on it, mirroring the vehicle's next-free-seat ghost. - **Prompt** — `e: mount` / `e: sit` / `e: call shuttle` floats above the targeted object through the existing world-label pipe. The mark follows exactly what `E` would do: vehicle first, then the nearest seat in reach, then the bus stop; nothing is marked while riding, sitting (where `E` stands up), or flying. - `SitSpot` now names the prop carrying it and `nearest_bus_stop` returns the stop prop's index. - `nearest_seat` got a cheap distance pre-reject so the per-frame target pick costs nothing across the campus. - `FrameState.interact` carries the targeted prop to the renderer. Tests: prop shell/placement/placement-agrees-with-bake (scene, render), spot-and-stop prop identity + reach pre-reject (sim), interact target builders (client), slot-order guard updated. Bump: 4.5.3 → 4.6.0 (minor). closes #148
The vehicle stroke, mount preview and prompt were the only interaction
feedback. Seats and bus stops now share it: a white back-face hull around
the targeted prop, a half-opacity body preview on seats, and a floating
'e: mount' / 'e: sit' / 'e: call shuttle' label above the object.

- SitSpot names the prop carrying it and nearest_bus_stop returns the
  stop prop's index, so the client outlines exactly what E acts on.
- liuverse-scene authors prop_placement, shared by the bake and the
  renderer, so prop hulls cannot drift off their solids.
- FrameState.interact carries the targeted prop to the renderer.
- The mount stroke is suppressed while sitting, where E stands instead.

closes #148
sermuns force-pushed consistent-interactions from 3e5c2a1e58 to ce929d3a46 2026-10-24 22:36:32 +00:00 Compare
Sign in to join this conversation.
No description provided.