2026-10-04 · release · generated

Pinionfall v2026.10.04

v2026.10.04 vercel-0208e5c4

The sea, reworked end to end: an FFT wind sea on a world-locked mesh, simulated ripples and foam, surf that wets the sand, one sea for everything that touches water, and a faster boot.

What changed

This release is the sea. Pinionfall’s water was a projected grid of analytic waves with per-pixel noise for the detail: good at a distance, thin up close, and drawn by a surface that nothing else in the engine quite agreed with. The rework replaces it end to end, and every part of it ships on by default.

A wind sea on a world-locked mesh

The waves are now a wind sea synthesised by FFT from a JONSWAP spectrum on two cascades, carrying the two long swells of the old table and replacing its seven chop bands. The mesh is a world-locked clipmap that moves with the camera in whole tiles, so the sea no longer crawls or pops as you fly over it, and it holds the displaced crests above and below the surface with one depth-writing pipeline; the underside is no longer sorted. Up close, the surface detail comes from the same cascades through anisotropic sampling, so grazing views stay sharp without the far-sea flicker.

Water that reacts

Two simulations run on a clipmap around the camera. A ripple field carries wakes, splashes and rain rings; its forcing conserves volume, so a storm or a swimmer no longer sinks the sea around them. A foam field has its own flow: bodies stir it and part it, breaking crests lay it in clumps, and it drifts down the wind and thins. The foam is drawn from baked pattern textures (froth, lace, a shore lace, a wind-combed trail for old foam and bubbles for the close view) as films with their own relief, and fresh foam lightens the water under it.

The shore

Every body with a coast gets a baked coast atlas and a shore clipmap: the signed distance to the coast, the depth, the slope. On that the surf is simulated: bores run up the beach, strand their foam on the sand and slide back with the backwash, and the water turns turbid where the bottom is stirred. The wet line is no longer a model of where the water might be: the sea mesh is rasterised a second time, top down, into a record that the sand reads, so the wet band starts exactly at the drawn edge, keeps the recent high-water mark and dries by time.

One sea for everything

Everything that used to measure the old analytic surface now measures the drawn one: the terrain’s underwater shading and caustics, the ambient occlusion fade, the rain’s wet look, lightning and glass, the particles, the underwater light shafts, and the things that float, land and splash. Reflections come from a screen-space march with a depth pyramid, a cloud reflection cube and a calm-water mirror march, with sun glints and a roughness that follows the unresolved waves at range.

Faster, and faster to start

The boot used to compile the water shader three times (and the old shader once more) before the sea settled; now it compiles once, for the mesh that draws, and the sea is final on the first frame. The shader itself is leaner, about a tenth off the water pass at 4K in our measurements, the water’s main-thread work per frame is a fifth of what it was, and the old grid, its sort and its noise cascade are no longer allocated unless asked for. The previous water still boots with ?water1 for a side by side, and under ?diag every part of the new one has a console lever.

Updating

Terminal window
git pull
npm ci
npm run setup:assets

Every asset bundle changed (23894.0 MB in total), so npm run setup:assets downloads and re-extracts all 6.

It also deletes the 6389 asset files that earlier releases shipped and this one retired, but only while their contents are exactly what a release shipped: files you edited or added are never touched.

The town bundles are re-baked (TOWN_GEN_VERSION 16 to 21); town data a browser cached from an older version is replaced on first load.

The physics build is unchanged (WASM 9ef2827b, parry v0.30.2, rapier v0.35.3).

Documentation

These pages are built from engine files that changed in this release:

The third-party notices changed (THIRD-PARTY-NOTICES.md).

Roadmap

Planned: Terrain density rework, Save safety, Quest and companion polish, Intro robustness, The Lost Origin, Cross-planet quests, NPC archers and casters, Child NPCs, Multi-slot saves, Spells v2 and Music and lore affinity.

Highlights in this release

← all posts