Stoatworks Labs

Flenser

A liquid light show, for Resolume

Releasedv0.1.4Plugin & ModuleC++ / GLSL
Flenser — A liquid light show, for Resolume
Four looks rendered by the plugin's own offline harness, which drives the real plugin class through a headless GL context — not a Resolume screen capture. Clockwise from top left: the wheel seen through a projector's own round gate; the Ink palette, where the crossings go dark because the dyes multiply; a clip put where the lamp was; and the same clip with the dye taken out, so all that is left is the lens at each cell's edge.

What it does

A liquid light show is two watch glasses clamped face to face with a few millilitres of oil, water, alcohol and dye between them, sitting on the stage of an overhead projector. The lamp is under it, the lens is over it, and the operator squeezes the glasses and lets the heat do the rest. It is the look of a 1967 ballroom and of every Optikinetics Solar rig since, and it is one of the few effects here that is a physical thing before it is a shader. Flenser models the physics rather than the appearance, and four behaviours follow from that.

The colour is subtractive, and that is most of the difference. Every cell is a dye filter, so light going through two of them is multiplied twice: cyan over magenta is blue, cyan over yellow is green, and all three together are nearly black. Almost every blob effect adds instead, and adding is what makes them look like lava lamps rather than like this — the crossings come out white and the whole picture reads as glowing plastic. Here the crossings are darker than the cells that made them, and they are a different colour.

Every cell's edge is a lens. The meniscus at an oil-water boundary is the only part of the wheel doing serious optics: it displaces what is behind it, splits it slightly by wavelength, and throws a bright caustic just inside a dark rim. The middle of a cell is flat oil between two flat glasses and bends almost nothing, which is why the refraction here is an edge band rather than a whole-cell distortion. Take the dye out entirely — Saturation at zero, which is clear water — and every mark left on the picture is that.

It ships twice. Flenser is a source: the wheel with its own lamp behind it, a Fresnel hot spot, a colour temperature and a round gate you can open out to full frame or close down to the clock glass it started as. Flenser Lamp is an effect that puts your clip where the lamp was, so the footage is what shines through the oil, gets dyed by it, and bends at every meniscus. Both read the same eight presets, from Overhead Projector through Ink in Water to Alcohol Burn.

Everything is a pure function of position and time — no feedback buffer, no accumulator, no frame history. That is a constraint taken on deliberately rather than a shortcut: it means any frame renders on its own, scrubbing shows the wheel at that moment instead of restarting it, and the GLSL half of the model can be measured against the C++ half, which is what the OpenFX build runs. The one exception is Simmer, a bounded feedback buffer that leaves a trail behind a moving cell; it exists in the Resolume build and not the OpenFX one, because a host that renders frames out of order cannot match its own preview with one.

Also builds as OpenFX plugins for DaVinci Resolve, Vegas Pro, Nuke and Natron — a generator and a filter in one bundle, on macOS, Windows and Linux, driven by the same Oil.cpp.

  • Two plugins from one model — the wheel on its own, and the wheel with your clip as its lamp
  • Subtractive dye: overlapping cells multiply, so two colours crossing go darker and change hue
  • Six dye sets — the food-colouring pack, the subtractive primaries, the hot end only, continuous, duotone and mono
  • Merge takes the wheel from separate hard-edged beads to pools joined by a proper meniscus fillet
  • A meniscus at every cell edge: refraction, chromatic dispersion, a dark rim and a bright caustic
  • Churn deforms the cells as a fraction of the noise's own wavelength, so it cannot fold the field however hard it is driven
  • A projector behind the glass — Fresnel hot spot, tungsten-to-halide colour temperature, and a round gate that switches off cleanly at the top of its travel
  • Four ways to meet the clip: project through the oil, lay the lit oil over it, or take only its brightness and let the dye supply the colour
  • Simmer, a feedback trail that cannot run away — a ceiling rather than a gain (Resolume only)
  • Eight factory presets, shared by all four plugins from one table
  • Universal macOS bundle, a Windows x64 DLL, and OpenFX builds for macOS, Windows and Linux

Where it stands

Released at v0.1.3; the point release changed nothing but the Windows installer, which no longer touches the system PATH — the earlier one could overwrite it. What is checked is checked properly, by a harness that drives the real plugin class in a headless GL context. The model exists twice — once in GLSL for the GPU and once in C++ for the OpenFX build — and the two are measured against each other across 1,625,010 values over every control, two spans and every mirrored function, with no disagreement past 5e-4. Both builds are separately proved to leave a picture exactly as they found it when the wheel is clear: nought of 230,400 bytes differ through the Resolume build, and nought of 921,600 through the OpenFX build driven by a probe host. All 33 controls are swept and shown to reach the picture in both bundles, and the eight presets are driven against three different host behaviours in both. Two bugs worth recording were caught by building it the wrong way first, and both looked plausible on screen: the rim drawn from the merged field rather than from each cell's own boundary, which turns a dozen cells into one flat shape with a single outline round the pile; and a churn expressed as a distance rather than as a fraction of the noise's wavelength, which folds the field and turns every cell into a nest of contour lines. Still open, and it is the important part: as of v0.1.2 both Resolume plugins load and register in Arena 7.27.1 on Windows, on a machine with no graphics card — so that says the plugin is correct and nothing about how fast it is. It has never been loaded into Resolve, and two of the defects fixed before v0.1.2 were found by somebody running it on a real rig, not by any measurement here. Everything above runs the plugin directly or runs the OpenFX bundle through a probe. No Windows build has been run, and the Linux OpenFX build is proved to load on Rocky 8 by a dlopen and two entry-point calls, which is not a render. Nothing has been through a show.

Watch it running

Flenser video thumbnail

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