← Development journal

/ 3 min read

The ride over the world

Ioma now rides on the generated world. The dunes she gallops down at the start, the flat track under the hooves, the boulders and the dead trees are where they were, but the ground under them is the first tile of a 16 by 8 km country that tools/world_gen.py writes from art/world/lowwater/world.json. Keep riding north and the next tiles load in around her.

Before: the ride's own dune function, 4.6 s into the opening

After: the same moment over the generated world

What changed under her

  • One height query. Everything that touches the ground (the props, the survey map, the prints, the hooves and her feet) asks Ground::HeightCm. It reads the world's tiles, decoded once at start with the dune ripple evaluated per sample where the generator's amplitude mask says, and interpolates them exactly as the tile meshes are drawn, so what she stands on is what you see. The old dune function is still there behind -LwSet=World=, and it is the fallback when a world fails to load.
  • Tiles, streamed. Each 512 m tile is a Nanite mesh built by build_ride.py from the generator's 16-bit heights, with a coarse horizon piece under each one that shows only while the tile is not loaded. Three tiles each way stay loaded around whoever moves. The generator's rocks and trees are placed per tile; within 900 m of the start they are also obstacles for the sim and marks on the survey.
  • The survey map draws the world. The minimap's contours come from the generated heights now (bottom pair of the board, 11.5 s), so it will be right wherever she rides.

The survey map over the world's contours, 11.5 s

What did not change

The look. The spec's gate for this step was four shots of the opening at fixed times, before and after, on one board, and the user kept it. Light, haze, exposure, the sky band, the ground colour and the ripples under her match. The horizon is different in shape: the old function drew tall mesas with a peak at the left, the draft's three ridges give a lower, more continuous wall. That is a note for the next round of the definition, not the look.

One thing nearly slipped through. The first set of after-shots came out darker and thinner across the whole frame. The cause was the scene's zero: the world's ground at the start sits 21 m above where the old dunes sat, and the height fog that hugs the ground thinned around the camera. The start place's ground height is now the scene's zero in the query and in every world mesh, and the second set matched.

For the agent

The behaviour traces are re-recorded with the world on. The import step (LW_ONLY=world) is incremental by tile hash and finishes the engine's distance fields at import, so a game run never shows "Preparing Mesh Distance Fields". Next: the detached camera, places to go to and vantages to save (increment 3), then the vantage board.

Lowwater is in development. These notes capture the game at the time of writing; plans and visuals may change.

More from the making of Lowwater.

Follow along ↗