Skip to content

Actors

ADRW_GridManager: the central ocean actor.

Purpose: Manages the entire ocean surface: FFT wave simulation, LOD grid, depth map, spectrum execution, material parameter updates, caustics, and interaction rendering.

Setup:

  1. Place one in the level (or use BP_DynamicRealWater, a Blueprint child of this class).
  2. Optionally assign a WaveDataAsset and VisualDataAsset to control ocean state via data assets instead of per-property editing.
  3. Optionally assign an InteractionDataAsset to configure ripple / wake / splash behavior.
PropertyTypeDefaultDescription
Preset
WaveDataAssetWaveDataAsset:Wave physics preset. When assigned, overrides all spectrum properties on this actor.
VisualDataAssetVisualDataAsset:Visual appearance preset. When assigned, overrides all visual properties on this actor.
InteractionDataAssetInteractionDataAsset:Interaction preset for ripple / wake / splash tuning.
Spectrum
bEnableFFTbooltrueEnable / disable FFT wave simulation. When disabled, surface is flat.
SpectrumTypeEDRWSpectrumTypesPhillipsPhillips, Pierson-Moskowitz, or JONSWAP. See Choosing a wave spectrum for guidance.
WindSpeedfloat25.0Wind speed in m/s. Range: 1–80.
WindDirectionFVector2D(1, 1)Wind direction. Range: -1 to 1 per axis.
WaveAmplitudeFVector4(4, 4, 4, 4)Wave strength per cascade. Range: 0–64.
SmallWaveDampingFVector4(4, 2, 1, 0)Damping for short waves per cascade. Range: 0–64.
LargeWaveDampingFVector4(0.25, 2, 4, 6)Damping for long waves per cascade. Range: 0–64.
WindInfluenceFVector4(1, 1, 1, 1)How strongly wind aligns waves. Range: 0–16.
OpposingWaveFactorFVector4(0.125, 0.25, 0.5, 1)Reduction for waves against wind. Range: 0–128.
PatchLengthFVector4(6400 ×4)Size of each cascade patch. Range: 0–16384.
DomainSizeFVector4(6, 7, 8, 6)Domain size per cascade. Range: 0–16384.
JONSWAP only
GammaFVector4(3.3 ×4)Peak enhancement factor. Range: 1–10.
AlphaFVector4(0.076, 0.114, 0.152, 0.228)Energy scaling. Range: 0.001–1.
PeakOmegaFVector4(0.7, 1.1, 1.6, 2.5)Peak angular frequency. Range: 0.1–10.
SigmaLow / SigmaHighFVector40.07 / 0.09Spectral width below / above peak. Range: 0.01–0.5.
Pierson-Moskowitz only
PMAlphaFVector4(0.048, 0.048, 0.064, 0.096)PM energy scaling. Range: 0.001–1.
PMPeakOmegaFVector4(1, 1.5, 2, 4)PM peak frequency. Range: 0.1–10.
WPO and Normals
WPOStrengthFVector4(1 ×4)World position offset strength per cascade. Range: 0–10.
WPODirectionFVector(1, 1, 1)WPO direction. Range: -1 to 1.
NormalStrengthfloat40.0Surface normal intensity. Range: 1–128.
DetailNormalStrengthfloat0.25Detail normal layer. Range: 0–128.
DetailNormalTillingfloat32.0Detail normal UV tiling. Range: 0–512.
Lighting
Roughnessfloat0.2Surface roughness. Range: 0–1.
Specularfloat1.0Specular intensity. Range: 0–1.
Anisotropyfloat0.2Directional stretching of reflections. Range: 0–1.
SurfaceSpecularfloat4.0Glancing angle specular. Range: 0–16.
Phase / Phase2float0.8 / -0.2Forward / backward scattering phase. Range: -1 to 1.
Refractionfloat1.033Refraction index. Range: 1–5.
Color
AbsorptionColorFLinearColor(0.193, 0.092, 0.090)Light absorption color.
Absorptionfloat0.065Absorption rate. Range: 0.001–1.
ScatteringColorStrengthfloat3.0Subsurface scattering. Range: 0–4.
HueShiftfloat-60.0Color hue rotation. Range: -180 to 180.
GeneralStrengthfloat64.0Ambient / backside strength. Range: 0–64.
Foam
FoamAlphaContrastfloat-0.1Foam mask contrast. Range: -1 to 1.
FoamStrengthfloat1.5Foam intensity. Range: 0–16.
FoamColorFLinearColor(0.727, 0.816, 1.0)Foam tint color.
Caustics
bEnableCausticsbooltrueEnable caustics computation.
CausticsStrengthfloat1.0Caustics intensity. Range: 0–10.
CausticsChromaticfloat0.3Light dispersion. Range: 0–1.
Depth
DepthWaveStrengthFVector(2, 2, 3)Depth influence on waves. Range: 1–8.
DepthAbsorptionStrengthfloat1.0Depth absorption modifier. Range: 0–8.
Grid
LOD1GridDistanceint322Cells before LOD 1.
LOD2GridDistanceint324Cells before LOD 2.
LOD3GridDistanceint328Cells before LOD 3.
bComputeDepthmapbooltrueCompute landscape depth map.
ClientDepthMapDelayfloat0.2Seconds clients wait after spawn before requesting the depth map. Range: 0–10. Useful for Open Level transitions and streaming.
GridUpdateIntervalfloat0.2LOD grid update interval (seconds).
BlurRadiusint322Interaction blur radius.
MinZPoint / MaxZPointfloat−100000 / 100000Vertical bounds (cm) used when sampling landscape for the depth map.
GridRemovalThresholdfloat0.99Fraction of hits required to remove a cell when the camera moves away.

