Millpond
A pond to throw stones in, for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. Your clip becomes the bed of a pond, seen from straight above through the water, and the water obeys linear water-wave theory exactly. Every frame the surface goes through a Fourier transform on the GPU, and each wavelength is moved on by the phase the dispersion relation gives it (gravity, surface tension and depth) and damped at the rate viscosity gives it. There's no time step to go unstable and no numerical dispersion; the dispersion is the formula.
What comes out of that is what a dropped stone actually does. Surface tension gives water a slowest speed at which a ripple can carry energy, 17.8 cm/s, so the ring has still water inside it and an edge shaped like an Airy function. Long waves race ahead of short ones. In a centimetre of water the long waves are held back to the speed the depth allows. The banks can be open, where whatever leaves never comes back, or walls, which reflect exactly, to every order.
A skimmed stone loses about the same energy at every bounce, so its hops shorten linearly and quicken as a square root, and after the last one it sinks with a full-sized plop. The Skim button throws one along a heading and the water does the rest. Rain is a Poisson process of small drops, audio onsets drop pebbles, and the level can make the rain heavier.
The light is the other half. The camera's ray bends at the surface by Snell's law and lands on the bed a depth below, so the picture wobbles by as much as real water would move it. Sunlight refracted through the same surface is splatted onto the bed as a mesh whose triangles each carry their own light, so the caustic net keeps all its light however rough the water gets, and the sun's size blurs it by the depth. The sky reflects by the exact Fresnel term, and the sun glints wherever a ripple points it at the camera.
- Exact linear water waves: capillary-gravity dispersion on finite depth, viscous damping, on the GPU
- Drop, Skim and Still buttons; pebble size, splash and scatter; a skim's heading, speed, angle and bounces
- Rain as a Poisson process, and audio: onsets drop pebbles, the level thickens the rain
- Open banks that absorb, or walls that reflect exactly to every order
- Snell refraction of the picture, a light-conserving caustic net, Fresnel sky and sun glints
- Height, Slope and Caustics views, for the water on its own
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and early days. It's been loaded into Resolume Arena 7.27.1 on Windows, on a software rasteriser in a VM with no GPU: Arena registered and listed it, all 40 controls came back as declared, the shaders compiled, it rendered, and Arena logged no errors. The probe's control sweep never presses Drop or Skim, so it couldn't see the five controls that only shape the next pebble or skim. It's never been loaded into Arena on macOS, and nothing is known about how it performs on Windows. No real audio has reached it in a host, so Resolume's 64-bin FFT mapping is still an assumption. Everything else is measured against the physics by tools/verify.sh: the GPU's rings match the exact Cauchy–Poisson integral to 0.006–0.019% of the ring with and without surface tension, the disc inside the ring is still and its edge sits within 1.2 cm of the Airy prediction, nothing outruns √(gh) in a centimetre of water, walled water is its own mirror image to 3.6e-5 and open water keeps none of its energy, the picture moves by Snell's law to 0.036 mm, the reflection is the Fresnel term to 1.8e-4, the caustic net keeps its light to 0.2% under heavy rain, flat water changes nothing, a skim's hops shorten linearly, the rain is Poisson at the rate asked for, and every host GL binding comes back as the host left it. It catches all thirteen wrong models built to trip it, and all 31 controls measurably change the picture. On macOS it costs 0.9 ms a frame at 720p, 1.0 at 1080p and 2.4 at 4K. It's linear theory, so there are no breaking waves or splash crowns. There's a browser demo, which is a port rather than the plugin, but no OpenFX port and no user guide. Try it in your own rig before you trust it in a show.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead