Water bodies, waves, and buoyancy

Dawn Engine Water authors streams, rivers, lakes, and oceans as first-class water bodies: a unified surface query (height / depth / flow), Atom refraction and reflection, Gerstner or FFT waves, buoyancy physics, and optional bridges to SurfaceData, Navigation3D, and particles.

Maturity: shipped. Provided by the Water Gem; depends on LmbrCentral, Atom / Atom_RPI, and SurfaceData. Enabled by default (/O3DE/Gems/Water/Enabled=true). After enablement, the system component mounts automatically; you still place river / lake / ocean components on scene entities.

It does not provide CFD flooding or automatic river–lake–ocean fusion: levels and estuary blends are authored (mouth fade + optional blend band). Tide is a global / per-body height offset, not a hydrodynamic sim.

What problem it solves

Open-world and digital-twin levels need more than a flat reflective plane: flowing rivers with variable width, lakes with islands, camera-centered oceans, floating objects, swimming / underwater fog, and gameplay that can ask “what is the water height here?”. Water provides:

  • Spline rivers (Stream / River / GreatRiver presets), closed-spline or polygon lakes, and infinite or finite oceans;
  • Deterministic surface mesh generation and a shared water clock so CPU queries match GPU displacement (≤ 1 cm @ 100 km);
  • .waterwaves spectrum assets (explicit Gerstner or Phillips / JONSWAP → FFT);
  • Stage rendering: refraction, planar reflection / SSR / IBL, shore foam, caustics, underwater fog / DoF, motion vectors;
  • WaterBuoyancyComponent plus enter / exit / submersion events for physics and gameplay.

With the Gem disabled, levels have no water bodies, queries, or water pass draws.

How it works

Editor authoring (spline / sea level / waves / bake)
WaterBody*Component ──► BuildSurface() ──► WaterBodyRegistry (CPU queries / physics)
 └──────────────► BuildRenderData() ──► WaterFeatureProcessor (Atom)
 TransparentPass ← WaterParent (refract / surface / FFT / caustics)
Gameplay / buoyancy / script ──► WaterSurfaceRequestBus (Vector3d world sample)

Two rules run through the Gem:

  1. Core vs framework: wave math, river sampling, and mesh generation depend only on AzCore and stay headless-testable; components and bridges orchestrate.
  2. One query surface: physics, camera underwater checks, SurfaceData tags, and scripts all go through WaterSurfaceRequestBus against the same registry arbitration (river family > lake > ocean by default priority).

Layout under Gems/Water/:

PathRole
Code/Runtime + editor components, Atom / SurfaceData / Navigation / Particle bridges
Assets/Prefabs, .waterwaves, materials, shaders, pass templates
Registry/Default Settings Registry (water.setreg)

Open-world projects typically combine Water with double-precision rendering, World Streaming, and optionally PolyTerrain for river-bed carve.

Quick start (summary)

  1. Enable Water (Project Manager or project.json). Confirm /O3DE/Gems/Water/Enabled=true and that the Atom pipeline includes TransparentPass (or MultiViewTransparentPass).
  2. Create Entity → Water → Lake (or River / Ocean), or spawn a prefab from Gems/Water/Assets/Prefabs/Water/.
  3. Assign waves and a material; for floating debris add Rigid Body + Collider + WaterBuoyancyComponent.
  4. Query via WaterSurfaceRequestBus (C++ / Lua / Script Canvas category water).

For the full walkthrough and verification checklist, see Getting started.

Handbook chapters

ChapterContents
Getting startedEnable the Gem, place a body, run one surface query, verify with WaterSamples
Core conceptsBody family, registry arbitration, water clock, CPU/GPU consistency, large-world rules
AuthoringRiver / Lake / Ocean fields, baking, Dry Volume, River Network
Waves and materials.waterwaves, FFT / ripples, material presets, quality tiers
Buoyancy and gameplayBuoyancy, surface attachment, events, bridges, tide, scripting
DebuggingOverlay, viewport helpers, Settings Registry, troubleshooting
RecipesStream→lake, calm lake, open ocean, estuary, river network
ReferenceComponents, EBuses, assets, sample levels

Glossary

TermMeaning
Water bodyOne editable / queryable water instance (WaterBody*Component)
Water surfaceUpper surface sampled by WaterSurfaceRequestBus
Flow mapBaked 2D direction + speed map for dual-phase normal scroll
Gerstner waveExplicit multi-component gravity-wave sum (CPU/GPU same formula)
FFT oceanPhillips / JONSWAP spectrum → GPU IFFT displacement; CPU uses ≤16-component approx
Shore distanceSigned distance to shoreline; drives foam and amplitude fade
Water depthSurface height minus bed / terrain; drives absorption and buoyancy
Blend bandSoft cross-body blend near a body’s XY boundary (0 = winner-takes-all)
Mouth fadeEstuary arc-length fade that zeros river waves and damps ocean waves near the mouth
waterTimeShared clock (wraps every 3600 s) driving CPU queries and GPU waves

You can rely on:

  • Stream / River / GreatRiver, Lake, Ocean authoring with live editor preview;
  • Unified WaterSurfaceRequestBus queries matching GPU displacement;
  • Gerstner + Spectrum/FFT waves, shore / flow bake, buoyancy and script events;
  • Quality tiers, World Streaming AlwaysLoaded ocean, optional Navigation3D / particle / SurfaceData bridges.

Do not assume:

  • Automatic CFD flooding or auto-merged river–lake–ocean topology;
  • Runtime PolyTerrain height queries without an editor shore / depth bake;
  • More than one unbounded ocean, or more than one Spectrum ocean driving FFT (extras fall back to CPU approx);
  • Mobile-tuned paths (use Low tier as the baseline).

Next steps


Copyright © 2026 DawnEngine. All rights reserved.

DawnEngine is a commercial 3D engine distributed under the DawnEngine end-user license agreement. Engine binaries and source are proprietary and are not covered by the licenses below.

Documentation only: the prose and templates on this site are a derivative work of Open 3D Engine (O3DE) documentation by the O3DE Contributors, used under CC BY 4.0 (documentation content), Apache 2.0 (site code), and the MIT license (inline code samples).

The open-source 3D engine that DawnEngine is built on top of is Open 3D Engine . DawnEngine is not affiliated with, endorsed by, or sponsored by The Linux Foundation or the O3DE project. “O3DE” and “Open 3D Engine” are trademarks of The Linux Foundation.