Interaction Canvas System
GPU foam, wake, and flow layers that follow the camera and points of interest.
The interaction canvas is a complete GPU interaction layer built on
TidalCanvasSubSystem: world-anchored clipmap canvases that follow the
camera and your Points of Interest, storing dynamic water state independent of the FFT. Nested clip
levels give fine detail close to the action and coarse coverage further out. All three layers
simulate in a single dependency-ordered command buffer (flow → wake → foam), and any
layer can be toggled off on the body's Interaction foldout - a disabled layer costs
nothing and every binding stays valid.
Layers
Foam
Persistent foam that is injected, decays over time, and is advected by the flow field - foam actually drifts with currents. Sources are Foam Emitters, breaking wakes, and scripted injection. Fine-to-coarse phase-locking keeps LOD crossfades stable.
Wake
A real 2D wave-equation simulation in world units. Boats and objects (via Wake Emitters) displace the surface; wakes ripple outward, reflect, and their breaking fronts shed foam into the foam layer (a slope + crest-speed breaking criterion with a tunable tolerance).
Flow
A composited flow/current field built from Flow Emitters and baked Flow Zones. It is consumed by rendering (UV advection), foam transport, wake advection, and by C# via the flow sampling API.
Interaction settings
These fields live on the body's Interaction foldout and configure the clipmap canvas shared by all three layers.
| Field | Type · Default | Description |
|---|---|---|
| Base Tile World Size | 10-80 m · 30 | World size of the finest clip level; each coarser level doubles it. |
| Max Lod | 4-10 · 4 | Number of nested clip levels above LOD 0. |
| Tile Resolution | enum 64-1024 · 256 | Texels per clip tile, shared by all layers (64 / 128 / 256 / 512 / 1024). |
| Clip Snap Meters | 0.25-5 m · 1 | How far a POI moves before the tiles re-anchor. |
| Enable Foam Layer | bool · on | Master toggle for the foam layer. A disabled layer costs nothing. |
| Enable Wake Layer | bool · on | Master toggle for the wake simulation layer. |
| Enable Flow Layer | bool · on | Master toggle for the flow/current layer. |
| Wake Produce Foam | bool · off | Fast/steep wakes inject foam into the foam layer. Needs both the foam and wake layers enabled. |
Emitters
Emitters are drop-in GameObjects with radius / intensity controls that feed the canvas layers. Foam
and Wake emitters have their own menu items: GameObject → Tidal 2 → Wake Emitter | Foam Emitter.
- Wake Emitter - injects interactive waves/ripples into the wake layer. Attach to boats, characters, or projectiles so they displace the surface as they move.
- Foam Emitter - injects foam directly into the foam layer.
- Whirlpool Flow Emitter (
WhirlpoolFlowEmitter) - a flow-field emitter with a Radius property that creates a rotational current, used by the whirlpool demo content.
- The wake layer feeds the GPU physics field, so
GetWaterHeightand buoyancy actually feel boat wakes - not just the render. - Flow emitters and Flow Zones share one composited flow field, readable from C# via the flow sampling API.
- Layers simulate in one dependency-ordered CommandBuffer (flow → wake → foam).
- Slot-based tile allocation and dirty-region tracking limit work to what changed.
- Zero per-frame GC pressure via
GraphicsBufferRingupload rings. - Disabled layers are skipped entirely.