Tidal 2 URP
New in v2.0

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.
Note: Wake Produce Foam now lives here under Interaction → Layers, beside the layers it couples - it moved off the body root in v2.0 and the stored value does not migrate, so re-tick it on bodies that used wake foam.

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.

Emitters feed physics too
  • The wake layer feeds the GPU physics field, so GetWaterHeight and 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.
Performance
  • 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 GraphicsBufferRing upload rings.
  • Disabled layers are skipped entirely.