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.
What it shows
Section titled “What it shows”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 (thewater_realisticshader + its set-5 param block), draws the plane as engine water, and registers it forGraphics.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.
Authoring note
Section titled “Authoring note”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.
Scene.loadBlendScene→instantiateWater(the tagged surface) +instantiateTerrain(the seabed + collider).Graphics.opaqueCaptureEnabled— the opaque (island + seabed) → copy → transparent (water) split for refraction + depth.Graphics.setSky/setFog/setWind/setAmbient+setPlanarReflection— the atmosphere the water reads for its reflection and horizon.