What’s New?

More effects, better performance! Is it even possible?

It’s been over a year since the last major update to Fluid Flux, and while I often call updates ‘big,’ this one truly stands out. The update 3.0 is massive, bringing significant improvements in performance, stability, and memory management, along with many new features and enhancements. So much has been added during development that I might struggle to list every improvement here—I honestly lost track somewhere along the way while adding all kinds of exciting new functionality!

Demo

The new demo is already available on itchio.com. During the development, most of the focus was on improving maps and extending functionalities.

  • The Island level received a crucial update with an underwater tunnel example.
  • The beach map was changed to more rainy and foggy conditions to present new particle system integration and how Fluid Flux works in different weather conditions.
  • The coastline map will work much faster now as performance has dramatically improved with new rendering optimizations.
  • The ocean map was extended by the Large World Coordinate test and dynamic wind. 
  • SectionMap uses a new glass system instead of building in section mesh.

If you’re enjoying Fluid Flux, appreciate the update, and want to see more improvements like this in the future, I’d be grateful if you could leave a review. If you haven’t tried Fluid Flux yet, you can purchase it on FAB.

Before updating your project

The new version only applies to Unreal Engine 5.3+ and higher, and there will not be any updates for the older engine versions.

All levels were updated, performance improved, and quality and reliability improved. Due to this update’s extensive scope, certain aspects might have been overlooked during the development and testing phases. To ensure a smooth transition, it is strongly recommended that you make a copy of your project before downloading the update.

Please read the detailed Package Update/Installation Process.

Underwater glass

The biggest and most spectacular feature of this product is the glass system. Example presentations generated millions of views on my X, and I believe many users will find even better, more spectacular use cases than mine.

The glass system is built on three cooperating mechanisms integrated with BP_FluxSurface actor:

  1. Masking surface – The geometry of the glass volume is captured to SDF (signed distance field), and then the result is used to cut holes in the surface mesh.
  2. Filling holes with glass – BP_FluxGlassActor can render any mesh as glass and sample water height to apply post-process effects like waterline refraction and absorption. You can use as many glass actors as you need, but be aware that calculating data about water requires heavy computations calculated per vertex. Glass meshes need to be quite dense to work correctly and also use multiple layers of transly1
  3. Lighting in the tunnel – The volume mesh absorbs the light inside the tunnel to simulate underwater scenes lightened by watercolor.

Glass system still has many limitations:

  • The whole Tunnel area should be covered by the SDF domain, which is 3d texture and may require a lot of memory when stretched on a large scale. I plan to address this limitation by implementing Virtual texturing in the future.
  • Glass mesh can receive shadows. It’s translucent, so it’s mostly not noticeable, but it still sometimes may break the visual appearance.
  • Baking spline mesh to SDF is slow and requires many additional steps, confusing new users. I plan to improve it by moving the whole implementation to Niagara.
  • Cutting holes in the surface using the SDF may sometimes look imprecise; increasing resolution can fix those bugs but also exceed memory budgets.

The old fluid cross-section was removed from the surface actor. Use BP_FluxGlassSection (example on FluxSectionMap) to achieve the effect of the water volume cut. Moreover, the new glass rendering mode does not interfere with underwater surface rendering, and the base water shader has been simplified by removing Seciton branches.

Improved underwater volume and surface rendering in underwater section glass after upgrading to a new glass system.

 

Underwater light

Another long-awaited feature introduced in this version is underwater lighting. A New system simulating underwater scattering and working with single-layer water mode is a huge step forward in expanding the possibilities of building the underwater world. There are many ways how underwater lights can be used in your projects:

  • underwater bathyscaphe,
  • lights from a helicopter lighting the water,
  • underwater lights directing the player,
  • rivaling underwater cities,
  • underwater diving with attached flashlights,

The underwater light system brings many exciting features:

  •  Efficient point light implementation (BP_FluxPointLight )
  • Advanced spotlights (BP_FluxSpotLight) implemented as volume ray marching with dithering. Support projecting texture and generating light shafts.
  • Light propagation medium water and air splits the light into two colors.
  • Integration with built-in unreal light system shadow mapping
  • An unlimited number of lights. The system used a system similar to deferred rendering that is drawing lights as meshes
  • Nonphysically correct but controllable scattering and projection intensity provide more variety and allow adjustments.
  • The system can be used with underwater glass. 