The GridManager exposes deeper visual tuning beyond the headline categories above. These categories are visible in the editor’s Details panel; defaults are sensible and most projects don’t need to touch them, but they are available when you need finer control.

  • Color extras: AmbientStrength, BacksideStrength, PeakWaveHeight, PeakWaveStrength, BaseColorStrength. Subtle tuning of how the water reads at glancing angles, on wave peaks, and against ambient light.
  • Foam extras: FoamNormalStrength for the per-foam normal contribution.
  • Caustics extras: CausticsInteractionStrength for caustics response inside wakes / ripples.
  • Depth extras: DepthNormalStrength, DepthFoamStrength for depth-driven normal and foam shaping near shorelines.
  • Smoothing: NormalSmoothing, RoughnessSmoothing, SpecularSmoothing to soften surface popping at LOD transitions.
  • LOD Transition: six fields (FirstLayerHighColorStrength, SecondLayerHighColorStrength, SecondLayerHighColorContrast, and matching Low triplet) that bias the colour blend across the four cascade layers.
  • Underwater extras: CausticsDepthIntensity, CausticHueShiftIntensity, CausticsStrengthIntensity, ColorIntensity, ColorHueShiftIntensity, RefractionIntensity for fine underwater post-process control.

These same categories exist on VisualDataAsset: assigning a VisualDataAsset is the recommended way to manage them as a preset.

FunctionReturnsDescription
SetWaveData(WaveData, BlendDuration, BlendEasing)voidBlend to new wave state.
SetVisualData(VisualData, BlendDuration, BlendEasing)voidBlend to new visual state.
ApplyWaveDataInstant(WaveData)voidApply wave data without blending.
ApplyVisualDataInstant(VisualData)voidApply visual data without blending.
SetFFTEnabled(bEnabled)voidEnable / disable FFT.
IsFFTEnabled()boolCheck FFT state.
IsWaveBlending() / IsVisualBlending() / IsBlending()boolCheck blend progress.
GetWaveBlendProgress() / GetVisualBlendProgress()float0–1 blend progress.
GetInteractionSubsystem()InteractionSubsystemGet the interaction subsystem.
GetInteractionRT()RenderTarget2DGet interaction render target.
GetWPORT()RenderTarget2DGet WPO render target (Jacobian in alpha).
IsDRWReady()boolTrue when grid is spawned and depth map computed.
DelegateSignatureFires when
OnDRWReady()The grid is spawned and the depth map is computed. Use to gate HUDs, level streaming, audio, or any system that depends on a usable ocean.

Multiplayer: Server-authoritative. WaveDataAsset / VisualDataAsset replicated with RepNotify. Spectrum time replicated for client sync.

Dependencies: WaveDataAsset, VisualDataAsset, InteractionDataAsset (all optional).


ADRW_Vessel: base vessel actor.

Purpose: Physics-driven vessel with hull mesh, buoyancy, movement, and seat management. The base class. For player-driven boats, prefer the VesselPawn wrapper. Use ADRW_Vessel directly when you want an AI-driven boat with no possession path, or when seat-based control is the only entry point.

Setup:

  1. Create a Blueprint child of ADRW_Vessel.
  2. Assign a VesselDataAsset (required: contains hull, propulsion, control surfaces).
  3. Assign a hull mesh via HullMeshAsset.
  4. Add PhysicsBodyComponent shapes matching the hull geometry.
  5. Place VesselSeat children for crew positions.
