Stoatworks Labs

Shunt

Shapes that queue, bank up and are drawn away

Betav0.2.0Plugin & ModuleC++ / GLSL
Shunt — Shapes that queue, bank up and are drawn away
Rendered by the plugin's own offline harness, which drives the real plugin class through a headless GL context — not a Resolume screen capture. Five discs entering from the left, banked up against the head of the queue with the newest overlapping the one in front, shaded and hue-spread along the train.

What it does

Two FFGL plugins for Resolume Arena and Avenue, from one core. SW Shunt is a source that draws its queue over its own background on its own layer; SW Shunt Mask is an effect that draws the same queue over the clip it sits on, or cuts it into it — reveal the clip only inside the shapes, hide it only inside them, or tint it through them. Two bundles rather than one because FFGL resolves a single entry point per binary.

The mechanism is an accumulating conveyor, which is what a shunting yard is. Shapes are released from one edge at a steady cadence and run in at a steady speed; the head of the queue stops at the distance you set and everything behind it stops one gap further back, overlapping the shape in front. Each one stands for its dwell and then carries on off the far side — so the queue empties from the front while it is still filling from the back.

How much those two overlap is one continuous control rather than two modes, and that was the design decision worth taking care over. Turn Dwell down and shapes cross slowly: the head is still leaving as the fourth one arrives, and the train never stands complete. Turn it up and they cross fast: the whole train is standing before the head moves at all, then it peels off one at a time. Everything in between is reachable and nothing in the code branches on it.

The gap is offerable in two units because neither substitutes for the other. In multiples of the shape's own thickness, one means edge to edge and anything below it is overlap — and the train still looks right when the size changes. In absolute pixels it is exact, so it can be matched to a fixture pitch: a 64-pixel gap measures 64.00 pixels at 1080p and at 720p alike.

A shape's place is a closed-form function of its slot and a single phase number. There is no queue object anywhere, nothing asks whether the shape in front has left yet, and no frame depends on the one before it. That falls out of one choice — the slide speed is derived rather than set, so every shape's run is exactly one cycle long whatever slot it stands at, and the runs tile the cycle exactly. The procession therefore cannot drift when the host's frame rate sags, any frame can be rendered on its own, and locking the whole thing to the track costs no separate code path.

  • Two plugins from one core — a source with its own background, and an effect that masks the clip
  • Eight primitives — circle, square, triangle, hexagon, star, cross, ring and bar — with stretch, roundness, outline and edge softness
  • Entry from any of the four edges, with the shape's angle measured from the direction of travel so changing sides does not mean re-dialling it
  • Gap in multiples of the shape's own thickness, or in absolute pixels for a pixel map
  • Dwell as one continuous dial from a queue that never stops to one that stacks completely before anything moves
  • Newest shape drawn on top, with the draw order rotating as the queue turns over
  • Free-running, beat-locked, bar-locked, or driven entirely by an external Phase control
  • Four mask modes on the effect — shapes over the clip, reveal, hide, or colourise through them — and a matte or inverse matte from the source, for another layer to key against
  • Lanes: each new set of shapes steps across the frame, or jumps to a random lane never closer than one shape to the last
  • Drop shadows falling away from the same light the shading uses, each landing on the shapes it has slid over
  • Pictures on the shapes — one image, every image in a folder, or a sprite sheet cut into a grid; the same on every shape, random, or in order
  • Seven factory presets, and a hard edge when the output is feeding fixtures rather than a screen
  • Universal macOS bundle (Apple Silicon and Intel) and a Windows DLL

Where it stands

v0.2.0, and still honestly early. It answers the first field report, from the operator who asked for the plugin: the source's Mask Mode and Mix did nothing in 0.1.0 and now make a matte and fade the output, and lanes, drop shadows and pictures on the shapes are new — each with its own measured check, and all 47 controls shown to reach the picture; its Windows build passed the Arena gate in Resolume Arena 7.27.1 before release, with all 50 controls per plugin as declared and a picture loaded into the new Image control. The rest of this note is the record from 0.1.0, the first release. The geometry is measured rather than asserted: an offline harness drives the real plugin class in a headless GL context and reads the answers off rendered frames — 27 shapes landed within 1.5 px of an independent prediction across four entry sides and five aspect ratios; five bars set to a gap of one thickness render as a single run 48.9 px long against 5 × 9.72 predicted; a 64-pixel gap measures 64.00 px at both 1080p and 720p; the head of the queue stops 1536.1 px into a 1920 px frame where 80% predicts 1536.0; a standing shape stands for 23, 119 and 215 frames of 240 where Dwell 10%, 50% and 90% predict 24, 120 and 216; and the newer of two overlapping shapes is the one you see, at every phase. Ninety-two slot runs across nine configurations confirm the invariant the whole design rests on, and all 33 controls are shown to reach the picture. And both plugins load and run in Resolume Arena 7.27.1: the shipped Windows build was checked in a real Arena on 2026-09-22, where both register with the right name, id and type, all 38 controls on each match what the plugin declares, and both render with a clean log. That run was on software rendering, so it says nothing about a GPU; the plugin has not yet been used in a show, and there is no OpenFX build. The macOS builds are signed and notarised. Try it on a spare layer first.

Watch it running

Shunt video thumbnail

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