Water decal

This feature was added at the request of the user who needed to render decals on water. (Yes, you can have an impact on this project!). After a few tests, I noticed that it is doable and may be valuable for many projects. The new decal actor (BP_FluxDecal) uses unique programmable material that can be implemented in many different ways based on the requirements of the designer; it provides additional functions that generate Decal UV projection and information about the side of the water currently rendered.

The default example decal material uses the Fluid Flux icon texture, but many exciting effects can be implemented with this system:

  • gameplay indicators,
  • rendering additional foam animation,
  • dirt and dust projection on water,
  • blood or oil stain on the water

This feature has a lot of potential, so in the future, I plan to extend it by implementing decal-like volumes and simulated fluids on top of the water surface, which are advected by base fluid velocities.

Static mesh converter and baking

The static mesh mode is the most efficient way to render fluid flux water surfaces. Still, since releasing the Fluid FLux 2.0, it has been entirely forgotten, and it’s time to introduce significant improvements in this topic.

In Fluid Flux 3.0, the static mesh generator was rewritten to a new separate editor actor tool called BP_FluxSurfaceMeshGenerator. The new tool uses the Geometry Scriprs Plugin introduced in Unreal Engine 5, so don’t forget to enable it in your projects!  

What changed:

  • This new tool is now separated from the BP_FluxSurface actor, making the interface cleaner and more encapsulated.
  • The new wireframe preview option dramatically improves the visualization of exported meshes.
  • Baker optimizes mesh density using fast built-in engine geometry scripts, so geometry density is better distributed.
  • Performance issues related to reading render targets were addressed, and the whole generation process is working over 50 times faster.
  • The new static mesh generator provides more precise results and supports bigger meshes, thanks to shortening generation time.
  • Exporting is simplified as the target mesh can be pinned to the blueprint and overridden every time it changes.

The video below presents the optimized output mesh generated in the editor with wireframe preview enabled:

Unfortunately, there are still some limitations:

  • Geometry Scriprs works only in the editor, so generating static meshes in runtime is no longer supported.
  • Generating huge meshes may take some time as the system is implemented partially in blueprints.
  • The generator works only for rivers and lakes. Building static mesh for the ocean does make sense, as it should be dynamic.
  •  The output mesh can’t be blended with the ocean because it uses another surface rendering mode.

Buoyancy Editor

The buoyancy editor is my first attempt to make an editor based on a 3D preview viewport. Previously, configuration buoyancy was quite a challenge as it required restarting the game using temporary debug pontoons and the trial and error method to find proper values. Now it’s different! You can see the preview of pontoons in a separate editor. Configure it in the editor view and watch your adjustment in runtime! All changes are saved in the bouncy data asset to be easily shared between different bouncy components and managed in the content browser.

The EUW_BuoyancyEditor editor can be found in folder /FluidFlux/Editor/Blueprints/ and run by clicking RightButton -> Run Editor Utility Widget.

A tutorial presenting all editor options and documentation describing the workflow is coming soon.

Unified velocity advection

This update brings many changes in how the velocity of the simulation is interpreted inside the Niagara particles and surface shader. In the previous version, the speed of surface waves differed from that of particles advected on the surface. This inaccuracy is fixed by unifying velocity units and transferring them into world space. This improvement allowed me to create exciting examples like advected foam and bioluminescent plankton.

 

As a result of changes, the BP_FluxRotatorActor (FluxRiverMap) detects water velocity correctly, and rotation is calculated precisely from the fluid flow. It is a good start to create complicated mechanisms driven by the simulation.

 

Another fantastic improvement is calling the water speed depending on the depth relative to the surface; this change gives a more realistic effect for objects deep in water as they move slower. The image below presents the scale of velocity when depth changes. This means the FluxData component output may differ depending on the sampling height. The change also applies to all particles in water; the dust on the surface will move faster than dust deep in water.

