engine v5.1.5
Engine v5.1.5
June 23, 2026
A patch in the Connection line.
what's new
- Bloom is now much more performant.
- Finished combat effects are cleaned up correctly in multiplayer games instead of accumulating and slowing the room down.
- Custom event listeners and sound-finished hooks now work on player-owned and shared-room objects.
- Visiting players can interact with and drive hosted vehicles with the correct mounted state and follow camera, without the room rejecting the handoff as
not_simulator. - Games on Retina displays are faster.
- Shadows are cheaper for inactive lights.
- Custom paired controls now follow the order you write them, so reversing a pair reliably reverses the control.
›technical notes
- Replaced Three.js BloomNode with a fixed-topology Dual Kawase bloom pyramid, reducing bloom render passes from 12 to 9 while preserving live strength, radius, and threshold controls.
- Moved runtime FX reaping onto each entity's active simulator so client-auth owners and place hosts publish completed-effect deletes through the normal state-delta lane.
- Moved
onSoundEndtracking and dispatch onto the active simulator instead of the server replica. - Added server-sequenced, place-scoped custom-event fanout so client-auth simulators can invoke their local
api.onsubscriptions. - Made vehicle/control handoffs server-canonical, with two-phase A→B switching that uploads the old target's
onControlEndcleanup before the server atomically grants the new target and runsonControlBeginon its simulator. - Fixed severe WebGPU frame-presentation stalls by avoiding 4x scene MSAA on Retina DPR-2 displays, where native pixel density already supplies edge smoothing.
- Skipped PCF filtering and transmitted-color texture sampling for resident shadow lights whose runtime intensity is zero, while preserving stable lighting pipelines.
- BREAKING: Changed keyboard axis polarity from a hidden key-name lookup to positional negative/positive pairs.
input-config.tsnow assigns alternating -1/+1 scales to slash-separated keys, so arbitrary pairs such asf/rbehave predictably and reversing the string reverses the axis.
›migration notes
Reorder every multi-key inputs.axes.*.keys binding into explicit negative/positive pairs. The first key in each pair now produces -1 and the second produces +1, regardless of the key names.
Replace forward/back bindings such as { keys: "w/s" } with { keys: "s/w" }, and { keys: "ArrowUp/ArrowDown" } with { keys: "ArrowDown/ArrowUp" }. Existing negative/positive bindings such as { keys: "a/d" }, { keys: "q/e" }, and { keys: "a/d/ArrowLeft/ArrowRight" } do not need changes. For arbitrary controls, order each pair by meaning; for example { keys: "f/r" } means F = -1 and R = +1. A single-key axis still produces +1.