Skip to content

Releases: stoatworks-labs/repousse

Release list

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 24 Sep 16:13

The picture hammered into a metal sheet and lit by a lamp on a swinging cord, as an FFGL effect for Resolume Arena and Avenue, shown as SW Repousse. Two physical facts make the look, and both are in the model rather than in a filter. The punch sets the finest detail: the clip's brightness becomes height, opened and closed by a punch of a real radius, so detail narrower than the punch is never formed — a ridge narrower than the punch comes out exactly d²/2R tall. Metal is lit, not shaded: a point lamp at a real position with inverse-square falloff, a GGX microfacet highlight in the normal-incidence reflectance of copper, brass, silver, gold or steel computed from published refractive indices, a small diffuse term for the patina, and self-shadowing by a march over the same height field.

The lamp hangs on a cord: a damped large-angle pendulum with the period its length gives it (one frame height is one metre), integrated on the CPU in double, kicked by an onset in the audio or the Kick button, each kick's direction stepping round the golden angle. Raking shadows, highlights sliding across the relief, soft chased work under a big punch and crisp engraving under a fine one all fall out. Smooth takes the terraces out of 8-bit footage; Show Height shows the worked relief.

v0.1.1, the same day as v0.1.0: the sheet is opaque. v0.1.0 kept the clip's alpha, so a transparent clip was a sheet with holes, which cut the sheet to the silhouette of Resolume's own alpha demo clips and left no flat metal round the picture; nothing in the model cuts a sheet. Since v0.1.1 the transparent parts are flat sheet (luma 0) and only Mix brings the clip's alpha back. One line of the shade pass; everything else, and every measurement below, is v0.1.0's.

What is verified

By tools/verify.sh on an M4 Max, macOS 26.4, on 2026-09-24, at two rasters (320×180 and 1280×720):

  • Five planes of known slope under five lamps read Intensity (Lref/r)² n·l kd F0 at every pixel and channel: worst error 1.8e-7 against a tolerance of 4.6e-6 derived from one float ulp.
  • The highlight on a 64 px hemisphere lands on the exact pixel the half-vector point predicts, and within 0.5 px off pixel centres.
  • Each metal reflects its computed F0 at normal incidence to 5e-8 (tolerance 32 ulps). The table is derived by tools/f0.py from Johnson & Christy (1972, 1974) and Querry (1985) n,k data, committed beside it, and verify.sh re-derives it.
  • The shadow behind a step is h / tan θ within one march step plus half a pixel; zero exactly inside it.
  • A ridge narrower than the punch is min(H, d²/2R) tall to 0.0e+00, a wider one keeps its height, three grooves match the stated 1-D open-close in double.
  • The lamp's period, read from its position in the picture over 360 frames, is 2π√(L/g) with the large-angle correction to 3.9e-5; the log decrement matches Q = 10 to 1.2e-3.
  • Loud audio from frame 0 leaves the lamp at rest (primed); a step kicks once, on that frame; a scrub re-primes. A resize mid-run matches a fresh instance in every one of 4,157,044 values and keeps the lamp swinging.
  • Seventeen perturbed models each fail their check, and one character changed in the shipped GLSL (the GGX denominator) is caught by two checks.
  • All 20 controls change the picture; oxbow loads it as SW Repousse / RP01 / effect and renders 120 frames.
  • Render cost at the defaults: 0.31 ms/frame at 720p, 0.51 at 1080p and 2.61 at 4K (5.38 with a 16 px punch). macOS figures only.
  • Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe, no GPU, 2026-09-24): the DLL of this source loads from Extra Effects, registers as SW Repousse / RP01 / effect, all 27 host controls match the declaration, it renders and Arena's log stays clean: 8 of the fleet gate's 9 checks. The ninth, controls, read Cord Length, Damping and Swing dead, because the gate holds a still picture and never presses Kick, and a pendulum nobody pushes hangs still whatever its cord, damping and swing; the harness's --pendulum check measures all three from the picture. The Audio input was skipped (no sound device). Software rendering says nothing about a GPU or about speed.

What is not

  • Never loaded into Resolume on macOS, and no audio has ever reached it outside the harness's synthetic spectra: whether Resolume's FFT bins carry the level the 0.15 threshold and ×4 gain assume is the first thing to check in a host.
  • The relief is brightness: a dark clip is a flat sheet with a lamp on it, and a painted sheet (Colour: Clip) is as dark as its clip. The punch is a rounded tip on a square shank, not a ball (exact on ridges and edges, a little squarer on a dot). Two planar pendulums, not a spherical one. The metal table is one published n,k dataset per metal.
  • No OpenFX port and no presets. There is a user guide at https://stoatworks-labs.com/software/repousse/guide/ and a browser demo at https://repousse-demo.stoatworks-labs.com/.

The macOS build is Developer ID-signed and notarised by the release pipeline after publication; if macOS refuses a download, it predates the signing, so download it again. The Windows build is unsigned, so SmartScreen warns once.

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 16:02

Superseded the same day by v0.1.1, which makes the sheet opaque: this release keeps the clip's alpha, so a transparent clip is a sheet with holes, which cuts the sheet to the silhouette of Resolume's own alpha demo clips. Everything else is identical. The full notes are on v0.1.1. The macOS build is Developer ID-signed and notarised.