Chart showing how water speed decreases with depth. The speed drops off exponentially, approaching very low values around 100 meters

Vehicles

Until now, example demo boats were working as floating meshes on water, but Fluid Flux 3.0 introduces a new drivable motorboat implementation that extends this functionality and provides valuable examples:

  • The boat actor uses the new bouncy system configured using a bouncy data asset.
  • Movement is controlled by a single force pushing from the motor attached behind. Parameters of speed and engine can be easily adjusted.
  • Get close to the bot and press E to start driving the vehicle.
  • Additionally, the demo boat implements camera movement with direction adjustment, and it was tested in multiplayer.
  • The implementation can be extended to work as a ship or another type of vehicle.

Rain particles

Some of you asked about integrating the Fluid Flux with other water systems like UDS or Infinity Weather. I cannot provide it yet, but at least this update introduces more functionalities and examples addressing weather-related limitations. I’m presenting a new Niagara particle effect integrated with water that simulates raindrops:

List of features:

  • The effect implemented in the Niagara on GPU.
  • The Niagara effect needs to be used with BP_FluxNiagaraActor to read the information from Fluid Flux water.
  • The system spawns a minimum number of rain particles around the camera and automatically repositions when the camera moves.
  • The spawning area moves with the camera, so it’s essential to set a new BP_FluxNiagaraActor.InfiniteExtend=true flag; otherwise, the effect may disappear when the actor is not in the camera frustum.
  • The collision between the water drop and the fluid surface is made by sampling the surface and comparing the difference between water height and particle position.
  • Spawned particles support three rendering states:
    Water drops spawn particles in camera space and render stretched drops with refraction.
    Water splashes – animated splash billboards generated when a drop hits the water surface.
    Water rings – animated raindrop rings generated when a drop hits the water surface, and moves with the water flow.

Large World Coordinates

The improved version of Fluid Flux handles LWC (large world coordinates) and should work correctly at a distance of up to 150km from the center of the level on the x and y axes. This use-case can be tested on the FluxOceanMap, where you can find the teleport actor that will move the character to another location far from the center of the map. I won’t spoil what else is there; you should try it yourself!   

Pushing Fluid Flux to its limit is crucial for me; therefore, many tests were made on large-scale coordinates. However, it’s important to notice what is the status of this feature:

  • I’ve addressed and improved everything I found: underwater post-process glitches, simulation domain update bugs, disappearing surface meshes, swimming detection, Niagara particle warnings
  • This does not mean the coastline or simulation domain can cover 150km of area. For now, the system is mainly ready for ships traveling through the open ocean.
  • LWC required a workaround based on a respawning effect every few kilometers, which is automated in runtime. However, you may notice some glitches in the editor preview that can be fixed by repositioning the surface actor.  Debug help menu previews show distance from the center.

Underwater

A new curve-based waterline configuration is an entirely new way to set up the precise appearance of the waterline’s refraction light transmittance, shadow, and blur.

Curves representing effects on waterline (red = shadow, green = blur, blue = color, alpha = refraction)

In previous versions, the underwater post-process caused a noticeable banding effect in dark waters due to very low scattered light. The latest update mitigates this issue by using white noise to mask the imperfections.

Notice the soft inrerpolation of the colors on t he right side of the screen.

Other improvements

Optimizations

High performance is crucial for this project. I decided to extend the surface rendering system to select material permutations based on the effect active in a specific area. This means that the system selects possibly the cheapest material by excluding the code needed for rendering simulation/coastline/ocean waves, depending on what the player sees. This change gives a significant performance boost, especially on coastline maps (at least +10 FPS) that previously were the most expensive.

Wind Direction

Additionally, the FluxOceanWave actor supports dynamic changes in wind direction. The blueprint function can control it. The example is presented in the OceanMap level blueprint that randomizes wind and direction every few seconds.

Gernster water (experimental)

The Fluid Flux wave system uses prebaked FFT water animation. This solution is efficient and visually appealing, but unfortunately, it is not configurable enough, and ocean waves look almost the same in every project. New Gerstner water mode is my first test to make water movement more realistic and configurable.
Right now, only surface materials support Gernster water, which means it is only a visual effect because gameplay can’t read water surface height from it yet.

