Skip to main content
← Roadmap
🏞️ RiverologyPlanned3.0.0

Spline rivers with flow physics

Draw a spline, set width, depth and velocity at each point, and the current becomes something gameplay can actually feel.


A river in Riverology is a spline. You place points, and the water between them is interpolated from values you set on each point. That authoring model is the same in Riverology 2 and in the Pro core Riverology 3 inherits, but the core carries a richer per-point channel set and, more importantly, it carries velocity as authored data rather than as one global speed dial for the whole river.

What you author per point

In the core, each spline point carries its own depth, river width, water velocity and audio intensity, stored as interpolated curves along the spline. Inserting a point between two existing ones lerps the metadata rather than resetting it, so refining a curve does not destroy the profile you already tuned. Each channel has its own in-viewport visualiser you can toggle independently, so you can inspect width without velocity arrows drawn over the top of it.

  • Depth: how deep the channel is at this point. Feeds the water info texture, wave attenuation in shallow water, and buoyancy.
  • River width: the width of the channel here. Drives the generated surface — the river component builds one spline mesh per spline point and evaluates width per key along it.
  • Water velocity: a current magnitude at this point, combined with the spline direction to produce a flow vector.
  • Audio intensity: a scalar so rapids can be loud and pools quiet without splitting one river into several actors.

What the current does to gameplay

Flow is not decoration. Buoyant objects in the core have a dedicated river behaviour block that reads water velocity and turns it into force, and every part of it is tunable per object.

  • A downstream push scaled by a velocity strength coefficient and clamped by a maximum water force, so a fast river does not launch light debris.
  • A lateral shore push that nudges objects toward the bank, or, with a negative factor, back toward the centre so nothing piles up on the edges. It operates inside a traversal path width you define.
  • Optional torque that aligns an object with the downstream direction, driven as a spring with configurable stiffness, damping and a per-update torque ceiling. That is what stops a log from riding a rapid sideways.
  • Switches for the awkward cases: always allow lateral push regardless of forward speed, and allow the current to keep acting on something moving fast upstream. Turn the second off for player-controlled boats so the player keeps authority.
  • A selectable pontoon index for sampling the water, so a long hull is not steered from the wrong end.

How velocity reaches everything else

Velocity is not queried object by object at runtime. The water zone renders a water info texture across the region, packing flow magnitude and direction, with magnitude normalised against a global ceiling exposed as a console variable. Materials, buoyancy and Niagara all read that one source, and a blur pass smooths the velocity field before anything consumes it. On the Niagara side, the water data interface returns water velocity together with surface position, water depth, plane normal and wave height at any point, which is what lets foam, spray and floating debris follow the current without bespoke plumbing per effect.

Flow authoring: Riverology 2 against the core

BeforeOceanology Pro
Width per pointTaken from the spline point's scaleAn explicit river width channel with its own visualiser
Depth per pointTaken from the spline point's scaleAn explicit depth channel, default 150
Velocity per pointNo per-point channel; flow follows the spline direction with globally tuned speed parametersA per-point velocity scalar, default 128
Surface geometrySpline meshes generated at a fixed segment length you setOne spline mesh per spline point, width evaluated per key
Audio along the riverAudio cue assets with no per-point intensity channelA per-point audio intensity channel on the spline
Buoyancy tuningAutomatic downstream force; tuning limited to the object's own physics settingsA river behaviour block with push, shore push, alignment torque and upstream rules

Defaults and limits

Default depth per spline point150 units
Default river width per spline point2048 units
Default water velocity per spline point128 units per second
Default audio intensity per spline point1.0
Maximum velocity encoded in the water info texture1024 units per second, adjustable by console variable
Velocity blur radius in the water info pass1 by default, range 0 to 16
River traversal path width, buoyancy300 units
Maximum river push force, buoyancy10000, with shore push capped at 300
Downstream alignment defaultsStrength 0.05, stiffness 20, damping 5, maximum acceleration 10
Riverology 2 debug toolsUnscaled spline width 75, plus spline width, per-point string and surface entry/exit debug draws

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