Actors
GridManager
Section titled “GridManager”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:
- Place one in the level (or use
BP_DynamicRealWater, a Blueprint child of this class). - Optionally assign a WaveDataAsset and VisualDataAsset to control ocean state via data assets instead of per-property editing.
- Optionally assign an InteractionDataAsset to configure ripple / wake / splash behavior.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| Preset | |||
| WaveDataAsset | WaveDataAsset | : | Wave physics preset. When assigned, overrides all spectrum properties on this actor. |
| VisualDataAsset | VisualDataAsset | : | Visual appearance preset. When assigned, overrides all visual properties on this actor. |
| InteractionDataAsset | InteractionDataAsset | : | Interaction preset for ripple / wake / splash tuning. |
| Spectrum | |||
| bEnableFFT | bool | true | Enable / disable FFT wave simulation. When disabled, surface is flat. |
| SpectrumType | EDRWSpectrumTypes | Phillips | Phillips, Pierson-Moskowitz, or JONSWAP. See Choosing a wave spectrum for guidance. |
| WindSpeed | float | 25.0 | Wind speed in m/s. Range: 1–80. |
| WindDirection | FVector2D | (1, 1) | Wind direction. Range: -1 to 1 per axis. |
| WaveAmplitude | FVector4 | (4, 4, 4, 4) | Wave strength per cascade. Range: 0–64. |
| SmallWaveDamping | FVector4 | (4, 2, 1, 0) | Damping for short waves per cascade. Range: 0–64. |
| LargeWaveDamping | FVector4 | (0.25, 2, 4, 6) | Damping for long waves per cascade. Range: 0–64. |
| WindInfluence | FVector4 | (1, 1, 1, 1) | How strongly wind aligns waves. Range: 0–16. |
| OpposingWaveFactor | FVector4 | (0.125, 0.25, 0.5, 1) | Reduction for waves against wind. Range: 0–128. |
| PatchLength | FVector4 | (6400 ×4) | Size of each cascade patch. Range: 0–16384. |
| DomainSize | FVector4 | (6, 7, 8, 6) | Domain size per cascade. Range: 0–16384. |
| JONSWAP only | |||
| Gamma | FVector4 | (3.3 ×4) | Peak enhancement factor. Range: 1–10. |
| Alpha | FVector4 | (0.076, 0.114, 0.152, 0.228) | Energy scaling. Range: 0.001–1. |
| PeakOmega | FVector4 | (0.7, 1.1, 1.6, 2.5) | Peak angular frequency. Range: 0.1–10. |
| SigmaLow / SigmaHigh | FVector4 | 0.07 / 0.09 | Spectral width below / above peak. Range: 0.01–0.5. |
| Pierson-Moskowitz only | |||
| PMAlpha | FVector4 | (0.048, 0.048, 0.064, 0.096) | PM energy scaling. Range: 0.001–1. |
| PMPeakOmega | FVector4 | (1, 1.5, 2, 4) | PM peak frequency. Range: 0.1–10. |
| WPO and Normals | |||
| WPOStrength | FVector4 | (1 ×4) | World position offset strength per cascade. Range: 0–10. |
| WPODirection | FVector | (1, 1, 1) | WPO direction. Range: -1 to 1. |
| NormalStrength | float | 40.0 | Surface normal intensity. Range: 1–128. |
| DetailNormalStrength | float | 0.25 | Detail normal layer. Range: 0–128. |
| DetailNormalTilling | float | 32.0 | Detail normal UV tiling. Range: 0–512. |
| Lighting | |||
| Roughness | float | 0.2 | Surface roughness. Range: 0–1. |
| Specular | float | 1.0 | Specular intensity. Range: 0–1. |
| Anisotropy | float | 0.2 | Directional stretching of reflections. Range: 0–1. |
| SurfaceSpecular | float | 4.0 | Glancing angle specular. Range: 0–16. |
| Phase / Phase2 | float | 0.8 / -0.2 | Forward / backward scattering phase. Range: -1 to 1. |
| Refraction | float | 1.033 | Refraction index. Range: 1–5. |
| Color | |||
| AbsorptionColor | FLinearColor | (0.193, 0.092, 0.090) | Light absorption color. |
| Absorption | float | 0.065 | Absorption rate. Range: 0.001–1. |
| ScatteringColorStrength | float | 3.0 | Subsurface scattering. Range: 0–4. |
| HueShift | float | -60.0 | Color hue rotation. Range: -180 to 180. |
| GeneralStrength | float | 64.0 | Ambient / backside strength. Range: 0–64. |
| Foam | |||
| FoamAlphaContrast | float | -0.1 | Foam mask contrast. Range: -1 to 1. |
| FoamStrength | float | 1.5 | Foam intensity. Range: 0–16. |
| FoamColor | FLinearColor | (0.727, 0.816, 1.0) | Foam tint color. |
| Caustics | |||
| bEnableCaustics | bool | true | Enable caustics computation. |
| CausticsStrength | float | 1.0 | Caustics intensity. Range: 0–10. |
| CausticsChromatic | float | 0.3 | Light dispersion. Range: 0–1. |
| Depth | |||
| DepthWaveStrength | FVector | (2, 2, 3) | Depth influence on waves. Range: 1–8. |
| DepthAbsorptionStrength | float | 1.0 | Depth absorption modifier. Range: 0–8. |
| Grid | |||
| LOD1GridDistance | int32 | 2 | Cells before LOD 1. |
| LOD2GridDistance | int32 | 4 | Cells before LOD 2. |
| LOD3GridDistance | int32 | 8 | Cells before LOD 3. |
| bComputeDepthmap | bool | true | Compute landscape depth map. |
| ClientDepthMapDelay | float | 0.2 | Seconds clients wait after spawn before requesting the depth map. Range: 0–10. Useful for Open Level transitions and streaming. |
| GridUpdateInterval | float | 0.2 | LOD grid update interval (seconds). |
| BlurRadius | int32 | 2 | Interaction blur radius. |
| MinZPoint / MaxZPoint | float | −100000 / 100000 | Vertical bounds (cm) used when sampling landscape for the depth map. |
| GridRemovalThreshold | float | 0.99 | Fraction of hits required to remove a cell when the camera moves away. |
Additional visual property categories
Section titled “Additional visual property categories”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:
FoamNormalStrengthfor the per-foam normal contribution. - Caustics extras:
CausticsInteractionStrengthfor caustics response inside wakes / ripples. - Depth extras:
DepthNormalStrength,DepthFoamStrengthfor depth-driven normal and foam shaping near shorelines. - Smoothing:
NormalSmoothing,RoughnessSmoothing,SpecularSmoothingto soften surface popping at LOD transitions. - LOD Transition: six fields (
FirstLayerHighColorStrength,SecondLayerHighColorStrength,SecondLayerHighColorContrast, and matchingLowtriplet) that bias the colour blend across the four cascade layers. - Underwater extras:
CausticsDepthIntensity,CausticHueShiftIntensity,CausticsStrengthIntensity,ColorIntensity,ColorHueShiftIntensity,RefractionIntensityfor fine underwater post-process control.
These same categories exist on VisualDataAsset: assigning a VisualDataAsset is the recommended way to manage them as a preset.
Blueprint API
Section titled “Blueprint API”| Function | Returns | Description |
|---|---|---|
| SetWaveData(WaveData, BlendDuration, BlendEasing) | void | Blend to new wave state. |
| SetVisualData(VisualData, BlendDuration, BlendEasing) | void | Blend to new visual state. |
| ApplyWaveDataInstant(WaveData) | void | Apply wave data without blending. |
| ApplyVisualDataInstant(VisualData) | void | Apply visual data without blending. |
| SetFFTEnabled(bEnabled) | void | Enable / disable FFT. |
| IsFFTEnabled() | bool | Check FFT state. |
| IsWaveBlending() / IsVisualBlending() / IsBlending() | bool | Check blend progress. |
| GetWaveBlendProgress() / GetVisualBlendProgress() | float | 0–1 blend progress. |
| GetInteractionSubsystem() | InteractionSubsystem | Get the interaction subsystem. |
| GetInteractionRT() | RenderTarget2D | Get interaction render target. |
| GetWPORT() | RenderTarget2D | Get WPO render target (Jacobian in alpha). |
| IsDRWReady() | bool | True when grid is spawned and depth map computed. |
Delegates
Section titled “Delegates”| Delegate | Signature | Fires 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).
Vessel
Section titled “Vessel”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:
- Create a Blueprint child of
ADRW_Vessel. - Assign a VesselDataAsset (required: contains hull, propulsion, control surfaces).
- Assign a hull mesh via HullMeshAsset.
- Add PhysicsBodyComponent shapes matching the hull geometry.
- Place VesselSeat children for crew positions.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| VesselData | VesselDataAsset | : | Master vessel configuration (required). |
| HullMeshAsset | StaticMesh | : | Hull mesh to render. |
| bEnableMultiplayer | bool | true | Enable network replication. |
| NetUpdateRate | float | 30.0 | Network update frequency (Hz). Range: 1–60. |
| bSimulateWhenUncontrolled | bool | true | Continue physics when no controller. |
Blueprint API
Section titled “Blueprint API”| Function | Returns | Description |
|---|---|---|
| SetVesselController(Controller) | void | Assign a controller (object implementing IDRW_VesselController). |
| GetVesselController() | UObject | Current controller. |
| HasController() | bool | True if a controller is assigned. |
| SetInput(VesselInput) | void | Apply input to the vessel. |
| GetCurrentInput() | VesselInput& | Current input state being applied. |
| SetVesselData(NewVesselData) | void | Replace the master vessel configuration at runtime. |
| GetVesselData() | VesselDataAsset | Current vessel configuration. |
| RegisterSeat(Seat) | int32 | Register a seat, returns seat index. |
| UnregisterSeat(Seat) | void | Unregister a previously registered seat. |
| GetSeatByIndex(Index) | VesselSeat | Lookup a seat by its registered index. |
| GetSeatCount() | int32 | Number of currently registered seats. |
| GetAllSeats() | Array | All registered seats. |
| FindAvailableSeat(Type) | VesselSeat | Find an unoccupied seat of the given type. |
| GetSpeed() / GetSpeedKnots() | float | Current speed in cm/s or knots. |
| GetHeading() | float | 0–360 degrees. |
| IsInWater() / IsPlaning() | bool | State queries. |
| HasPhysicsAuthority() | bool | True on server or autonomous proxy. |
| GetHullMesh / GetPhysicsBody / GetBuoyancy / GetMovement / GetReplication() | Component | Component getters. |
Delegates
Section titled “Delegates”| Delegate | Signature | Fires 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).
VesselSeat
Section titled “VesselSeat”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:
- Place as a child actor of a Vessel or VesselPawn.
- Set LinkedVessel (auto-found if
bAutoFindVesselis true). - Set SeatType: Helm seats relay input to the vessel; Passenger seats do not.
- Adjust SeatOffset / SeatRotation for positioning.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| LinkedVessel | Vessel (weak) | : | The vessel this seat belongs to. |
| SeatType | EDRW_VesselSeatType | Helm | Helm (controls vessel) or Passenger. |
| bAutoFindVessel | bool | true | Automatically find parent vessel. |
| SeatOffset | FVector | (0,0,0) | Local position offset. |
| SeatRotation | FRotator | (0,0,0) | Local rotation. |
| bHideOccupantWhenSeated | bool | false | Hide the occupant mesh. |
| bUseSeatCamera | bool | false | Use seat’s own camera instead of vessel camera. |
Blueprint API
Section titled “Blueprint API”| Function | Returns | Description |
|---|---|---|
| OccupySeat(Actor) | bool | Seat an actor. |
| VacateSeat() | Actor | Remove and return the occupant. |
| IsOccupied() | bool | Check if seat has occupant. |
| GetOccupant() | Actor | Current occupant. |
| GetLinkedVessel() | Vessel | Parent vessel. |
| SetSeatInput(Input) / GetSeatInput() | void / VesselInput | Input state for this seat. |
| GetActiveSeatCamera() | CameraComponent | Whichever camera is currently active for this seat (own or vessel-shared). |
Delegates
Section titled “Delegates”| Delegate | Signature | Fires 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.
WaterBody (base)
Section titled “WaterBody (base)”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.
Shared Blueprint API
Section titled “Shared Blueprint API”| Function | Returns | Description |
|---|---|---|
| GetWaterHeightAtLocation(WorldXY) | float | Surface height at a world XY position. Flat for pools / lakes. |
| GetFlowVelocityAtLocation(WorldPos) | FVector | Flow vector at a world position (zero for static water bodies). |
| IsPointInWater(WorldPos) | bool | Volume containment test. |
| GetWaterSurfaceZ() | float | Surface world Z (centre). |
| GetInteractionRT() | RenderTarget2D | Per-water-body interaction texture. |
| GetCausticsRT() | RenderTarget2D | Per-water-body caustics texture. |
| GetInteractionRTWorldMin() | FVector2D | World-space minimum corner of the interaction texture: useful for custom material logic. |
| GetInteractionWorldCoverage() | float | World-space extent of the interaction texture (cm). |
Shared properties
Section titled “Shared properties”| Property | Type | Default | Description |
|---|---|---|---|
| VisualData | WBVisualDataAsset | : | Visual appearance preset. |
| InteractionDataAsset | InteractionDataAsset | : | Per-body interaction tuning. |
| bEnableCaustics | bool | true | Caustics on this water body. |
| bEnableBuoyancy | bool | true | Buoyancy for overlapping objects. |
| bEnableInteraction | bool | true | Ripple / wake effects. |
| bEnableUnderwater | bool | true | Underwater post-process. |
WaterBody_Pool
Section titled “WaterBody_Pool”ADRW_WaterBody_Pool: rectangular pool water body.
Purpose: Bounded rectangular water volume with independent interaction, caustics, underwater effects, and GDF-based boundary masking.
Setup:
- Place in level.
- Set Width, Length, Depth.
- Assign a WBVisualDataAsset for appearance.
- Optionally assign an InteractionDataAsset to tune ripple / wake behavior.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| Width | float | 500.0 | Pool width in cm. Min: 50. |
| Length | float | 500.0 | Pool length in cm. Min: 50. |
| Depth | float | 200.0 | Pool depth in cm. Min: 10. |
| BoundaryDistanceThreshold | float | 25.0 | GDF distance for boundary detection. Range: 1–200. |
| BoundaryBakeIntervalSeconds | float | 2.0 | Boundary mask re-bake interval. Range: 0–30. |
| Inherited from WaterBody: | |||
| VisualData | WBVisualDataAsset | : | Visual appearance. |
| InteractionDataAsset | InteractionDataAsset | : | Interaction tuning. |
| bEnableCaustics | bool | true | Enable caustics. |
| bEnableBuoyancy | bool | true | Enable buoyancy for overlapping objects. |
| bEnableInteraction | bool | true | Enable ripple / wake effects. |
| bEnableUnderwater | bool | true | Enable underwater post-process. |
Blueprint API
Section titled “Blueprint API”| Function | Returns | Description |
|---|---|---|
| InvalidateBoundaryMask() | void | Force boundary mask re-bake. |
| GetWaterSurfaceZ() | float | Water surface world Z. |
| GetWaterHeightAtLocation(WorldXY) | float | Water height at XY (flat for pools). |
| IsPointInWater(WorldPos) | bool | Volume containment test. |
| GetInteractionRT() / GetCausticsRT() | RenderTarget2D | Render 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.
WaterBody_Lake
Section titled “WaterBody_Lake”ADRW_WaterBody_Lake: circular lake water body.
Purpose: Large circular water body with optional wind ripple normal texture.
Setup:
- Place in level.
- Set Radius and Depth.
- Assign a WBVisualDataAsset.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| Radius | float | 5000.0 | Lake radius in cm. Min: 100. |
| Depth | float | 500.0 | Lake depth in cm. Min: 50. |
Dependencies: WBVisualDataAsset. Inherits all WaterBody base features.
WaterMaskingActor
Section titled “WaterMaskingActor”ADRW_WaterMaskingActor: underground cave masking volume.
Purpose: Box volume that suppresses buoyancy forces and underwater rendering inside caves or covered areas.
Setup:
- Place in level inside a cave or under a bridge.
- Scale the box to cover the masked region.
- Objects with BuoyancyComponent inside the box will have buoyancy masked based on coverage thresholds.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| ShapeBuoyancyThreshold | float | 0.25 | Per-shape coverage ratio to mask. Range: 0–1. |
| TotalBuoyancyThreshold | float | 0.70 | Average 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.
WaterMaskingManager
Section titled “WaterMaskingManager”ADRW_WaterMaskingManager: central surface mask manager.
Purpose: Coordinates orthographic scene capture for surface masking and cave mask data for the underwater shader.
Setup:
- Place exactly one in the level (required if using SurfaceMaskComponent or WaterMaskingActor).
- Configure resolution and coverage.
Properties
Section titled “Properties”| Property | Type | Default | Description |
|---|---|---|---|
| SurfaceMaskResolution | int32 | 1024 | Capture render target resolution. |
| SurfaceMaskCoverage | float | 6400.0 | Orthographic extent in cm. Min: 1000. |
| bSurfaceMaskEnabled | bool | true | Master enable. |
| bCaptureEveryFrame | bool | true | Capture every frame vs manual. |
| CaptureHeight | float | 5000.0 | Camera Z height. Min: 1000. |
Blueprint API
Section titled “Blueprint API”| Function | Returns | Description |
|---|---|---|
| RegisterSurfaceMask(Mask) | void | Register a surface mask component. |
| UnregisterSurfaceMask(Mask) | void | Unregister. |
| SetSurfaceMaskEnabled(bEnabled) | void | Toggle masking. |
| GetSurfaceMaskRT() | RenderTarget2D | Get the mask render target. |
| WriteCaveTransformsToRenderTarget() | void | Re-publish registered cave volumes to the underwater shader (call after spawning cave volumes at runtime). |
Dependencies: SurfaceMaskComponent instances. Follows player camera XY.