Exporters

  • Unified fixed, improved, and cleaned exporter code now exporting should cooperate better with the repositories.
  • Fixed repetitive patterns on the ocean after exporting the coastline domain data.

Surface actor improvements

  • Added soft references to external content. 
  • Support for nDisplay, raytracing, and path tracing (Experimental with limitations)
  • Added SDF masking support
  • Improved underwater visibility detection
  • Added surface mesh modes based on instanced mesh and configurable mesh dentistry
  • Custom editor for color preset data assets with automatic preview in the editor (Open SurfaceEditorTab)

Use cases

For example, demo levels get a bit complicated. They may look overwhelming for new users, so I added a folder called Demo/Maps/, where I plan to put more straightforward examples, presenting the basic configuration and testing scenario for a specific setup.

Please let me know if you need some specific use cases. 

Future

I never imagined that so many developers would use my product, and this is an excellent opportunity to thank you for believing in my project and using it in many spectacular ways. I am always impressed with your work, and it fuels me to do more stuff, so please don’t forget to share your creative projects with the community on my Discord!

  • Substrate – A separate path for substrate UE 5.5 will be released soon.
  • Scalability – I know you need more extensive simulations, coastlines, and worlds, and I plan to address that.
  • Multiplayer – I plan to implement multiplayer for ocean, coastline, and pre-baked simulation states.
  • Plugin – A new C++ version called Fluid Flux Plugin is currently being developed.
  • Documentation – I plan to rewire documentation and supplement it with additional videos.

That concludes the update. I want to thank everyone for their patience and for discovering and reporting many bugs and improvements. Seeing my pack being used in your unique projects has been gratifying. Thank you all!

A new C++ version called Fluid Flux Plugin is currently being developed. The new version is nearly complete, and it will be available early next year (2025).

For now, I can only present a short list of differences in the first release of the Plugin:

  • Improved usability, enhanced editor tools, and better integration with Unreal Engine UI
  • Simulation domain implemented in Niagara and new spline modifier
  • Whole blueprints code rewritten to C++ (Github access)
  • Improved performance (mainly CPU related)
  • Better sequencer support

The Fluid Flux Plugin will be primarily targeted at larger studios and experienced developers, and it will be released as a separate product on FAB. While it’s not exclusive, please note that modifying the C++ version will require programming skills and some extra work on transferring existing projects, which I did not want to force on current Fluid Flux users.

What about Blueprints after the Plugin release

Many concerned developers ask about the blueprint branch of the Fluid Flux. The excellent information is that The new programmer has joined to work on C++, so I can still focus on updating blueprints. 
I plan to continue adding new features and enhancing tools as long as possible.

However, I am unable to tell for how long I can support two different branches of the product. I will evaluate the situation after one year from the Plugin release (early 2026). A possible scenario is that I will switch focus to the C++ version and only provide minor improvements and engine-related updates to the blueprints. However, my final decision depends on many factors, such as:

  • Interest in Pluign in comparison to the Blueprint version. If most users decide to switch and prefer to use Plugin, then there is no reason to continue development.
  • Whether the BP version can still evolve, the blueprint’s limitations block many features, and at some point, adding another workaround may be too problematic.
  • The complexity of transferring asset-related changes between the two versions. It may be exaggerated significantly when the differences between the two branches of the project are growing.

This information may concern those who have already invested in the Blueprints version of my product and are now interested in using the Plugin. I understand that, and I am looking into possible discounts for current owners of Fluid Flux.

However, there are also some voices of dissatisfaction in reviews that I feel obligated to address by reminding that:

I sell the products ‘as is,’ and customers should base their decision on the product’s current state (demo and feature set), not on theirs future expectations or announced features.

I don’t sell promises, future versions, my free time, or lifetime updates. I also don’t work for markeptlace clients. Please avoid basing your project’s timeline on unreleased features.

Every update is an additional effort driven by my passion for creating. Being obligated to complete something by a specific deadline can cause stress, and I prefer to avoid it.

 

Thank you for understanding

This document provides essential guidance on reporting system errors. Learn how to identify, report, and analyze bugs to ensure smooth support.

