Fluid Flux 2.0 Demo introduces two new example demo maps that showcase the capabilities of the updated version. The CoastlineMap highlights the new Coastline Domain system, demonstrating the seamless blending of coastlines with the simulation state. On the other hand, the WaterfallMap showcases the simulation of shallow water on steep slopes, specifically focusing on a waterfall scenario.
Additionally, the demo help panel has been expanded to include several new options:
- Press L and move the mouse to rotate the sun
- Press I, O, P keys to switch predefined Color Presets
- Press G to turn on/off debug ground
Before updating your project
Due to the extensive scope of this update, it is possible that certain aspects might have been overlooked during the development and testing phases. To ensure a smooth transition, it is strongly recommended to make a copy of your project before downloading the update.
Please note that the removal or renaming of assets might not be automatically handled during the update process. Consequently, there is a possibility of “ghost files” from the previous version (1.1) remaining in your project. To mitigate any potential issues, it is recommended to follow these steps for updating:
- Make sure that Update is already available on the marketplace page 🙂
- Navigate to the Content/FluidFlux folder in your project.
- Remove or delete the entire old version of the product from the FluidFlux folder.
- Download the new version of the product and extract it into the FluidFlux folder, ensuring a fresh and clean update.
The new version is not fully backward compatible with Fluid Flux 1.1 but the transition should be smooth for everyone. To help you navigate through any potential challenges, please review the following list of problems and changes that may arise during the transition:
- No blending with the Ocean after updating the project – Easy fix: AreaWorldBlend = (0.2) should be adjusted in the simulation actor.
- Material is not working on the distant ocean mesh after updating the project – Easy fix: Remove distant meshes and switch Surface->SurfaceMeshMode to InfiniteGrid_128_Niagara
- BP_FluxModifierWaveActor is now reading SurfaceHeight from its actor position so you may have to adjust the Z location of the actor.
- The simulation algorithm has been improved with the addition of friction, damping, and overshooting correction. As a result, the simulated state in the new version may appear slightly different from the previous version.
Introducing the BP_FluxCoastlineDomain, a dedicated system designed specifically for baking world data into textures and constructing a CoastlineState. This state serves as a fundamental data source during the rendering process for coastlines and oceans.
The example configuration in the demo captures the island coastline on an area of 3km x 3km. The maximum size of a map that can be captured by the BP_FluxCoastlineDomain system is 10km x10km.
The architecture of the BP_FluxCoastlineDomain system is designed to be similar to the simulation system, ensuring consistency and familiarity. It includes structures like the data asset, baked state, and initial state. The BP_FluxCoastlineDomain actor generates a state that can be exported as the CoastlineState data asset or used directly in the BP_FluxSurfaceActor, just like the SimulationState. This simplifies the workflow and makes the system more user-friendly.
The CoastlineState data asset stores two textures.
- WorldGroundMap stores the height map of the coastline area.
- WorldCoastlineMap stores the distance to the coastline, direction, wave height, and blending of the coastline.
Niagara Infinite Mesh
Previously, the rendering of the surface actor was based on a single static mesh that was displaced by simulation or waves. While this approach was simple, clean, and robust, it had limitations, particularly when dealing with large water bodies. The new rendering mode can be activated by switching Surface->SurfaceMeshMode=InfinityGrid_128 and controlled using InfiniteGrid parameters.
A new mesh rendering mode is designed for infinite surfaces like oceans and large simulations/states. This extension is based on multiple Niagara meshes in resolution (128×128) spawned on a grid around the camera. Additionally, a simplified distant mesh is employed to cap the surface on the horizon, further enhancing efficiency.
For debugging purposes, the grid preview can be enabled by utilizing MI_FluxSurfaceOverDebug as the OverWater material in the Surface actor.
Please be aware that the previous configuration for distant meshes is no longer supported and will be removed in future updates.
Shallow water simulation is unable to capture the breaking of ocean waves. However, Fluid Flux addresses this limitation by offering an additional tool specifically designed to simulate visually appealing shoreline wave breaking without using simulation. A wave profile is a small two-dimensional texture that stores data about the displacement of the mesh in time.
Wave profile texture can be generated with BP_FluxWaveProfileGenerator based on a list of splines representing frames of animation. BP_FluxWaveProfileGenerator is an experimental tool so I am recommending using the example WP_DefaultWaveProfile data asset.
In this update, we’re introducing a new and improved system for capturing height maps. The HeightMapComponent is now utilized by both SimulationDomain and CoastlineDomain, providing enhanced functionality based on the simulation actor heightmap capture code.
Furthermore, new visibility options have been implemented, and a simplified visibility structure has been introduced. However, please be aware that the previous visibility configuration in the simulation actor will no longer be supported and will require recreation using the new tools.
- New material function (MF_FluxFlatGround) for clamping mesh during the heightmap capture process
- Ground map debug visible only when simulation actor is selected or DebugSelectedOnly = false
- Added ground map precision settings
- Parameter: ReferencePlane – offsets height center of simulation so quality should be better around the center of simulation.
- Added loading heightmap from the initial state
- Fixed hard reference problems on sublevels
The color preset system serves as a powerful tool for effortlessly configuring the visual aspects of the water. It offers a range of predefined presets, eliminating the need to create new material instances to modify scattering and absorption.
A total of 24 preconfigured color presets are now available for oceans, shallow water, and rivers. Additionally, users have the flexibility to create their own water presets by duplicating existing examples and adjusting the parameters as desired. This allows for seamless customization and experimentation.
World painter and brush
The FluxWorldBrush is a unique actor designed to manipulate data within the WorldPainterComponent canvas. The system offers three distinct types of canvas on which the FluxWorldBrush can perform painting operations:
- ColorPainter ( BP_FluxWorldPainter), interpolation between the base color and painter color.
- WaveSize (BP_FluxCoastlineDomain), interpolation between no wave and highest wave.
- WaveType (BP_FluxWorldDomain), interpolation between Oceanic wave and coastline wave
The entire underwater shader was built from scratch. The Single Layer Water lighting model was incorporated (the same as built-in Unreal), into underwater materials. This implementation enabled the removal of multiple parameters and the establishment of a unified water system controlled by the same parameters as the surface. This simplification represents a significant advancement, as it now ensures the lighting of the underwater environment is consistent with the surface lighting at any time of day.
- Added coastline(coastline state) rendering mode
- Added surface rectangular cut masking (only one area supported)
- Added detail wave foam and WPO displacement
- Surface shading improvements: specular, roughness, PhaseG,
- Foam shading improvements: emissive foam color, dithered foam parameters
- Fixed bright caustics when fluid moves too fast
- Fixed fluid mask implementation
- Fixed distant fluid state opacity z-fight
- Disabled masking in generated static meshes
- Optimized surface shader complexity
- Added hole cutting using a rectangular mask.
- Renamed BP_FluxSimulation to BP_FluxSimulationDomain (old asset still exists in a project as deprecated child class)
- Improved edge of the water when flowing in the area
- Configurable default surface child actor by soft class reference.
- Moved simulation area blending parameter from surface to simulation (AreaWorldBlend) and changed to 4-axis vector.
- Organized simulation parameters in separate tabs: Simulation->Physics
- Added OvershootingBlend, and OvershootingEdge parameters which fix spikes appearing on large slopes
- Default parameter SimulaitonDeltaTime changed from (0.2 to 0.18 for improving stability)
- The default parameter FluidTransportLimit changed from 100 to 500
- BP_FluxModifierWaveComponent was renamed in FluxModifierWave actor which means your settings may reset after the update (sorry for that).
- Improved initial state loading and position offset is allowed since now.
- Fixed phantom rendering with nanite in 5.1
- Fixed Velocity Clamp parameter, changed SlopeClamp parameter to AccelerationClamp
- Simulation Z transform does not affect the quality of the result anymore. 2 times better precision overall. Added reference plane for rendering simulation
- Proper detection of modifiers spawned in gameplay.
- Added simulation activation event. (can be linked to level OnLoadingFinished)
- Added Surface Smoothing parameter that eliminates sharp edges and creates a more visually appealing result.
- Real-time wave preview in the editor.
- FFT flipbook used for wave displacement, normal, foam.
- Two modes of rendering wave animation: RenderTarget, AnimatedFlipbook
- Normal map is stored in wave render target since now (optimization).
- Reorganized ocean wave parameters.
- Added shore water configuration and wave profile support.
- Fixed communication between surface and wave actor.
- Force modifier optimization and code cleanup
- Added vortex modifier
- Improved Simulation-Modififer overlap detection process and component filtering. Added ignore overlap interface function. Custom collision channels are supported properly now. Changed modifier list to soft references.
- Improved modifier activation, dynamic spawn, and removing.
- Added boat interaction example
- Improved interaction rendering (changed additive to translucent) and stability
- Improved interaction masking
- Better normal/height encoding
- Fixed interaction garbage collector crashing in specific conditions.
- Upgraded debug with surface mesh
- Automatic scale interaction by the size of the owner.
- Improved underwater bubble shading.
- Added spawn rate parameter in FluxNiagaraActor
- Underwater dust particles are simulated in camera space.
- Improved water sound detection using the Niagara system
- Improved DataComponent debug
- Removed UE5 audio workarounds
- Removed unused assets
- Removed the editor-only “Mipmap” related function executed during render target initialization.
- Removed bump offset details for now (it will be back soon), details work on world position offset of dense infinite mesh.
- New landscape material with multiple layers: grass, sand, rocks, wetness
- Improved swimming implementation (the character can float on the surface now)
- Improved switching from ragdoll to swimming
- Disabled projectile-volume collision detection
- The waterline is not synchronized with the surface near the coastline and may sometimes look buggy.
- TSR antialiasing still causes some issues so is better to use TemporalAA.
- The maximum supported domain height in UE 5.2 is 32000 units (engine precision bug)
- If you downloaded Fluid Flux 2.0 for UE5.1 and later updated the engine to 5.2, it is essential to update Fluid Flux as well. This is because certain engine features have been deprecated between those versions.
- Following the release, one or two hotfix updates will be rolled out to ensure the stability of the new version.
- New chapters in the documentation and a series of tutorials focusing on oceans and interactions
That concludes the update. I would like to express my gratitude to everyone for their patience, as well as for discovering and reporting any bugs or improvements. It has been truly rewarding to see my pack being used in your amazing projects. Thank you all!