Skip to content

Changelog

Version history for the Dynamic Real Water (DRW) plugin. Major features lead each release; smaller improvements and fixes are grouped underneath. Future plans live on the Roadmap.

Theme: a near-total rewrite of the visual layer (foam, caustics, water interactions), full data-driven configuration, and serious authoring/debug tooling on top of the v2.0 foundation.

Every feature in this release is replication-ready out of the box. Multiplayer works across the full stack with no extra wiring.

Foam went from “stub” to a complete physically motivated pipeline.

  • Generation driven by Jacobian data, so foam appears in breaking-wave regions.
  • Foam accumulates, decays over a configurable lifetime, and advects with the water flow so trails persist behind moving wave peaks.
  • Foam parameters (color, strength, contrast, normal strength) live on VisualDataAsset for runtime authoring.

The old caustics path was a placeholder. The new one is physically based.

  • Chromatic aberration for prismatic light dispersion through wave peaks (CausticsChromatic on VisualDataAsset).
  • Interaction-coupled: the same interaction layer that drives ripples and wakes also displaces caustics, so a boat’s wake casts moving light patterns (CausticsInteractionStrength).

A new world subsystem renders ripples, wakes, splashes, and foam onto a scrolling render target that follows the camera.

  • PhysicsBodyComponents register themselves automatically when bEnableWaterInteraction is true. Gameplay code does nothing.
  • Buoyancy reads the same interaction layer, so wakes can push other floating objects around. InteractionHeightMultiplier on the BuoyancyComponent mixes interaction contribution; set to 0 for visual-only ripples.
  • InteractionDataAsset exposes ripple, wake, and splash tuning as a single shareable asset.
  • The interaction layer also feeds the new caustics and foam passes, so visual systems stay coupled instead of drifting against each other.

Every tunable surface is now backed by a Data Asset.

  • Ocean: WaveDataAsset (spectrum, wind, cascades), VisualDataAsset (lighting, color, foam, caustics), OceanPresetDataAsset (combined wave + visual preset).
  • Vessels: VesselDataAsset aggregating HullDataAsset, HydrodynamicsDataAsset, StabilityDataAsset, PropulsionDataAsset[], and ControlSurfaceDataAsset[].
  • Water bodies: WBVisualDataAsset for per-body looks.
  • Effects: InteractionDataAsset (ripple/wake/splash) and SprayDataAsset (spray FX tuning).
  • The shipped library includes wave presets (DA_DefaultWaves, DA_P_SmallWaves, DA_P_MediumWaves, DA_P_HighWaves), visual presets, and full vessel stacks for the three reference vessels.
  • Authoring a “stormy ocean” or a “calm pool” is a one-click swap. Construction-Script-only configuration is no longer the default path.

Wave blending now conserves total energy across frequency bands.

  • Switching WaveDataAssets blends naturally across spectra (Phillips, Pierson-Moskowitz, JONSWAP), large amplitude swaps no longer spike, and superpositions of multiple cascades stay stable.
  • Each of Gamma, Alpha, SigmaLow, SigmaHigh, PeakOmega is now a per-cascade FVector4, so different LOD bands carry different spectral shapes within the same blend.
  • Pierson-Moskowitz is now wired in as a third selectable spectrum alongside Phillips and JONSWAP.

SetWaveData and SetVisualData blend between any two assets over a configurable duration.

  • Linear, ease-in, ease-out, and ease-in-out are built in via BlendEasing; a custom UCurveFloat can override the easing entirely.
  • IsWaveBlending, IsVisualBlending, and progress getters expose the state for HUDs and audio crossfades.
  • An OnDRWReady delegate fires when the grid has spawned and the depth map is ready, useful for HUDs that gate on water availability.

Bounded water that lives alongside the open ocean.

  • BP_DRW_Pool uses Global Distance Field clipping. Hand-modelled pool basins (curved sides, harbour walls, jacuzzi steps) keep water inside the geometry instead of bleeding through the mesh.
  • BP_DRW_Lake is a free-form bounded body. Drop one anywhere a lake or pond should be.
  • Each body carries its own WBVisualDataAsset (independent caustics, color, transparency, fog).
  • Buoyancy transitions automatically when an actor overlaps a body. No per-actor wiring.
  • Underwater post-process and caustics route through whichever body the camera is inside.

A full modular vessel stack ships in this release.

  • Five hull types: Displacement, Semi-Displacement, Planing, Hydrofoil, Multihull. Each picks a physics model and tells the movement component how to behave.
  • Four movement regimes: Displacement, Transition, Planing, Foiling. The VesselMovementComponent reports the current regime through OnMovementStateChanged so audio, FX, camera, and HUD can react.
  • Four seat types: Helm (full control), Passenger (camera only), Gunner (future), Engineer (future). Multi-crew ships work without extra wiring.
  • Modular configuration: VesselDataAsset aggregates Hull, Hydrodynamics, Stability, Propulsion[], and ControlSurfaces[] data assets. Build a speedboat, a sailboat, or a kayak by swapping sub-assets.
  • Three reference vessels ship: Dinghy (small displacement), Runabout (planing powerboat), TallShip (multi-crew with seats).
  • VesselCameraComponent for vessel-attached cameras. Spring-arm based, with horizon stabilization that holds the camera level against vessel roll and pitch, speed-based FOV widening for the “fast feel” at high speed, position lag for a cinematic feel, and camera collision against world geometry. Only third-person mode is functional in this release; first-person and orbit modes are reserved for a future release.
  • VesselInputComponent for vessel input. Enhanced Input handling that auto-binds keyboard, gamepad, or both via InputSource (or a fully custom config), with analog smoothing, dead zones, and quantized replication that mixes unreliable analog channels with reliable zero-input and critical-state sends. Pairs with VesselCameraComponent but does not require it.

