Skip to content

Releases

Knockout v0.1.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 05:36

The first release of Knockout: your words, in any font you have, as a mask over the clip, for Resolume Arena and Avenue. One FFGL effect, SW Knockout (KO01). The clip shows through the letters (Inside) or has them cut out of it (Outside), and whatever the mask takes away becomes transparent, black, white or a colour of your choosing, so it works as a title over the layers below or as a stencil on its own.

The one idea. The letters aren't a picture of the text. A glyph is a few dozen curves; the plugin sends them to the GPU once, and every frame each pixel works out from the curves themselves whether it's inside a letter (a ray to the right, counting the curves it crosses and which way they go, as TrueType and CFF fill their outlines) and exactly how far it is from the edge. There's no texture of the alphabet at some resolution waiting to go soft, so a word is as crisp filling a 4K frame as it is zoomed a thousand times into one stroke. Zoom is worked out in double precision on the CPU, so the GPU only ever sees numbers about as big as the screen, and overlapping strokes in variable fonts are tidied up once, when the font loads, so a filled letter has no seam and an outlined one no stroke through its crossbar.

Controls: Text (Text, Font, Font Name, Font File, Weight, Italic); Layout (Fit: Frame, Width, Height or Size; Size, Margin, Align, Tracking, Line Spacing); Transform (Position X, Position Y, Rotation, Zoom up to 1000×, Zoom X, Zoom Y); Edge (Grow, Feather, Outline); Reveal (Reveal, Reveal Spread, Reveal Order: Forward, Backward, Centre Out or Random); Mask (Mask, Background, Colour, Mix). Fonts are the families installed on the machine, as a web browser picks them by weight and italic; a family picked from the list is saved as a number made from its name, so a composition opens in the same font on another machine that has it.

Downloads: a universal macOS build (Apple silicon and Intel) as a .dmg or .zip, and a Windows x64 installer (-setup.exe) or .zip. Every archive carries ATTRIBUTIONS.md. The macOS build is now Developer ID-signed and notarised (signed on 2026-11-02, after publication); if macOS refuses a download, it's from before that, so download it again. The Windows build isn't signed, so SmartScreen warns once. The Windows installer puts the plugin where Resolume looks: per user, with no administrator prompt, in Documents\Resolume Arena\Extra Effects (Avenue's when only Avenue is there), with its README, notices and uninstaller in a Knockout folder beside it. Built from the same DLL and run silently on a Windows machine, it put the files there and its uninstall entry in the user's registry; Arena, restarted, listed SW Knockout; and the uninstaller took it all away again.

What is measured (offline, by tools/verify.sh on an Apple Silicon Mac under macOS 26, driving the plugin's own class in a headless GL context, at two sizes and again on Apple's software renderer):

  • The mask. Every pixel within 0.0005 of the coverage the test fonts' own shapes predict, across lines, alignment, tracking, rotation, zoom about a point and curves at 40×. A stroke zoomed 1000×, on the sixteenth letter of a line, at 4K, within 0.0018 (a float version of the same arithmetic is out by 0.037).
  • Edges and reveal. Grow, Feather and Outline within 0.0005; Grow ±0.05 em moves an H's sides by 0.1 em to within 0.0005 px. Every Reveal order at three spreads gives each letter exactly the alpha its formula says, and Random is the same order in every instance.
  • Real fonts. Six faces nobody here drew (Arial Black, Helvetica, STIXGeneral upright and italic in CFF, and the system font and New York, both variable with overlapping strokes) against stb_truetype's own rasteriser at 720p: no pixel in on one side and out on the other, area within 0.1%. All 335 of this Mac's families get a list value exact in a float, no two alike.
  • The checks can fail. Eight deliberately wrong models each fail their check, and 23 one-character mutants of the shipped GLSL and C++ are all caught. The bundle is universal, and oxbow reads SW Knockout / KO01 / effect and renders 120 frames through it.

In Resolume on macOS. Loaded into Arena 7.28.1 on one Mac and driven over Arena's REST API, with the output read back as snapshots: all 30 controls change Arena's output and read back what they were given, Background Transparent is alpha 0, Mix 0 is the effect bypassed to the bit (Inside and Outside, on Transparent and on Colour), and a saved composition reopens bit for bit, both for a family picked from the list and for a typed Font Name. Relaunched with a folder of six families in place of the Mac's 335, a composition saved with Didot Italic came back as Didot Italic, the picture identical to the bit; one saved with a family the folder hasn't got drew the default and kept its choice for the next save.

On Windows it has been in Resolume. The fleet's Arena gate ran this release workflow's own Windows build in Arena 7.27.1 on win-lab (software rendering, no GPU): the DLL loads, registers as KO01 (an effect) and appears in Arena's list, all 36 controls (Arena's Opacity and the plugin's 35) match their names, order, types, ranges and defaults, it draws with a font loaded from a file, and Arena's log stays clean: 10 passed, 0 failed, 0 skipped. Against a still, all 28 controls that can be probed changed the picture (Text, Font Name and the About text are strings, and Font File is a path). Software rendering says nothing about a GPU or about speed.

What isn't verified, or is a limit. Nobody has played it in a show, it's never been in Avenue or used as a clip effect, and nothing was timed inside Resolume. There's no shaping, so ligatures don't happen and scripts that join or reorder their letters (Arabic, the Indic scripts) come out wrong; Latin, Greek and Cyrillic are fine. A stroke thinner than a pixel draws more ink than its width, (1 + w)²/4 px. CFF curves become quadratics within 2e-5 em, which Zoom 1000 can make tens of pixels. Two letters whose ink overlaps keep the larger coverage, not the union, so a shared edge pixel can be up to half a pixel light. Fonts are read once per load. A clip smaller than the composition reaches the effect inset in a composition-sized frame, so set the clip's Resize to Fill.

Cost, GPU time on an Apple M4 Max: the defaults 0.13 ms a frame at 1080p and 0.57 ms at 4K; eight lines of 56 characters 0.29 and 0.77 ms; a word zoomed 1000× into a stroke 0.46 and 1.73 ms.

Try it first in the browser demo: the plugin's own C++ compiled to WebAssembly, drawing with its own shaders, with four OFL fonts of its own since a web page can't see yours; its pixels agree with the harness's to within one level in 255. The video: https://www.youtube.com/watch?v=HTvyaKAG3Vc

Not done. No presets and no OpenFX port.