Stoatworks Labs

Millpond

Ripples for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Millpond — Ripples for Resolume
No screenshot — this one is configuration inside another application.

What it does

An FFGL effect for Resolume Arena and Avenue. The 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 advanced by precisely the phase the dispersion relation gives it — gravity, surface tension and depth — and damped at the rate viscosity gives it. There is no time step to go unstable and no numerical dispersion; the dispersion is the formula.

What falls 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 of the depth. Banks can be open, where what leaves never returns, 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 thicken the rain.

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 exactly 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 conserves the light however violent it gets, and the sun's size blurs it by the depth. The sky reflects by the exact Fresnel term, and the sun glints where 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 honestly early. The water is measured against the physics rather than asserted, and tools/verify.sh runs the lot: the GPU's rings agree with the exact Cauchy–Poisson integral for the same crater at every grid point to 0.006–0.019% of the ring, with and without surface tension; the still disc inside the ring is still to 0.01–0.77% of its height and its edge sits within 1.2 cm of the Airy prediction; in a centimetre of water nothing outruns √(gh); 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 at two rasters; the reflection is the exact Fresnel term to 1.8e-4; the caustic net conserves light to 0.2% under heavy rain and focuses by the landing map's Jacobian with the sun overhead and oblique; flat water is the identity; a skim's hops shorten exactly linearly; the rain is Poisson at the rate asked for; and every host GL binding comes back as the host left it. Thirteen deliberately wrong models are all detected, and all 31 controls measurably change the picture. Render cost on macOS is 0.9 ms/frame at 720p, 1.0 at 1080p and 2.4 at 4K. It has 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 and it rendered, and Arena logged no errors. The probe's control sweep never presses Drop or Skim, so it could not see the five controls that only shape the next pebble or skim. It has never been loaded into Arena on macOS, and nothing is known about its performance on Windows. No real audio has reached it in a host, so Resolume's 64-bin FFT mapping remains an assumption. It is linear theory: no breaking waves or splash crowns. There is a browser demo, which is a port rather than the plugin; no OpenFX port and no user guide. Check it in your own rig before trusting it in a show.

Watch it running

Millpond video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead