Skip to content

Documentation / scene / WaterInteraction

Class: WaterInteraction

Defined in: libs/scene/src/render/water_interaction.ts:588

A local, dynamic height field layered on top of a water surface, driven by things that touch it.

The wave generator gives the surface its ambient motion and knows nothing about what is in the water. This adds what it cannot: a ring spreading from a dropped stone, the wake behind a hull, the slap of a foot. It is a 2D wave equation integrated on a square window of texels aligned to the world, and the water material adds its height and slope to whatever the generator produced, so the ambient sea and the disturbances compose.

The window follows a focus point - the camera by default - and covers windowSize metres at resolution texels. Its origin is snapped to the texel grid, so moving it is an integer shift of the field rather than a resample, and nothing smears. What scrolls in is still water.

The scheme is explicit and needs waveSpeed * dt / texel to stay under the CFL bound; the setters clamp waveSpeed to what the current window allows, so the field cannot be driven unstable from the outside. A sponge band inside the window's edge absorbs outgoing waves so they do not reflect back off the window boundary, which is a boundary of the simulation and not of the water.

Attach it with Water.interaction. Steps run in Water.update on the water's own clock, so pausing the water pauses this too.

Extends

  • Disposable

Constructors

Constructor

new WaterInteraction(): WaterInteraction

Defined in: libs/scene/src/render/water_interaction.ts:634

Creates a water interaction field.

Returns

WaterInteraction

Overrides

Disposable.constructor

Accessors

disposed

Get Signature

get disposed(): boolean

Defined in: libs/base/dist/index.d.ts:6107

Returns

boolean

Inherited from

Disposable.disposed


resolution

Get Signature

get resolution(): number

Defined in: libs/scene/src/render/water_interaction.ts:708

Texels along each side of the window. The texel size in metres is windowSize over this.

Changing it discards the field.

Returns

number

Set Signature

set resolution(val): void

Defined in: libs/scene/src/render/water_interaction.ts:711

Parameters
val

number

Returns

void


windowSize

Get Signature

get windowSize(): number

Defined in: libs/scene/src/render/water_interaction.ts:724

Side of the window in metres.

Changing it discards the field.

Returns

number

Set Signature

set windowSize(val): void

Defined in: libs/scene/src/render/water_interaction.ts:727

Parameters
val

number

Returns

void


texelSize

Get Signature

get texelSize(): number

Defined in: libs/scene/src/render/water_interaction.ts:736

Size of one texel in metres.

Returns

number


waveSpeed

Get Signature

get waveSpeed(): number

Defined in: libs/scene/src/render/water_interaction.ts:747

Speed disturbances spread at, in metres per second.

Capillary ripples run at well under a metre per second, a boat's wake at a few. Clamped to what the explicit scheme can integrate stably on the current texel size: raising resolution or shrinking windowSize lowers that ceiling.

Returns

number

Set Signature

set waveSpeed(val): void

Defined in: libs/scene/src/render/water_interaction.ts:750

Parameters
val

number

Returns

void


maxWaveSpeed

Get Signature

get maxWaveSpeed(): number

Defined in: libs/scene/src/render/water_interaction.ts:755

Highest wave speed the current window can integrate stably, in metres per second.

Returns

number


damping

Get Signature

get damping(): number

Defined in: libs/scene/src/render/water_interaction.ts:762

Rate the field loses energy at, in 1/s. 0 keeps ripples going until they leave the window; a few damps them within a second or two.

Returns

number

Set Signature

set damping(val): void

Defined in: libs/scene/src/render/water_interaction.ts:765

Parameters
val

number

Returns

void


foamAmount

Get Signature

get foamAmount(): number

Defined in: libs/scene/src/render/water_interaction.ts:783

How much foam a disturbance throws, 0 to disable the foam trail. Defaults to 0.15: at 1 a wake reads as solid white.

Foam is laid down where something moves through the water, where a stone lands and along the steep, fast crests of the field's own waves, and fades at foamDecay. The material shows it with the same look as the wave generator's crest foam and the shoreline foam.

Returns

number

Set Signature

set foamAmount(val): void

Defined in: libs/scene/src/render/water_interaction.ts:786

Parameters
val

number

Returns

void


foamDecay

Get Signature

get foamDecay(): number

Defined in: libs/scene/src/render/water_interaction.ts:790

Rate the foam trail fades at, in 1/s.

Returns

number

Set Signature

set foamDecay(val): void

Defined in: libs/scene/src/render/water_interaction.ts:793

Parameters
val

number

Returns

void


foamThreshold

Get Signature

get foamThreshold(): number

Defined in: libs/scene/src/render/water_interaction.ts:801

How steep and fast a wave of the field has to be before it foams on its own. Lower foams more of the wake; higher keeps foam to what is directly disturbed.

Returns

number

Set Signature

set foamThreshold(val): void

Defined in: libs/scene/src/render/water_interaction.ts:804

Parameters
val

number

Returns

void


maxAmplitude

Get Signature

get maxAmplitude(): number

Defined in: libs/scene/src/render/water_interaction.ts:807

Returns

number

Set Signature

set maxAmplitude(val): void

Defined in: libs/scene/src/render/water_interaction.ts:810

Parameters
val

number

Returns

void


spongeWidth

Get Signature

get spongeWidth(): number

Defined in: libs/scene/src/render/water_interaction.ts:818

Width of the absorbing band inside the window edge, as a fraction of the window. Waves reaching it die away instead of reflecting; the material also fades the field out over it so the window has no visible edge.

Returns

number

Set Signature

set spongeWidth(val): void

Defined in: libs/scene/src/render/water_interaction.ts:821

Parameters
val

number

Returns

void


followMode

Get Signature

get followMode(): WaterInteractionFollowMode

Defined in: libs/scene/src/render/water_interaction.ts:825

How the window is positioned. See WaterInteractionFollowMode.

Returns

WaterInteractionFollowMode

Set Signature

set followMode(val): void

Defined in: libs/scene/src/render/water_interaction.ts:828

Parameters
val

WaterInteractionFollowMode

Returns

void


followNode

Get Signature

get followNode(): SceneNode

Defined in: libs/scene/src/render/water_interaction.ts:832

Node the window follows while followMode is node.

Returns

SceneNode

Set Signature

set followNode(val): void

Defined in: libs/scene/src/render/water_interaction.ts:835

Parameters
val

SceneNode

Returns

void


followNodeId

Get Signature

get followNodeId(): string

Defined in: libs/scene/src/render/water_interaction.ts:843

Persistent id of followNode, for a field loaded from a scene before the node exists. Resolved against the water's scene on the next update; followNode wins when both are set.

Returns

string

Set Signature

set followNodeId(val): void

Defined in: libs/scene/src/render/water_interaction.ts:846

Parameters
val

string

Returns

void


center

Get Signature

get center(): Vector2

Defined in: libs/scene/src/render/water_interaction.ts:868

World XZ the window is centred on while followMode is fixed.

Returns

Vector2

Set Signature

set center(val): void

Defined in: libs/scene/src/render/water_interaction.ts:871

Parameters
val

Vector2

Returns

void


originX

Get Signature

get originX(): number

Defined in: libs/scene/src/render/water_interaction.ts:875

World X of the window's low corner, as of the last step.

Returns

number


originZ

Get Signature

get originZ(): number

Defined in: libs/scene/src/render/water_interaction.ts:879

World Z of the window's low corner, as of the last step.

Returns

number


disturbers

Get Signature

get disturbers(): readonly WaterDisturber[]

Defined in: libs/scene/src/render/water_interaction.ts:908

The disturbers registered with this field.

Returns

readonly WaterDisturber[]

Methods

on()

on<K>(type, listener, context?): void

Defined in: libs/base/dist/index.d.ts:630

IEventTarget.on

Type Parameters

K

K extends "dispose"

Parameters

type

K

listener

EventListener<{ dispose: []; }, K>

context?

unknown

Returns

void

Inherited from

Disposable.on


once()

once<K>(type, listener, context?): void

Defined in: libs/base/dist/index.d.ts:634

IEventTarget.once

Type Parameters

K

K extends "dispose"

Parameters

type

K

listener

EventListener<{ dispose: []; }, K>

context?

unknown

Returns

void

Inherited from

Disposable.once


off()

off<K>(type, listener?, context?): void

Defined in: libs/base/dist/index.d.ts:638

IEventTarget.off

Type Parameters

K

K extends "dispose"

Parameters

type

K

listener?

EventListener<{ dispose: []; }>

context?

unknown

Returns

void

Inherited from

Disposable.off


dispatchEvent()

dispatchEvent<K>(type, ...args): void

Defined in: libs/base/dist/index.d.ts:642

IEventTarget.dispatchEvent

Type Parameters

K

K extends "dispose"

Parameters

type

K

args

...object[K]

Returns

void

Inherited from

Disposable.dispatchEvent


dispose()

dispose(): void

Defined in: libs/base/dist/index.d.ts:6108

Returns

void

Inherited from

Disposable.dispose


onDispose()

protected onDispose(): void

Defined in: libs/scene/src/render/water_interaction.ts:679

Returns

void

Overrides

Disposable.onDispose


addImpulse()

addImpulse(x, z, radius, strength): void

Defined in: libs/scene/src/render/water_interaction.ts:904

Push the surface down (or up) at a point, once.

The disturbance is a Gaussian bump added to the field on the next step, so a stone hitting the water is one call, and something dragging through it is a call per frame. Calls beyond what one step can take are carried over to the following step.

Parameters

x

number

World X.

z

number

World Z.

radius

number

Radius of the bump in metres.

strength

number

Peak height of the bump in metres. Negative pushes the surface down, which is what an object entering the water does.

Returns

void


addDisturber()

addDisturber(disturber): void

Defined in: libs/scene/src/render/water_interaction.ts:915

Register a disturber. Beyond MAX_DISTURBERS enabled disturbers the extra ones are ignored, earliest registered first.

Parameters

disturber

WaterDisturber

Returns

void


removeDisturber()

removeDisturber(disturber): void

Defined in: libs/scene/src/render/water_interaction.ts:922

Unregister a disturber.

Parameters

disturber

WaterDisturber

Returns

void


isOk()

isOk(device?): boolean

Defined in: libs/scene/src/render/water_interaction.ts:940

Whether the device can host the field: it needs a filterable float or half-float render target.

Parameters

device?

AbstractDevice

Returns

boolean

Released under the MIT License.