Repository navigation
Releases
v0.1.0
The first release of Pepper: Pepper's ghost for Resolume Arena and Avenue, as two FFGL plugins built from one core. SW Pepper (PG01) is a mixer: put it in a layer's Blend Mode and the layer below is the stage, this layer is a hidden screen, and a sheet of glass or foil at an angle reflects that screen over the stage. SW Pepper Feed (PG02) is an effect that lays a clip out as the cross a real pyramid hologram is fed.
The one idea. Pepper's ghost is one sheet of clear glass. It reflects some of every ray and lets the rest through. Every pixel here is a ray traced through that sheet in linear light: the ghost is what the sheet reflects at that pixel's angle (Fresnel, red, green and blue each at their own index), and the stage gets what it lets through. Nothing is painted on. So the ghost only ever adds light, keystones as the sheet tilts, vanishes at Brewster's angle under a polarised screen, doubles in a thick pane, swims on a foil that rings at a stretched membrane's mode frequencies, and brightens under a metal coat while the stage behind it darkens.
The rigs. A Pane (the Victorian sheet, a Musion-style foil) or a three- or four-sided Pyramid (the plastic one people stand on a phone), with the hidden screen below or overhead. Sheets: PET Foil, Float Glass, Acrylic and Polycarbonate, each dispersing. Coats: Aluminium (0–10 nm) and Titanium Dioxide (0–2 quarter waves), by thin-film optics from published indices. The screen can be polarised horizontally, vertically or at 45° or 135°, as LCDs are, and can fall off with viewing angle.
Controls: Light (Opacity, Source Level, Source Black, Polarisation, Viewing Angle, Stage Level, Spill); Rig (Rig, Mount, Sheet Angle, Sides, Centre, Screen); Sheet (Sheet, Coating, Coat Thickness, Thickness, Tint, Ripple, Ripple Speed); View (Distance, Elevation, Azimuth). Opacity is the layer's opacity fader: in Resolume it's the hidden screen's light. The Feed has Sides, Centre and Mount. The defaults are a PET foil at 45° with the screen on the floor at +2.5 stops, rippling gently.
Downloads: a universal macOS build (Apple silicon and Intel) as a .dmg or .zip, and a Windows x64 installer (-setup.exe) or .zip. Each has both plugins and ATTRIBUTIONS.md. Both go in Documents/Resolume Arena/Extra Effects (yes, the mixer too). The macOS build is Developer ID-signed and notarised minutes 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 about the installer.
What is measured (offline, by tools/verify.sh on an Apple M4 Max under macOS 26, driving both plugins' own classes in a headless GL context, at 640×360 and 320×180 and again on Apple's software renderer):
- The light. A black screen adds exactly nothing, to the bit, and under it the stage is dimmed by exactly the sheet's transmission at each pixel's angle (2.7e-7). R + T = 1 at every pixel for all four sheets (3.1e-7). The ghost is linear in Opacity (2.3e-7), and Opacity 0 is the black-screen picture to the bit.
- Fresnel and polarisation. Each colour's Brewster null lands within 0.003 px of where its own index puts it; at 45° R_p = R_s² to 6e-8; screens polarised at 45° and 135° give the right reflection at every pixel (1.2e-7), mirror images of each other. Through every face of the pyramid, a polarised screen matches a separate 3D trace to 1e-6.
- Thick panes and coats. A thick pane's second image lands 0.02 px from where Snell's law puts it, with its weight to 1.8e-7 relative. Seven coats on glass and PET, film and thick, match an independent transfer-matrix model to 2.7e-7, from either side.
- Geometry. Dots land where the mirror image puts them in six views and three with the screen overhead; the keystone at 40° and 50° is 1.0442 and 0.9605 against 1.0441 and 0.9605 predicted. Each pyramid face shows the clip the right way round, apex down and up. The rippling foil's ghost peaks at six of six membrane mode frequencies while the stage through it moves 0.0002 px.
- The checks can fail. Twenty-one deliberately wrong models each fail their check, and 22 one-character mutants of the shipped GLSL and C++ are all caught. All 29 controls change the picture. The bundles are universal, and
oxbowreads SW Pepper / PG01 / mixer / 2 inputs and SW Pepper Feed / PG02 / effect.
On Windows it has been in Resolume, in Arena 7.27.1 on win-lab (software rendering, no GPU), with a build of the released code from this workflow. Both plugins load and register (PG01 as a mixer, PG02 as an effect), Mesa compiled their shaders, and Arena's log has no error from either. SW Pepper Feed passed the fleet's Arena gate twice, 9 of 9, every control moving the picture. SW Pepper can't be gated (the gate mounts effects), so it was probed by hand over Arena's REST API and its own log: it's offered as a Blend Mode and as a transition, Arena hides Linear Light (index 0, parked there on purpose) and shows the other 30, and the mixer's Opacity follows the layer's fader (0.2, 0.85, 0.5, 1.0, logged by the plugin), overriding a direct write.
What isn't verified, or is a limit. It's never been loaded into Resolume on macOS, and no frame of SW Pepper's output inside Resolume has been captured (Arena's API serves no picture of a mixer). Nobody has run it on a GPU other than one Mac's. A transition through SW Pepper ramps its Opacity but Arena never sends 1.0, so it ends with a cut to the new clip; it's meant as a blend mode. Not modelled: haze and dust on the foil, PET's birefringence, and the sub-pixel colour fringe a thick pane's back images would get (each is bent by green's index). The coats are published indices, not a foil maker's data, and the Feed's mirrored arms haven't been checked against a real phone pyramid.
Cost, GPU time on an Apple M4 Max at the defaults: the pane 0.07 / 0.21 / 0.39 ms a frame at 720p / 1080p / 4K, the pyramid 0.06 / 0.08 / 0.31 ms. Nothing was timed inside Resolume.
Not done. No presets and no OpenFX port.
- User guide: https://stoatworks-labs.com/software/pepper/guide/
- Project page: https://stoatworks-labs.com/software/pepper/
- Browser demo: https://pepper-demo.stoatworks-labs.com/