Before requesting support

Most of the issues are already known and can be easily avoided by you, which is why I prepared this checklist.

  1. Check the product’s limitations; there is a chance that your use case is not handled yet.
  2. Ensure that the bug is not listed in the ‘known issues’ of the product. 
  3. Read the documentation, mainly focusing on the chapters titled ‘Solving issues‘, which cover the most common problems.
  4. Check the marketplace launcher and ensure you use the newest version of the product.
  5. Ensure you are my client and use the product from legal sources; support may require verification.

Discord support threads

The support channel is based on thread conversations. Every question/request will start from a new thread, which makes it easier to follow separate discussions and provide direct support.

  1. Use the support channel ONLY if you have bought my product and need my help.
  2. Use a general channel to talk with other people on Discord.
  3. The bot will create a new thread after you send a question to the support channel.
  4. Add more details in your thread per the chapter “Preparing bug report.”
  5. Don’t stack multiple questions at once. Let’s focus on a single problem and solve it one by one.
  6. Write only in your thread; don’t start another thread conversation until your problem is solved.

Please obey the thread’s rules; otherwise, you will not get my support and can be suspended for a while.

Preparing bug report

I’m doing my best to help everyone, fix all bugs, and work around the engine limitations, but some configurations may still cause problems. Reporting issues helps improve the product. Preparing a precise bug report is crucial in increasing my response time and chances that I will solve the problem and show professionalism. 

  1. Write information about your configuration.
    • The Unreal Engine version you use
    • List of specific config settings enabled in the project (Lumen, Ray Tracing, Path Tracing, Forward Shading, Nanite, Substrate, and everything that you think could cause the issue)
    • Development Platform (Windows, Linux, MacOS)
    • Target Platform  description(VR device, Mobile, MacOS)
    • Add information if you can see the same issue in the example demo maps
  2. Prepare visual materials presenting the problem
    • short video
    • screenshots
  3. Write a clear and detailed explanation with the steps needed to recreate the problem on my machine. 
  4. Explain the result you want to achieve after solving the issue.
  5. Attach a minimal project presenting the issue (see below for a description of how to do it).

Minimal project

The easiest way to receive fast and direct support is to send me a minimal project demonstrating the problem. This reduces the time needed to reproduce the issue on my PC, which is often the most challenging part. Please read the description below to ensure that the minimal project aligns with the requirements:

  1. Download my product into the small (empty) project and reproduce the bug.
  2. Prepare repro steps.
    • Add information on which level should be opened
    • Add a list of steps to repeat to see the bug in your map
    • Add details on testing the target platform
  3. Minimalize the size of the project:
    • Remove all content (textures/meshes) that are not crucial for the presentation of the bug,
    • Remove “Intermediate”, “Saved”, and “Build” folders,
    • Disable all external plugins and ensure the project does not depend on them.
  4. I do not download files from unknown sources, so you must verify yourself by sending me the order ID via email or private conversation/email.
  5. Make sure that the bug can be reproduced with your description. Test it!
  6. Pack it (zip), upload it on the server, and send the link to me via support email at imaginaryblend@gmail.com. 

Don’t share minimal projects publicly on Discord or the marketplace questions tab. Always use the support email for sending the files imaginaryblend@gmail.com.

Reducing support response time

I receive numerous support requests and questions daily. Good communication practices and rules can simplify our work, reduce stress and irritation, and save time.

  1. Please use the support email or marketplace questions tab (I prefer it to Discord). Don’t ask for support in the YouTube/X comment section.
  2. Be precise and professional. Please give me as much information as possible (read: preparing bug report). I always respond faster to requests when they are clear and easy to understand.
  3. Be polite and patient; support may take a few days. If you don’t hear back, please send your request again or message me on the Marketplace Questions Tab. Your message might have gone to spam, or I missed it.
  4. I do not download files from unknown sources, so you must pass verification. The only way to verify is by sending me the order ID via email or private conversation/email.

Now you can report this bug by sending an e-mail to imaginaryblend@gmail.com

