Skip to main content
← Roadmap
🌊 Oceanology ProIn Progress6.0.0

Included in Oceanology Pro and Oceanology Lite.

Shallow water fluid simulation

Place a simulation actor over a river, lake or beach and the water becomes real fluid: it flows downhill, pools behind obstacles, and reacts to the actual terrain underneath instead of a flat plane.


A real fluid solver you place in the level. Drop an Oceanology Shallow Water Simulation actor, size its box over a river mouth, a harbour, a flooded street or a lake, and the water inside it stops being an animated surface and becomes a column of water with mass and momentum. It flows downhill, piles up against geometry, drains, floods, and dries out. By default the actor discovers every eligible water body overlapping its bounds, so the normal workflow really is place it, size it, press Start.

The solver

It integrates the 2D shallow water equations conservatively on the GPU: a finite-volume scheme with hydrostatic reconstruction at cell faces and a Rusanov flux. That combination is what makes it well balanced, so a lake at rest stays exactly at rest instead of slowly boiling, and a wet front can advance onto dry cells and retreat again without leaking mass every time it moves. Foam is carried as transported mass rather than painted on top. Each numerical substep costs two dispatches, height then momentum, and the substep count is chosen from a Courant condition every update, so refining the grid does not quietly destabilise the simulation. A GPU volume probe can reduce the whole domain to total wet volume and wet-cell count for readback, which is the instrument used to prove the transport scheme actually conserves mass instead of trusting that it looks right.

What feeds it

  • Authored water. The solver seeds and boundary-relaxes against Water Info, the same surface height, depth and flow the renderer uses, so the simulated patch matches the water around it. Its four outer faces exchange with an undisturbed reservoir at the decoded rest depth rather than behaving like a sealed tank.
  • Terrain. Static and stationary rendered primitives are captured once into a private bottom contour, so a rotated rock or an irregular mesh is real geometry to the fluid, not a bounding box. Movable primitives are deliberately excluded: a moving object should inject an impulse, not rebuild the river bed and reset every cell.
  • River splines. Each river's ends automatically become source and sink boundary regions with their own depth and velocity relaxation rates and a continuous surface wave, so a river genuinely carries water through the domain instead of sloshing in place.
  • Moving objects. A budgeted physics broad phase, ten updates per second by default, reduces each overlapping actor to one bounded interaction: displacement from its submerged bounds, a wake from its relative velocity, foam when it is fast and substantially submerged. No tags, no scene captures, no per-object tick.
  • Authored hydraulic features. Placed sources, forces and waves, covered on the whirlpools, drains, springs and currents page.

It drives gameplay, not just pixels

The live solver publishes a decimated, asynchronous copy of the surface to gameplay queries and buoyancy: depth, height and horizontal velocity per cell. A raft in a simulated current is carried by it, and a query outside the captured water reports Uncovered rather than guessing at a surface. The readback never stalls the render thread and is rate limited. Baked regions serve the same query API from a deterministic CPU snapshot instead.

Oceanology NextGenOceanology Pro
Local fluid behaviourNone. Water height came from the wave sources; the only surface disturbance available was the experimental Niagara ripple volumePlaced regions running a conservative GPU shallow water solver with terrain, sources, sinks, momentum and wetting/drying
Terrain couplingLandscape depth read through the Water Info textureA private bottom-contour capture of static and stationary rendered geometry, refreshed only when you ask for it
River flowSpline flow authored into the materialSpline ends become real hydraulic source and sink boundary conditions feeding the solver
Gameplay couplingBuoyancy and queries sampled the analytic wave surfaceBuoyancy and queries can additionally sample the solved depth, height and velocity field, live or baked, with explicit coverage
Simulation modesFixed Bounds, which preserves one hydrological volume, or Follow Water Info, a window that migrates with the view for infinite oceans
Update rate15 to 240 Hz, default 60, with up to 4 fixed updates consumed per rendered frame
SubsteppingCourant number 0.1 to 0.45 (default 0.45), up to 16 substeps, and a hard ceiling of 64 integration dispatches per frame that dilates time instead of building a catch-up backlog
GridCoupled to the Water Info texture by default, or an explicit cell size with a 128 to 2048 cell window; fixed regions derive both axes from their authored size, capped at 2048
VRAM budget48 MiB per simulation by default (16 to 512), plus a shared world budget of 256 MiB across all loaded live simulations
Physics defaultsGravity 980 cm/s^2, velocity damping 0.12, bottom friction 4, dry depth 2 cm, maximum velocity 3000 cm/s, maximum surface rise 2000 cm
Open boundaryAn 8-texel sponge restoring the authored water height and flow at the region edge
Terrain captureUp to 512 primitives, 10000 cm vertical search depth, with explicit actor, actor-tag and component-tag overrides taking priority
Impulse slots16 per solver dispatch, shared between automatic wakes (12 by default), placed content and explicit gameplay hits
Regions per materialUp to 8 loaded regional outputs published to a single water material
Live physics readback1 to 30 Hz (default 12), long axis 32 to 256 cells (default 128), aspect preserved
Performance gatesPauses GPU updates while none of its water is rendered, after a configurable visibility grace period

This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.