Skip to content

Water Blender

apps/water_blender proves the authored-water loader path end to end on a hand-authored .blend: a scene built in Blender (an Island, a Seabed, and a Water plane) renders its water purely from tags on the mesh — there is no water wiring in the Wren script at all.

A single Scene.loadBlendScene("Models/Island.blend") reads three tags:

  • Water — a subdivided plane tagged plume3d_water = "realistic" plus a look-param block (plume3d_water_shallow / _deep / _foam / _waves / _horizon / _caustic / _crest / _caustic_strength). The loader resolves the realistic variant (the water_realistic shader + its set-5 param block), draws the plane as engine water, and registers it for Graphics.cameraWaterState. Waves, a depth gradient (lighter near the shore, deep blue outward), and a shoreline foam ring where the water meets the island.
  • Seabed — tagged plume3d_terrain: renders and gets an automatic static Jolt collider; it shows through the water via the scene-depth + refraction path.
  • Island — an ordinary lit mesh; the water foams against its shoreline.

This is the surface companion to Blend Water Demo, which authors a plume3d_water_volume box for the volume + underwater path. Here the Water is a flat mesh surface.

Because the water is a mesh tagged plume3d_water, it must be subdivided for the realistic shader’s vertex wave displacement to have vertices (this scene’s Water is a ~140×140 grid) — a single-quad plane renders nearly flat. A plume3d_water_volume box instead auto-generates a subdivided surface at its top face. The tags are the standard plume3d_water* mesh custom properties.