galvo
A laser projector without the laser, for Resolume

What it does
An FFGL effect for Resolume Arena and Avenue. A laser show is a path scanned by two mirrors with a limited budget of points: the picture is where the beam went, as bright as the time it spent there made it, and nothing else is drawn. galvo models that path and that budget, and everything people recognise about laser graphics comes out of it.
Corners get bright studs because a sharp vertex is sent to the scanner several times over and the light piles up while the beam sits there, which is what Corner Dwell controls. Corners round off when the galvo can't keep up, because a galvo is a mass on a spring: wind Galvo Speed down from 60 kpps to 8 and the figure starts to look like handwriting. Damping below 1 makes the mirror overshoot a corner and come back through it. Mis-set blanking draws the hooks and faint join-the-dots lines of a projector whose beam switches on before the mirrors get there. And a frame with more path than the point budget covers gets drawn over several host frames, visibly crawling, which is what a real projector does with a frame that's too busy. Scan Rate Floor is the same answer show software gives.
The outline is found rather than assumed. The clip is edge-detected at a small working resolution, thinned to a one-pixel skeleton, walked into ordered contours and simplified, so a straight edge is two points rather than two hundred. Detect On decides what "different" means between two pixels, and it matters more than anything else you set: Alpha for a logo that arrived with transparency and so already carries a perfect outline, Chroma for the boundary between two colours of equal brightness that a luma detector can't see, and Luma for everything else. Background → Edge Mask shows the mask on its own, because judging a threshold through a layer of beam is guesswork.
Mind what you feed it. It works beautifully on logos, titles and line art, where there are proper outlines to find, and turns busy footage into a scribble, which is the nature of the problem rather than a setting nobody has found yet. Galvo Speed, Trace Size, Corner Dwell and Blanking Delay are integers in their own units rather than 0..1 sliders, because a scanner's rating is a number people already know.
- A second-order galvanometer model per axis — speed in kpps, damping, and the ringing that follows from both
- Corner dwell, so a drawn vertex has the bright stud a real scanner leaves there
- Blanking Delay in points, for the hooks and painted jumps of a projector out of adjustment
- A finite point budget that continues where it left off, so a frame too busy crawls the way it does in a real rig
- Scan Rate Floor thins the point stream to hold the rate up, the way show software does
- Contour tracing: edge detect, skeletonise, walk into ordered contours, simplify
- Detect on luma, alpha, chroma or luma-or-alpha, with an Edge Mask view for setting it
- Beam colour from the clip, pushed toward a saturated laser primary, or a palette with a hue sweep along the path
- Persistence as a camera's exposure rather than a phosphor — which is how anybody has ever seen a laser photographed
- Universal macOS bundle and a Windows x64 DLL
Where it stands
v0.1.0, and early days. On 21 September 2026 the x64 DLL was registered, loaded and instantiated in Resolume Arena 7.27.1 on Windows, listed as SW Galvo under idstring GV01 among 112 video effects, with the shaders compiling and the inspector drawn. That machine has no GPU (OpenGL came from Mesa llvmpipe, a software rasteriser), so it has never run on a GPU in Resolume, nothing was timed on Windows, and it has never been instantiated in Arena on macOS. It also models an ILDA scanner rather than driving one: there's no ILDA output and it has never driven a real laser. The physics is measured by an offline harness driving the real plugin classes: the galvo's step response matches the second-order closed form to three decimals, energy is conserved to 0.026% across twelve galvos, a four-point corner measures 4.27× the side brightness against 4.19× predicted, a 4,000-point path at 8 kpps takes exactly 30 host frames, and the tracer returns a square as one closed contour. All 24 swept controls change the picture. Render cost on macOS is 0.7–1.0 ms a frame at 720p and 1080p and 1.4–1.6 ms at 4K. Most of that is one synchronous readback rather than the GPU, which is why lowering Trace Size is the performance control rather than lowering the output resolution. No long session, composition save and reload or preset recall was tried in the host, and there's no OpenFX port, no user guide and no factory presets. The browser demo runs the plugin's own shaders, but its CPU half (the tracer, the point stream and the galvo model) is a hand port to JavaScript, and nothing checks a port but a reader. Try it in your own rig before you trust it in front of an audience.
Watch it running
Nothing loads from YouTube until you press play.Watch it there instead