Skip to content

tfRiver

tfRiver lets the user create river beds on the terrain.


Untitled

Streams tab default menu settings.

Any number of rivers can be created inside a node tree GUI, with dedicated parameters for each of them.

There are three types of rivers available, categorized into ‘Main’ and ‘Secondary’ rivers from this drop-down menu: Main: Settle Spline, Main: Perlin Worm and Secondary: Simple Distribute.

Main rivers can be art directed, and offer an awful lot of control, while secondary rivers are generated on top of the main rivers (like twigs on a tree’s branches), and offer only few parameters.

This approach lets you control the course of the river using a simple spline; the spline can be as detailed or simplistic as you choose.

Iteratively, the spline is resampled, and its points slide downhill, thus settling in valleys and ravines.

The original spline remains untouched and can be edited at any time.

tfRiver_Main_Settle Spline_v02.png

The Main: Settle Spline stream type, with the original spline on the left.

This approach provides a simpler and more simulated workflow.

Define a start point (spring) and an end point by dragging around viewport handles and let the river grow between them.

Perlin worms are commonly used in gaming (e.g. Minecraft), where they are grown to generate rivers and caves.

To grow a river from a spring to an end point, the user can set some simple parameters.

A single particle is then simulated, starting from the spring and moving towards the end points, while respecting a set of rules.

tfRiver_Main_Perlin Worm_v01.png

The Main: Perlin Worm stream type, with start and end points highlighted.

tfRiver can also suggest suitable spring and end points; an algorithm finds suitable pairs of a spring and an end point each, to grow a river between by analyzing the input terrain’s local maxima (mountains) and minima (valleys) and then filtering those.

Multiple secondary rivers are generated, branching from their parent river (which can be a main river or another secondary river node).

The secondary rivers are distributed like twigs on a tree branch; their distribution can be controlled with a Spline curve and there are multiple parameters for length, shape and variation.

tfRiver_Secondary Rivers_v01.png

Secondary: Simple Distribute stream type, branching (shown with dots) in several places from the Main: Perlin Worm.

Node tree list of the streams you have populated your scene with.

This is a hierarchical list, with order being important to the results.

A green tick next to the stream signifies that this stream is enabled.

You can disable the tick, by clicking on it, which changes it into a red cross.

Clicking this button will create a river material layer, which will automatically be applied to all rivers in your Streams list.

This material layer will contain an Advanced Terrain Shader with a minimal layer setup.

For further information on detailed customization, see the Advanced Terrain Shader page, at the link below.

Advanced Terrain Shader

tfRiver_Create River Material_v01.png

The Add River Layer has been activated here and applied automatically to the river.

This material is placed next to tfTerrain in your Objects Manager and can be amended with the usual Cinema 4D methods.

Clicking this button will simply export the points of any river that you have created, as a segmented spline.

This will then be placed as a child of tfTerrain, in your objects manager, as tfRiverExport.

tfRiver_Export Rivers_Spline_v01.png

With Export Rivers having been clicked, this image shows the tfRiverExport (explained in a standalone page) User Interface (UI), with the Mode setting as Spline.

tfRiver_Export Rivers_Geometry_v01.png

Here, the Mode has been changed to the other setting of Geometry.


Link a spline here to use it as a template for the river.

This controls how deep the river cuts into the terrain.

Unfold the drop-down arrow to reveal a spline curve that controls the depth along the length of the river.

tfRiver_Settle_Depth_01.png

Depth setting of 8.

tfRiver_Settle_Depth_02.png

Here, the Depth is increased to 30.

tfRiver_Settle_Depth_Curve_v03.png

tfRiver_Settle_Depth_Curve_v01.png

tfRiver_Settle_Depth_Curve_v04.png

In these three images, three different Depth Curve spline settings are driving the depth along the length of the rivers.

This controls the maximum width of the river.

Unfold the drop-down arrow to reveal a spline curve that controls the width along the length of the river.

tfRiver_Width_v01.png

Here, a Width value of 20% is shown.

tfRiver_Width_v02.png

In this image, the Width is increased to 85%.

tfRiver_Width_Curve_v01.png

An ‘ease-ease up’ Width Curve spline setting driving the width along the length of the river.

tfRiver_Width_Curve_v02.png

In this image the Width Curve has a full strength spline, giving a consistent length.

tfRiver_Width_Curve_v03.png

Finally, an ‘inverse’ spline, gives this different look at the river length.

These parameters control the river path.

The number of iterations to compute.

With each iteration, the spline points are settled downhill by Step Size.

Unfolding the drop-down arrow will reveal three additional attributes.

The distance (in Terrain Grid UV units) by which the spline points are moved downhill during each iteration.

Increasing this value will effectively use a downscaled version of the input terrain grid for the Main: Settle Spline stream computations.

The greater the value, the less that insignificant details will be considered.

Use this attribute to apply additional blur to the down-sampled grid.

Increase this value to have the river path more affected by a noise field.

tfRiver_Growth_Noise_v02.png

A Noise value of 5%.

tfRiver_Growth_Noise_v01.png

Here, the Noise has been increased to 70%.

Unfold the drop-down arrow to reveal two additional parameters.

The random start value.

Each change in value will result in a completely different noise result.

Scales the noise.

Larger values will make the river wind more smoothly.

tfRiver_Growth_Noise_Scale_v01.png

A 5% Scale setting.

tfRiver_Growth_Noise_Scale_v02.png

Scale raised to 50%.

These attributes will tweak the look of the river path.

This attribute controls the point density of the river (applied in the resampling stage after each iteration).

Larger values will make sharp bends smoother but also generally create more points for details.

Increase this attribute to smooth out unwanted sharp bends in the river.


This controls how deep the river cuts into the terrain.

Unfold the drop-down arrow to reveal a spline curve that controls the depth along the length of the river.

This controls the maximum width of the river.

Unfold the drop-down arrow to reveal a spline curve that controls the width along the length of the river.

On its way from the start towards the convergence point, a Perlin Worm evaluates certain rules to decide where to move next.

The intensity of each rule’s effect is controlled using these weights.

As is so often the case with simulations, slight changes to the parameters can have a big effect.

Defines how much the worm will try to keep its current direction.

tfRiver_Perlin_Intertia_v01.png

Inertia set at 3% with the Main: Perlin Worm stream.

tfRiver_Perlin_Intertia_v02.png

Inertia raised to 95%.

Defines how much the worm is affected by the Perlin noise.

Unfold the drop-down arrow to reveal four additional parameters.

tfRiver_Perlin_Noise_v01.png

Here, the Noise setting is at only 5%.

tfRiver_Perlin_Noise_v02.png

And here, it has been increased to 95%.

Random start value.

Each value will result in a completely different noise result.

Moves the Perlin noise in each axis, creating different variations.

Scales the noise.

Larger values will make the river wind more smoothly.

tfRiver_Perlin_Noise_Scale_v02.png

Scale value of 10%.

tfRiver_Perlin_Noise_Scale_v01.png

With the Scale raised to 60%, the river winds in a smoother pattern.

This limits the deviation that noise causes.

tfRiver_Perlin_Noise_Max Deviation_v01.png

Here, there is a Max Deviation, from the noise, of 40%.

tfRiver_Perlin_Noise_Max Deviation_v02.png

Lowered to only 10%, in this image.

Controls how much the worm will want to move downhill.

Unfold this drop-down arrow to reveal an additional parameter.

tfRiver_Perlin_Slope_v01.png

There is no Slope value in this image.

tfRiver_Perlin_Slope_v02.png

Showing a clear difference, when the Slope value is raised to 100%.

Down-sample the grid used for sampling slope values.

Effectively, increasing this value will make the Perlin Worm react less to smaller terrain details.

Controls how strongly the worm is attracted by the river end point.

Set as Stop, by default, this set what will happen when the Perlin Worm encounters a terrain boundary.

The alternative is None.

Nothing happens, the worm just keeps on growing in that direction.

The worm stops growing at the terrain boundary.


Use these attributes to tweak the look of the river path.

The maximum number of steps the Perlin Worm is simulated for.

The actual number of resulting steps may be lower if the particle reaches its end point earlier.

The distance (in Terrain Grid UV units) by which the spline points are moved downhill during each iteration.

Lower values will result in a more detailed river path.

Increase this attribute to smooth out unwanted sharp bends in the river.

If your Perlin Worm river has too many unwanted, sharp bends or tends to kink in some places, carefully use this parameter to get rid if those issues.


tfRiver_Perlin_Secondary_v01.png

In this image, the Main: Perlin Worm stream is visible.

tfRiver_Perlin_Secondary_v02.png

Here, the Secondary: Simple Distribute stream (marked with dots) has been enabled, adding it to the Main: Perlin Worm.

The number of secondary rivers that are branched from the parent river.

By default, the secondary rivers will be distributed evenly along the parent river.

Unfold to reveal the following, three additional distribution parameters.

tfRiver_Perlin_Secondary_Count_v02.png

There are 12 secondary rivers here, driven by the Count setting.

Applies randomness to the otherwise regular distribution of secondary rivers along the parent river.

The random start value for Distribution Variation.

Each possible value will create a different distribution result.

This curve gives you direct manual control about the distribution.

A multiplicator that controls each secondary river’s width, relative to the parent river’s width at the branching point.

tfRiver_Perlin_Secondary_Relative Width_v01.png

In this image, the Relative Width is 20% of the parent river’s width at the branching point.

tfRiver_Perlin_Secondary_Relative Width_v02.png

Here, it has been raised to 75%.

The number of points used for each branching, secondary river.

The random start value for all river paths.

Each possible value will create a totally different result.

Set as Alternating, by default, this controls the direction of secondary rivers, branching from the parent river.

The other options are: Same and Random.

tfRiver_Perlin_Secondary_Branching Direction_Alternating_v01.png

Branching Direction is set as Alternating.

tfRiver_Perlin_Secondary_Branching Direction_Same_v01.png

Here, the Branching Direction is Same, with all secondary rivers branching off at the same side.

tfRiver_Perlin_Secondary_Branching Direction_Random_v01.png

This final setting is Random, giving a random, natural look.

Controls the angle of the branching secondary river, from the parent river.

tfRiver_Perlin_Secondary_Branching Angle_v02.png

Branching Angle of 40 degrees.

tfRiver_Perlin_Secondary_Branching Angle_v01.png

Here it is raised to 90 degrees.

tfRiver_Perlin_Secondary_Branching Angle_v03.png

The Branching Angle is now 120 degrees, in this image.

Unfold the drop-down arrow to reveal another parameter.

Applies randomness to each secondary river’s branching angle.

tfRiver_Perlin_Secondary_Branching Angle_Variation_v01.png

There is no variation to the Branching Angle settings, in this image.

tfRiver_Perlin_Secondary_Branching Angle_Variation_v02.png

Here, the Variation is 55%, giving a more natural, organic look.

Controls the length of the secondary rivers.

Unfold to reveal two other parameters.

tfRiver_Perlin_Secondary_Length_v01.png

A Length setting of 15%.

tfRiver_Perlin_Secondary_Length_v02.png

With the Length setting raised to 35%.

Applies randomness to each secondary river’s length.

tfRiver_Perlin_Secondary_Length_Variation_v01.png

There is no variation to the Length settings here.

tfRiver_Perlin_Secondary_Length_Variation_v02.png

In this image, a Variation of 50% gives a more organic look to the lengths of the secondary streams.

Controls the secondary river’s length, based on their branching position along the parent river.

tfRiver_Perlin_Secondary_Length_Curve_v01.png

A full strength spline is driving this Curve setting.

tfRiver_Perlin_Secondary_Length_Curve_v02.png

This Curve is driven by the linear spline.

Controls the effect of a noise on the secondary rivers’ paths.

Unfold the drop-down arrow to reveal another parameter.

tfRiver_Perlin_Secondary_Length_Noise_v01.png

A Noise value of 25%.

tfRiver_Perlin_Secondary_Length_Noise_v02.png

The Noise is raised to 90%, here.

Scales the noise.

Larger values will make the secondary rivers wind more smoothly.

tfRiver_Perlin_Secondary_Length_Noise_Scale_v01.png

The Scale setting is 20%, in this image.

tfRiver_Perlin_Secondary_Length_Noise_Scale_v02.png

It has been raised to 50% here, smoothing out the wind of the secondary rivers.


Untitled

Deform tab menu settings.

Moves the river points according to a Noise field.

The intensity of the noise effect.

tfRiver_Deform_Noise_Strength_v01.png

There is 0 (zero) % Strength to the noise, in this image.

tfRiver_Deform_Noise_Strength_v02.png

A noise Strength value of 100%.

Scales the noise field.

tfRiver_Deform_Noise_Scale_v01.png

The Scale of the noise set at 15%.

tfRiver_Deform_Noise_Scale_v02.png

Doubled to 30%, in this image.

Random start value.

Each different value gives a totally different result.

Moves the river points away from the path using a sine function.

The intensity of the wiggle effect.

tfRiver_Deform_Wiggle_Strength_v01.png

Here, there is no wiggle Strength set.

tfRiver_Deform_Wiggle_Strength_v02.png

Strength raised to 20%, giving a wiggle effect.

Scales the sine curve.

tfRiver_Deform_Wiggle_Scale_v01.png

Wiggle Scale setting of 15%.

tfRiver_Deform_Wiggle_Scale_v02.png

Increased to 42%, in this image.

Moves the sine along the river path.

Increase this to filter out sharp bends from the river path.


Each main river node has this group of parameters.

They control how the altitude of the river path points is computed, after the river path (which is only 2D) has been generated.

The user can choose between different modes of applying altitude to the river points.

Set as Downhill Flow, by default.

The alternatives are: None and Project on Terrain.

The original altitude of the points is retained.

Useful for rivers in rather flat landscapes, if they don’t need to flow down mountains in an obvious manner.

This will simply inherit the altitude from the underlying terrain.

Less suitable for realistic rivers, but can be useful to create paths and walkways.

tfRiver_Altitude_Project_v01.png

With a Mode of Project on Terrain, the altitude is inherited from the underlying terrain.

The most realistic way of calculating the altitude of river points, is to allow a downhill path only.

If the terrain under the river is going downhill along the river flow direction, the river will follow the terrain slope.

However, if the terrain goes uphill, the river will keep a steady decline, thus cutting into the ground.

There are two additional parameters available for this mode.

tfRiver_Altitude_Downhill_v01.png

The Mode is Downhill Flow, here, with the river altitude following the terrain slope.

Each successive river point will by moved downwards by at least this distance.

tfRiver_Altitude_Downhill_Min Slope_v01.png

A Min Slope setting of 0.001 gives little change.

tfRiver_Altitude_Downhill_Min Slope_v02.png

Increased to 0.5, there is a definite difference in altitude.

Set as Auto, by default.

The other options are: Forward and Reverse.

The river flows downhill from its start or end point, depending on which is higher.

The river flows downhill from its start point.

tfRiver_Altitude_Downhill_Forward_v01.png

A Downhill Mode setting of Forward.

The river flows downhill, in reverse, from its end point.

tfRiver_Altitude_Downhill_Reverse_v01.png

Here, the Downhill Mode is Reverse.


Untitled

Render tab menu settings.

To bring river path data to the terrain grid, a custom 2D rasterizer was developed.

This allows rendering the river data with precise altitude information and can even render UV-mapped structures along the paths.

During rasterizing, tfRiver renders multiple passes of the river data into separate maps and then composites them together, to form the final output terrain.

Most of these passes are available as custom output maps.

This stage also defines the profile of the river bed, which can be defined using a custom spline curve.

There are several other parameters to tweak the rendering stage with.

How river paths and altitude data are rendered to the terrain grid.

This curve defines the cross-sectional profile of the river bed.

tfRiver_Render_Proile Curve_v02.png

The default, linear profile.

tfRiver_Render_Proile Curve_v01.png

This is a user created profile, causing steep drops from the edge to the river bed.

tfRiver_Render_Proile Curve_v03.png

The root spline preset here results in a crevasse.

If you experience artefacts in the rasterized river, increase this to subdivide the rasterizer geometry.

Keep as low as possible but as high as necessary.

Feathers the start of the river; increase for a softer river start.

Feathers the end of the river; increase for a softer river end.

tfRiver_Render_Feather_v01.png

No Feather Start or Feather End value.

tfRiver_Render_Feather_v02.png

Here, the Feather Start and Feather End values are both 100%

Softens the slope gradient of the river cutting into the terrain.

tfRiver_Render_Soft Slope_v01.png

With Soft Slope disabled.

tfRiver_Render_Soft Slope_v02.png

Soft Slope is enabled here, giving a softer look to the edge and gradient.

Softens the rendered river mask.

Noise can be applied to the river edges, to simulate the look of washed out canyons or eroded influx streams.

Controls the intensity of the noise effect.

tfRiver_Render_Edge Noise_Strength_v01.png

0 (zero) % Strength value to the edge noise.

tfRiver_Render_Edge Noise_Strength_v02.png

The Strength has been raised to 35%, in this image.

Applies a variation to the Strength levels along the river path.

Scales the noise.

Controls the ratio of noise stretching along river U and V.

Effectively, lower values give the look of washed out terraces, while greater values result in eroded influx streams.


tfRiver, like many other operators, offers custom output maps for use in the Terrain Operator Shader.

There are dedicated outputs for river altitude, river mask, and relative river slope, all in the Preview tab.

Using the latter, the user can e.g. create rapids and waterfalls on steeper slopes.

A by-product of the altitude calculations is the River Slope map, which encodes the normalized slope of all river points; areas with brighter points would be good locations for rapids or waterfalls.


Copyright © 2026 INSYDIUM LTD. All rights reserved.