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

Rivers, lakes and oceans in one world

Build an entire hydrology: rivers that flow down terrain into lakes and out to the ocean, with authored blend materials at the seams instead of hard edges. Plus islands and exclusion volumes to carve water away.


Oceanology Pro treats water as placed actors rather than one ocean plane. A river, a lake, an ocean and a custom gameplay body are all subclasses of the same base water actor, they all register into a shared Water Zone, and they all render through one quadtree water mesh. A mountain stream that runs into a lake, drains out through a second river and finally meets the sea is therefore one continuous water surface with one set of queries behind it, not four disconnected systems you have to reconcile yourself.

The body types

  • River: an open spline down the middle of the channel. Every spline point carries its own River Width, Depth and Water Velocity Scalar curve, so a channel can widen, deepen and speed up along its length.
  • Lake: a closed-loop spline around the shore with water in the middle.
  • Ocean: rendered out to a far distance, with land carved out of it either by the ocean actor's own closed spline or by overlapping Island actors. The Shoreline Source switch defaults to Islands.
  • Custom: a spline down the middle that encodes gameplay data but renders with a mesh you supply through Water Mesh Override. It never affects the landscape.
  • Island: a brush-only actor. It raises terrain and doubles as the ocean's shoreline shape, and never renders water itself.
  • Water Exclusion Volume: a physics volume that removes a listed set of water bodies from queries and swimming inside its shape, or removes everything except that list.

One zone, one mesh

A Water Zone owns the tessellated water mesh and the Water Info texture array that every water material and every CPU query reads. Bodies register themselves to the zone whose bounds they overlap, and when zones overlap, a per-zone Overlap Priority decides which one claims the body. The mesh is a quadtree of tiles that collapses toward the horizon, and the zone can drive it either from the CPU quadtree or, through r.Oceanology.WaterMesh.GPUQuadTree, from a GPU-built quadtree with indirect draws. A JumpFlood distance field of the shoreline is computed in the same frame as the Water Info texture, which is what lets waves attenuate and break correctly as they reach land.

Where two bodies meet

River bodies carry two explicit transition materials, River to Lake and River to Ocean. When the quadtree finds a river tile adjacent to a lake or ocean tile it selects the transition material for that pair, and the water mesh builds a dedicated material instance for each exact river-and-target pair, so both sides' wave bindings and simulation parameters live in one shader. Those instances can be republished after a runtime parameter change without rebuilding the whole mesh.

One query API behind everything

Buoyancy, swimming, AI, Niagara and your own Blueprints all read water through the same call, Try Query Water Info Closest To World Location, with flags for exactly what you need: Compute Location, Compute Normal, Compute Velocity, Compute Depth, Compute Immersion Depth, Include Waves, Simple Waves and Ignore Exclusion Volumes. The result separates the flat water plane from the animated surface and carries wave height, maximum wave height, the shore attenuation factor, the surface normal, immersion depth, flow velocity, the spline key and whether the point sits inside an exclusion volume. Because there is one path, the surface a character swims on is the same surface a boat floats on and the same surface the renderer draws.

Compared with Oceanology NextGen

Oceanology NextGenOceanology Pro
Water body typesOcean and lake actorsOcean, lake, river, custom body, island and water exclusion volume
RiversTransition handling existed inside the quadtree, but no river body shipped to drive itFull spline river actor with per-point width, depth and velocity, plus authored river-to-lake and river-to-ocean transitions
Local fluid simulationNot presentNative shallow-water 2D solver actors with source, force and wave contributor components
Codebase35,583 lines of C++99,961 lines of C++
Water body typesRiver, Lake, Ocean, Custom
Water zone extent (default)51200 x 51200 cm
Water info render target512 x 512 on the component, 1024 x 1024 for newly placed zones
Water mesh tile size at LOD02400 cm
Tessellation factor6 (range 1 to 12)
Max water mesh dimension256 tiles per axis
Wave systems per bodyGerstner, Spectral Gerstner, FFT, plus breaking waves
FFT resolutions256, 512, 1024, 2048
Interaction ripple field1024 cells at 8 cm per cell, fixed 60 Hz

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