PropertyTypeDefaultDescription
VesselDataVesselDataAsset:Master vessel configuration (required).
HullMeshAssetStaticMesh:Hull mesh to render.
bEnableMultiplayerbooltrueEnable network replication.
NetUpdateRatefloat30.0Network update frequency (Hz). Range: 1–60.
bSimulateWhenUncontrolledbooltrueContinue physics when no controller.
FunctionReturnsDescription
SetVesselController(Controller)voidAssign a controller (object implementing IDRW_VesselController).
GetVesselController()UObjectCurrent controller.
HasController()boolTrue if a controller is assigned.
SetInput(VesselInput)voidApply input to the vessel.
GetCurrentInput()VesselInput&Current input state being applied.
SetVesselData(NewVesselData)voidReplace the master vessel configuration at runtime.
GetVesselData()VesselDataAssetCurrent vessel configuration.
RegisterSeat(Seat)int32Register a seat, returns seat index.
UnregisterSeat(Seat)voidUnregister a previously registered seat.
GetSeatByIndex(Index)VesselSeatLookup a seat by its registered index.
GetSeatCount()int32Number of currently registered seats.
GetAllSeats()ArrayAll registered seats.
FindAvailableSeat(Type)VesselSeatFind an unoccupied seat of the given type.
GetSpeed() / GetSpeedKnots()floatCurrent speed in cm/s or knots.
GetHeading()float0–360 degrees.
IsInWater() / IsPlaning()boolState queries.
HasPhysicsAuthority()boolTrue on server or autonomous proxy.
GetHullMesh / GetPhysicsBody / GetBuoyancy / GetMovement / GetReplication()ComponentComponent getters.
DelegateSignatureFires when
OnControlChanged(Vessel, NewController : UObject)Controller assignment changed (player or AI took / released the helm). Useful for HUD ownership swaps.

Multiplayer: Server-authoritative physics. Input replicated via CurrentInput. VesselData must be assigned before BeginPlay.

Dependencies: VesselDataAsset, PhysicsBodyComponent, BuoyancyComponent, VesselMovementComponent, SmoothReplicationComponent (all created internally).


ADRW_VesselSeat: crew seat attached to a vessel.

Purpose: Individual seat position on a vessel. Handles occupancy, camera, and input relay to the parent vessel.

Setup:

  1. Place as a child actor of a Vessel or VesselPawn.
  2. Set LinkedVessel (auto-found if bAutoFindVessel is true).
  3. Set SeatType: Helm seats relay input to the vessel; Passenger seats do not.
  4. Adjust SeatOffset / SeatRotation for positioning.
PropertyTypeDefaultDescription
LinkedVesselVessel (weak):The vessel this seat belongs to.
SeatTypeEDRW_VesselSeatTypeHelmHelm (controls vessel) or Passenger.
bAutoFindVesselbooltrueAutomatically find parent vessel.
SeatOffsetFVector(0,0,0)Local position offset.
SeatRotationFRotator(0,0,0)Local rotation.
bHideOccupantWhenSeatedboolfalseHide the occupant mesh.
bUseSeatCameraboolfalseUse seat’s own camera instead of vessel camera.
FunctionReturnsDescription
OccupySeat(Actor)boolSeat an actor.
VacateSeat()ActorRemove and return the occupant.
IsOccupied()boolCheck if seat has occupant.
GetOccupant()ActorCurrent occupant.
GetLinkedVessel()VesselParent vessel.
SetSeatInput(Input) / GetSeatInput()void / VesselInputInput state for this seat.
GetActiveSeatCamera()CameraComponentWhichever camera is currently active for this seat (own or vessel-shared).
DelegateSignatureFires when
OnOccupancyChanged(Seat, PreviousOccupant, NewOccupant)Occupant entered or left. Use for door / animation / UI triggers.

Multiplayer: CurrentOccupant replicated with RepNotify.

Dependencies: Vessel (parent), optionally VesselCameraComponent.


ADRW_WaterBody: abstract base class for Pool and Lake. You don’t place this directly, but its API is available on every concrete water body.

FunctionReturnsDescription
GetWaterHeightAtLocation(WorldXY)floatSurface height at a world XY position. Flat for pools / lakes.
GetFlowVelocityAtLocation(WorldPos)FVectorFlow vector at a world position (zero for static water bodies).
IsPointInWater(WorldPos)boolVolume containment test.
GetWaterSurfaceZ()floatSurface world Z (centre).
GetInteractionRT()RenderTarget2DPer-water-body interaction texture.
GetCausticsRT()RenderTarget2DPer-water-body caustics texture.
GetInteractionRTWorldMin()FVector2DWorld-space minimum corner of the interaction texture: useful for custom material logic.
GetInteractionWorldCoverage()floatWorld-space extent of the interaction texture (cm).
PropertyTypeDefaultDescription
VisualDataWBVisualDataAsset:Visual appearance preset.
InteractionDataAssetInteractionDataAsset:Per-body interaction tuning.
bEnableCausticsbooltrueCaustics on this water body.
bEnableBuoyancybooltrueBuoyancy for overlapping objects.
bEnableInteractionbooltrueRipple / wake effects.
bEnableUnderwaterbooltrueUnderwater post-process.

