Skip to main content
← Roadmap
🌊 Oceanology ProIn Progress6.0.0

Open-world support: HLOD, streaming and AI queries

Water behaves correctly in a World Partition world — it HLODs at distance, streams with the level, and AI can query whether a location is in water for pathing.


Water is a difficult citizen in a streaming world. It is enormous, it spans cells, it needs to know about landscape it cannot see, and it is expensive to draw at distance. Oceanology Pro is wired into World Partition rather than sitting on top of it: zones publish their own actor descriptors and streaming bounds, bodies build simplified HLOD meshes, per-body baked data serializes into the body's package so it streams with it, and AI can ask whether a point is in water without any of that being loaded.

World Partition

  • The Water Zone publishes its own actor descriptor carrying Overlap Priority, plus explicit streaming bounds. In the editor a water body resolves which zone owns it by scanning intersecting actor descriptors, including zones that are not currently loaded, so the serialized assignment is correct regardless of what happens to be streamed in at the time.
  • Zones listen for levels being added and removed and rebuild only when an actor that genuinely affects them changes. Landscape heightmap streaming and landscape component changes re-render the Water Info texture.
  • Water bodies and islands declare the engine's Affects Landscape actor-descriptor property, so landscape builds can see them without loading them.
  • Infinite mode turns the Water Info texture and the quadtree into a sliding window around the view that is regenerated at runtime, so an ocean is not bounded by the zone extent.
  • Shallow-water simulations in Fixed Bounds mode are spatially loaded and stream with their bounds. A Follow Water Info simulation stays resident, because its window migrates with the view.
  • A water body's baked rest-state cache is outered to the body actor, so it serializes into that body's package and streams in and out with it.

HLOD

Water components return a custom HLOD builder. It takes each body's HLOD mesh description, converts it to a dynamic mesh and runs quadric edge-collapse simplification to a maximum error derived from the HLOD's own minimum visible distance. The error budget is literally the world size of one screen pixel at that distance, computed against a 1920 by 1080 view with a 45 degree half field of view, so simplification goes as far as it can while staying sub-pixel. The result is assigned the body's Water HLOD Material and batch-built as a static mesh. The HLOD hash covers the component transform, the mesh description and the HLOD material, so an HLOD rebuild is triggered only when the body actually changed.

Static meshes for streamed water

Separately from HLOD, any body can generate a static mesh for rendering outside the water zone's dynamic tessellation. Turn on Enable Water Body Static Mesh, and optionally Section Water Body Static Mesh to split it into tiles so sections stream in and out instead of holding the whole body resident.

AI and navigation

  • An EQS test, Inside Water Body, scores query items by whether they fall inside any registered water body. It runs a Compute Immersion Depth query across every registered water component and exposes Include Waves, Simple Waves and Ignore Exclusion Volumes. It registers itself as a high-cost test, so filter your item set before running it.
  • Water bodies can stamp a navigation area class onto the navmesh and re-run the navigation update when their shape changes, so boat AI and land AI can read the same water straight from the navmesh.
  • An infinite ocean can skip collision generation entirely, which is aimed at large multiplayer worlds that only need direct water queries and client-side underwater post process.
Water mesh cap256 tiles per axis; tile size halves until compliant
GPU quadtreer.Oceanology.WaterMesh.GPUQuadTree (default 0)
Water tile occlusion cullingr.Oceanology.WaterMesh.OcclusionCulling (default 0), up to 256 queries
Water info resolution capr.Oceanology.WaterInfo.RenderTargetResolutionMax (0 means uncapped)
Shallow water VRAM per simulation48 MB by default
Shallow water VRAM per world256 MiB shared, clamped 32 to 4096
Pause when water is not renderedOn, with a 0.25 second grace period
Static mesh section size (default)8192 cm
Infinite window extent (default)51200 x 51200 x 10000 cm

This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.