Simulate a region in the editor, bake the settled result, and ship hundreds of rivers and ponds that still answer buoyancy and gameplay queries while only the ones near the player run the solver.
Everything expensive in Oceanology Pro has a bake. A settled fluid region becomes three static textures plus a sparse CPU grid. An FFT or Gerstner ocean becomes a looping displacement and gradient atlas. Each water body's authored rest state becomes a full-precision tile that streams in and out with the body under World Partition. The result is open-world water that keeps the look and the gameplay data of the simulated version while the runtime does little more than sample textures.
Get the region into the state you want. Let a river settle, let a flood find its level, let the sources and drains reach equilibrium. Then press Bake / Update on the simulation actor. The current frame is read back verbatim, never advanced by a hidden simulation step, into persistent state, foam and normal textures plus an immutable sparse query snapshot for gameplay. Switching that region to Baked releases its live render targets entirely: no compute dispatches, no readbacks, no per-frame GPU work for that region at all. Delete Bake is a single undoable action that hands it back to the live solver. The whole workflow is five buttons on the actor: Start, Pause, Reset, Bake / Update, Delete Bake.
The gameplay snapshot stores 16 by 16 cell blocks and only allocates blocks that actually contain captured water, at full float32 precision with one coverage bit per cell. Coverage is deliberately kept separate from depth, so a covered but dry cell, a beach at low water or an exposed channel bed, is valid data rather than a hole in the world. A bilinear query interpolates only covered source cells, and only when they own at least half the footprint, then classifies the result as Uncovered, Covered Dry or Wet. That is what keeps a large collision shape from drifting past the baked shoreline and floating on nothing.
Each water body can carry its own rest-state cache: the body's authored surface height, depth, flow velocity and coverage over its own bounds, decoded to absolute full-precision values so none of the zone texture's range normalization or half-precision staircase survives into it. The default density is 12.5 cm per texel, eight texels per meter, capped at 1024 texels per axis with the cell size grown and a warning logged if a body's bounds exceed it. The object is outered to the water body actor, so it serializes into that body's package and streams with the body. It regenerates lazily in the editor and is invalidated rather than silently rebuilt when the authored shape changes, and the format carries a version so a stale tile is skipped instead of decoded under the wrong convention.
Wave sources have their own bakers: FFT, Gerstner and Spectral Gerstner. A bake produces a displacement atlas and a Jacobian-driven gradient and folding atlas, exported as persistent Texture2D assets, which the runtime resolves with a single interpolation pass instead of running the full FFT chain every frame. FFT bakes can quantize frequencies for a seamless loop. Physics does not drift away from the picture: in Baked wave mode the CPU wave data is generated from the baked recipe itself, the same resolution, patch length and loop period, so buoyancy and surface queries agree with what is on screen. If a baked atlas pair is incomplete, the source clears its physics data rather than answering from a spectrum that no longer matches.
| Oceanology NextGen | Oceanology Pro | |
|---|---|---|
| Shipping a simulated river or flood | Not possible. There was no fluid simulation to capture | Bake the settled state to textures plus a sparse CPU grid and ship it as static data |
| Ocean wave animation | Gerstner and Spectral Gerstner evaluated at runtime, with authored flipbook detail textures | The same sources plus a GPU FFT system, any of which can be baked to a looping displacement and gradient atlas resolved in one pass |
| Server-side water | Analytic wave height only | A baked snapshot gives a dedicated server the same depth, height and velocity field the client renders |
| Per-body authored data | Read from the zone-wide Water Info texture at one density for the whole zone | An optional per-body full-precision rest-state tile at its own density, serialized into the body's package |
| Shallow water bake outputs | Persistent state, foam and normal Texture2D assets, plus a sparse float32 query snapshot with per-cell coverage |
| Sparse storage | 16 by 16 cell blocks; only blocks containing captured water are allocated |
| Sample classification | Uncovered, Covered Dry or Wet, so dry-but-captured terrain is data rather than a hole |
| Rest-state tile density | 12.5 cm per texel by default, adjustable from 1 to 400 cm, capped at 1024 texels per axis |
| Rest-state channels | Water surface Z relative to a reference height, water depth, and flow velocity XY, matching the sparse grid convention bit for bit |
| Wave bake frames | 16, 32, 64, 128 or 256, default 64, snapped automatically to a valid count |
| Wave bake resolution | 256, 512, 1024 or 2048 per frame |
| Loop duration | 4 to 60 s, default 16 s, with optional frequency quantization for a seamless FFT loop |
| Patch length | 1024 to 131072 cm, default 16384 cm |
| Atlas format | HDR RGBA16F gradient and folding atlas by default, with its own mip generation and LOD bias settings |
| Baked region cost | Live render targets released; the region samples static textures and a sparse CPU grid |
| Editor workflow | Start Simulation, Pause, Reset, Bake / Update and Delete Bake, all on the simulation actor |
This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.