Skip to content

awake:scene:world

Open-world plumbing: cell coordinates, partitioning, streaming, and the floating origin.

Why it is its own module

It was a package in scene:scene-core, so every game linked cell streaming whether or not it streamed anything — and scene-core, the module holding Transform and Name, carried a coroutines dependency to serve it.

Five modules use it; twelve use scene-core. After the split scene-core is Transform, Name and the two systems that drive them — what every scene has, whatever it does — and this is what a world larger than memory needs on top.

The dependency runs one way. Partitioning reads positions and the floating origin rewrites them, so this needs the transform vocabulary; nothing in scene-core knows a cell exists.

The floating origin is the reason the rest exists

A world big enough to stream is big enough for Float to run out of precision far from the origin. FloatingOriginSystem shifts everything back toward zero when the camera wanders, which is why WorldOrigin is a value the whole engine reads rather than an implementation detail here — a physics backend has to rebase its bodies in the same frame, which is what PhysicsOriginShiftListener is for.

What it does not do

It has no opinion about what a cell contains. AsyncWorldCellStream loads and unloads by coordinate; a listener decides what that means — meshes in scene:scene3d, colliders in scene:physics, nav tiles in scene:navigation. That is why the listener is an interface and this module depends on none of them.