Stoatworks Labs

Toner

A photocopier's copy of a copy, for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Toner — A photocopier's copy of a copy, for Resolume
Toner

What it does

An FFGL effect for Resolume Arena and Avenue. A photocopier is a xerographic engine, and every stage leaves its mark: optics that blur, an auto-exposure that sets the background to paper white, a photoconductor with a steep discharge curve, development that follows the electric field above the latent image rather than the image itself, a toner supply that runs down with the coverage it's laid, and a drum whose defects come round once a circumference. Copy the copy and the same machine runs again on its own output. The look of zine and punk-flyer art is the fixed point of that loop, where it settles if you keep copying.

Toner runs up to eight generations a frame. Each generation is the whole machine applied to the page the last one made, with its own small seeded skew and offset, so the picture holds steady from frame to frame. None of it's drawn. One generation is an S-curve with stable fixed points at paper and at toner, so repeat it and every grey gets driven to one or the other. The field above a wide charged area is zero in the middle and strongest near the edges, so big solids come out as rims round pale centres while a thin line prints full. Solid Fill blends in the developer electrode that better machines added to flatten that out.

The developer's concentration falls with the coverage laid down along the process direction and recovers at a stated rate, so density fades down a heavy page. Through the copy loop that gradient turns into a hard cut, and the page runs out part-way down. Drum marks repeat every circumference. In Photo Mode a diamond-dot halftone screen gets re-screened every copy and beats against the last one. Paper comes in seven stocks, and Direction sets which way the page goes through the machine.

The field is a separable product of strip closed forms, exact for infinite strips and at the centre of any rectangle, with a scale of half a pixel and kernels 33 taps long. Every coefficient is worked out in double on the CPU once a frame, and every read on the GPU is a texel fetch at an integer coordinate, which is what lets the harness hold each stage to its stated law.

  • One to eight generations a frame, each the whole engine run on the last copy's page
  • Contrast, background suppression, optics, zoom and skew per generation
  • Development that follows the field: hollow solids, full lines, and a developer electrode (Solid Fill)
  • Toner starvation along the process direction, with a recovery rate
  • Photo Mode: a diamond-dot halftone at a set pitch and angle, re-screened every copy
  • Seven paper stocks, drum marks at a set circumference, four process directions
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.1.0, and early days. It hasn't been loaded into Resolume on macOS yet. On Windows it has: a build loads, registers and renders in Resolume Arena 7.27.1 on software rendering (no GPU), with every parameter as declared, and all 17 of its controls and Arena's own Opacity moving the picture. The copier is measured offline, by a harness driving the real plugin: a grey ramp copied n times matches the tone curve applied n times, column for column, a solid square's density follows the strip-field closed form while a one-pixel line prints full, the drum's defects repeat exactly one circumference apart, density fades down a page as the depletion model says, the skew adds up correctly after 2, 5 and 8 generations, and grey paper comes out white. It catches six models broken on purpose and a one-character sabotage of its own shader, and all 17 swept controls change the picture. On macOS it costs 10.3 ms a frame at 1080p with eight generations and 33.6 ms at 4K, so the cap of eight keeps 1080p real-time, and about three generations are real-time at 4K. The macOS build is signed and notarised. There's a user guide and a browser demo, but no presets and no OpenFX port. Try it in your own rig before you trust it in a show.

Watch it running

Toner video thumbnail

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