Introduction

 
Fluid Flux Update 2.1 brings a set of important bug fixes, stability improvements, and modifications added as a direct response to support requests, which makes the user experience even better. The new version of the pack is compatible with Unreal Engine versions 4.26 – 5.3. A detailed list of changes and a roadmap presenting what is planned can be found on Trello.
 

Before updating the Fluid Flux in your project please read carefully the Package Update Process. Following the update procedure ensures a smooth transition and minimizes the risk of potential issues arising during the update process.


Infinite Ocean example map

A new example map in Fluid Flux 2.1. The new map showcases the infinite ocean setup and large-scale stormy waves. This simple example does not use any domains, which makes it super efficient.

TSR Motion Vectors

I’ve improved motion vector generation in surface material, significantly improving water rendering quality. I’ve also added slope velocity, which fixes noisy smearing on the waterfalls. The new motion vectors generated from world position offset work well in Unreal Engine 5.3, so I recommend switching to the latest engine version). For the best experience, use this configuration in your project settings:

  • Velocity Pass = Write During Base Pass
  • Default Renderer Motion Vector Settings = Precise

Minor issues and bugs may still occur on distant water, and I will work on them in future updates.

Underwater shaders

  • replaced old nosy random-based circle blur with a 5×5 Gaussian blur.
  • Fixed underwater post-process masking. Now, the post-process disappears when the camera is under the ground map.
  • Added underwater visibility enum in the surface actor that allows forcing visibility of underwater post process. The new InsideContainer mode allows rendering post-process through glass (an example of use with glass material will be presented in the next update).

Ground and Domains

  • fixed foliage filtering, UseFoliageMeshes works properly now.
  • Improved the ground map and phantom meshes debug rendering.
  • Enhanced performance of ground map rendering and building the visibility list.
  • Fixed rendering of distant landscapes with a lower level of detail.
  • The coastline domain can now cut out fragments of the ocean on the landscape.
  • Fixed brush editing when the initial state is active.
  • The “Current state” in domains changed to transient fixes memory crashes.
  • Domains will not update when dragging actor move, only after the drop.
  • Fixed simulation streaming on a separate level.
image.png
The area is submerged below the ocean’s surface, yet a phantom mesh excludes the water, allowing players to access this region.

Other improvements

  • Adjustments for distant surface rendering. I added OceanWaveRange and OceanWaveFaloff parameters that give additional control.
  • Fixed weird overburned emissive when the camera is very high.
  • More than four buoyant pontoons have been supported since now.
  • Fixed all buoyancy problems in shipping builds.
  • Added the tag FluxBuoyancyOwner that allows specifying the target actor for pontoons attachment.
  • IsSpartiallyLoaded = false in all crucial Fluid Flux actors fixes world partition bugs.

Enhanced input

Switching to Unreal Engine 5 unlocks the possibility of using all of its goodies, and the Enhanced Input is one of them. The whole input implementation is now stored in data assets, which can be included in the product. Fluid Flux does not require downloading any additional config files.

I’ve also cleaned up the character implementation and moved world control to the player controller, making it easier for everyone to understand.

Demo on itchio

The executable demo was also updated and published on Itchio. There are many reasons for that change:

  • This platform is a bit more professional than Google Drive links and may feel safer for others.
  • I can send notifications about the new version to everyone who has my demo in the collection.
  • I can also push many builds (mobile, VR, PC, Linux, Mac, Vulcan) and manage them better without replacing links on the marketplace page and in my videos.
  • Everyone can comment, and I can see additional details about downloads/users.

What Next

This update will be the last one supporting UE 4.26 to UE 5.2. Moving forward, my focus will shift exclusively to updating the package for Unreal Engine 5.3+. I apologize to everyone who is unable to transition to UE5.3 at this time. There are several reasons for this decision:

  • TSR doesn’t look acceptable on early versions of Unreal Engine 5, which makes working with it uncomfortable. I highly recommend switching your projects to Unreal Engine 5.3.
  • Creating a package with backward compatibility for older versions of UE is time-consuming and requires excessive effort. I prefer to spend this time on improving the product.
  • This shift will open up many exciting possibilities for optimizations and improvements, making my work much more manageable.