A new Niagara-driven spray system reads velocity, submersion, and hull geometry from the buoyancy runtime to spawn fine spray particles for strong wave impacts and object interactions.

  • Niagara is now a plugin dependency.
  • API may shift before stabilizing.

Replaces ad-hoc Print Strings with categorized force visualization.

  • Categories: Buoyancy, Gravity, Damping, Drag, Thrust, Steering, Stability, Velocity. Bitmask filter, toggle in the editor or at runtime.
  • Per-shape force arrows with magnitude readouts (Newtons) and per-body velocity vectors.
  • Shape visualization (box, sphere, capsule) for hull tuning.
  • Per-actor filtering via DRW.Debug.filter.

UDRW_BlueprintLibrary exposes one-node convenience access to the GridManager from any Blueprint.

  • GetDRWGridManager, SetOceanWaveData, SetOceanWaveDataInstant, SetOceanVisualData, SetOceanVisualDataInstant, and matching getters.
  • World-context aware: no need to manually find the GridManager actor first.
  • Useful for character pawns, widgets, and cinematics that need to query or drive water state.
  • BuoyancyComponent extensions. Heave / pitch / roll / yaw damping, lateral added mass, slamming impulses and exit damping, an UpdateMode toggle (FixedOnly vs legacy EventTick), volume-percentage InWaterThreshold, smooth client reads via GetInterpolatedOutput + InterpolationStrength, and water-body overlap accessors (OverlappingWaterBody, IsInWaterBody, GetWaterBody).
  • ADRW_DronePawn ships as BP_Drone. Default spectator/control pawn with Flying and ControllingVessel states, built-in seat occupation via SeatOccupantComponent, vessel possession via VesselPossessionComponent, and pre-wired Enhanced Input (IMC_DRWInput, IMC_DRWVesselInput, IA_VesselThrottle). Drop into a level and play immediately.
  • Distance-prioritized Task Subsystem. Buoyancy ticks, async readbacks, and depth-trace batches near the camera run first; distant work defers without dropping. Critical-priority tasks have a per-frame cap to prevent low-priority starvation.
  • Multi-instance buoyant actor optimization. Many buoyant actors in one level share data pools and compute, reducing per-actor overhead.

Client-side transform smoothing for networked actors. This component smooths the visual position and rotation of objects that are controlled by the server. It does not change physics, apply forces, or influence authoritative simulation. The server still determines the real motion. On the client, the component reconstructs and interpolates the actor’s transform from incoming network updates to produce stable, smooth movement, even when packets arrive late or irregularly.

DRW_BuoyancyComponent: complete networking overhaul

Section titled “DRW_BuoyancyComponent: complete networking overhaul”
  • Fixed timestep accumulator with spiral-of-death prevention and more predictable replication
  • Double-buffered FBuoyancyStateSnapshot for smooth interpolation between calculation frames
  • New CalculationRateHz property (1 to 120 Hz) to match network replication rates
  • New smooth velocity damping to prevent excessive velocity
  • bIsInWater now works properly
  • Much more accurate usage of the Task Subsystem
  • Around 50 to 60 percent performance increase
  • Fixed underwater effects bleeding between players in listen server / multiplayer
  • Each player now has an isolated rendering pipeline
  • Fixed server player not receiving waterline effects in listen server mode
  • Fixed waves not generating on clients in multiplayer
  • WaterlineCubeMesh is always invisible now
  • LineTrace support for LOD0 and LOD1 meshes on the Visibility trace channel
  • AsyncReadback now costs 0.07 to 0.08 ms on 85 calls
  • Task Subsystem now performs at 0.03 to 0.04 ms on 300 tasks

Theme: stability and Task Subsystem hardening.

  • PhysicsBodyComponent: improved center-of-mass calculations
  • BuoyancyComponent: improved async task distribution
  • Task Subsystem: Render Thread task support, low-priority starvation prevention (per-frame caps on Critical-priority tasks), and overall stability gains so results stay consistent across runs
  • AsyncReadback is now fully compatible with the Task Subsystem
  • Task Subsystem “Open Level” initialization bug fixed

Theme: networking, skeletal meshes, and the first big performance pass.

The entire water system is now replicated across clients and server. Buoyancy outputs are exposed as replicated arrays, so swimming components, character water-state, and HUD work cleanly in networked play.

Skeletal meshes are first-class buoyant objects. Bone attachment and per-bone buoyancy work out of the box, and a single Blueprint can carry multiple static or skeletal meshes with no per-mesh overhead.

Waterline capture runs asynchronously, removing a per-frame stall that previously gated visual quality.

  • Replicated underwater masking for caves
  • Simple mask to prevent water from leaking into solid objects
  • Improved physics prediction
  • Improved top-down LOD transition
  • Improved underwater shader
  • New detail normal texture
  • New example Blueprints for buoyancy
  • About 57 percent overall performance increase
  • 12 small bug fixes

See the Roadmap for the priority-ordered list of planned features and improvements.