ADRW_WaterBody_Pool: rectangular pool water body.

Purpose: Bounded rectangular water volume with independent interaction, caustics, underwater effects, and GDF-based boundary masking.

Setup:

  1. Place in level.
  2. Set Width, Length, Depth.
  3. Assign a WBVisualDataAsset for appearance.
  4. Optionally assign an InteractionDataAsset to tune ripple / wake behavior.
PropertyTypeDefaultDescription
Widthfloat500.0Pool width in cm. Min: 50.
Lengthfloat500.0Pool length in cm. Min: 50.
Depthfloat200.0Pool depth in cm. Min: 10.
BoundaryDistanceThresholdfloat25.0GDF distance for boundary detection. Range: 1–200.
BoundaryBakeIntervalSecondsfloat2.0Boundary mask re-bake interval. Range: 0–30.
Inherited from WaterBody:
VisualDataWBVisualDataAsset:Visual appearance.
InteractionDataAssetInteractionDataAsset:Interaction tuning.
bEnableCausticsbooltrueEnable caustics.
bEnableBuoyancybooltrueEnable buoyancy for overlapping objects.
bEnableInteractionbooltrueEnable ripple / wake effects.
bEnableUnderwaterbooltrueEnable underwater post-process.
FunctionReturnsDescription
InvalidateBoundaryMask()voidForce boundary mask re-bake.
GetWaterSurfaceZ()floatWater surface world Z.
GetWaterHeightAtLocation(WorldXY)floatWater height at XY (flat for pools).
IsPointInWater(WorldPos)boolVolume containment test.
GetInteractionRT() / GetCausticsRT()RenderTarget2DRender targets.

Multiplayer: Width, Length, Depth replicate with RepNotify (OnRep_Dimensions) so clients rebuild the pool to match the server’s configuration. Visual / interaction / underwater enable flags also replicate.

Dependencies: WBVisualDataAsset, InteractionDataAsset (optional). Uses Global Distance Field for boundary detection: requires r.GenerateMeshDistanceFields enabled.


ADRW_WaterBody_Lake: circular lake water body.

Purpose: Large circular water body with optional wind ripple normal texture.

Setup:

  1. Place in level.
  2. Set Radius and Depth.
  3. Assign a WBVisualDataAsset.
PropertyTypeDefaultDescription
Radiusfloat5000.0Lake radius in cm. Min: 100.
Depthfloat500.0Lake depth in cm. Min: 50.

Dependencies: WBVisualDataAsset. Inherits all WaterBody base features.


ADRW_WaterMaskingActor: underground cave masking volume.

Purpose: Box volume that suppresses buoyancy forces and underwater rendering inside caves or covered areas.

Setup:

  1. Place in level inside a cave or under a bridge.
  2. Scale the box to cover the masked region.
  3. Objects with BuoyancyComponent inside the box will have buoyancy masked based on coverage thresholds.
PropertyTypeDefaultDescription
ShapeBuoyancyThresholdfloat0.25Per-shape coverage ratio to mask. Range: 0–1.
TotalBuoyancyThresholdfloat0.70Average coverage to mask all shapes. Range: 0–1.

The actor ships with a BoxComponent (the masked region) and a PostProcessComponent configured for the underwater interior: convenient for adding cave-specific post-process effects without a separate volume.

Dependencies: Works with WaterMaskingManager for underwater shader integration.


ADRW_WaterMaskingManager: central surface mask manager.

Purpose: Coordinates orthographic scene capture for surface masking and cave mask data for the underwater shader.

Setup:

  1. Place exactly one in the level (required if using SurfaceMaskComponent or WaterMaskingActor).
  2. Configure resolution and coverage.
PropertyTypeDefaultDescription
SurfaceMaskResolutionint321024Capture render target resolution.
SurfaceMaskCoveragefloat6400.0Orthographic extent in cm. Min: 1000.
bSurfaceMaskEnabledbooltrueMaster enable.
bCaptureEveryFramebooltrueCapture every frame vs manual.
CaptureHeightfloat5000.0Camera Z height. Min: 1000.
FunctionReturnsDescription
RegisterSurfaceMask(Mask)voidRegister a surface mask component.
UnregisterSurfaceMask(Mask)voidUnregister.
SetSurfaceMaskEnabled(bEnabled)voidToggle masking.
GetSurfaceMaskRT()RenderTarget2DGet the mask render target.
WriteCaveTransformsToRenderTarget()voidRe-publish registered cave volumes to the underwater shader (call after spawning cave volumes at runtime).

Dependencies: SurfaceMaskComponent instances. Follows player camera XY.