The Fractal Engine, Tool by Tool
A fractal designer whose controls are the mathematics drawn as a technical drawing of itself, documented the same way: every tool explained in a few lines, with the engine running underneath.
1Jorik Jonathan Chase, 3DIE — Design, Art & Technologies Label. A companion to the Fractal Engine and to paper 0. October 2026.
Open the Fractal Engine. In the engine, the page glyph at the end of the row of toggles (the menu mark, top right) brings you back here.
The paper in one paragraph
The Fractal Engine draws fractals from a formula: a short list of operations, applied to a point again and again. Everything the engine does is a reading of that repetition, the orbit. Followed forwards from every pixel it gives a cave you can fly through; followed backwards from random points it gives a nebula; fed back through itself as an image it grows the picture frame by frame. On top of the orbit sit the tools: a hold that edits whatever moves the surface under your hand, a lens that turns the view into the map of two parameters, a lineage that keeps every formula you made, a ring of neighbours to breed from, four dimensions, species mixed inside the iteration, colour and motion as networks, and collages of finished shapes. This paper takes them one at a time.
Every figure is the engine itself, set up for the tool above it. A figure starts when it scrolls into view and stops when it leaves; click or tap it to take the controls, and press outside it to give the page back its scroll. Nothing you do in a figure is saved. The line under each figure is its formula as the engine has it at that moment. The mathematics sits folded in boxes marked The mathematics. WebGPU is needed: a recent Chrome, Edge or Safari.
To learn by doing, follow the two workflows step by step: a collage, start to finish and subgraphs, start to finish. Every key and gesture is on one page in the reference, and what the engine refuses is listed in its limits.
1. One Object: the Orbit
A formula is a list of operations. Applied to a point over and over, it gives the point's orbit, and the orbit is the only thing the engine computes.
Take a point in space, fold it into a box, fold it again through a sphere, scale it by 2.5 and add back where it started. Do it twelve times. Points near the shape stay near it; points away from it fly off. That is the Mandelbox [1], the shape you arrive in. The rule add back where it started is what makes it a Mandelbrot-type set, the same rule as z → z² + c in the plane [2].
The engine follows each orbit together with how it stretches space (its Jacobian), which branch of a fold it took, and how close it came to the origin. Colour, the surface, the glow, the chaos meter and the handles you grab are all statistics of that one trace. So the look is separate from the geometry by construction, and every tool below reads the same object.
1.1 Notation
A formula is written as one line of text. Operations are separated by a dot, numbers follow their operation,
and ×12 says how many times the list runs. The arrival formula reads
fold.box 1 · fold.sphere .5 1 · scale 2.5 · +c ×12 bail=100
Twenty-nine operations make up the library: folds through a plane, a box, a box with a limit per axis, a sphere,
the absolute value and a sort of the coordinates, a stepped fold (section 5.7); powers (the triplex bulb, the complex power, inversion, a twist); the affine moves
(translate, +c, scale, rotate); the 4-D forms (rotate4, sort4,
bulb4, quat); the lattice wrap, the Kleinian step and three seeds (section 5.6); and five
flame variations for the push engine
[3]. A letter word after the count is a schedule:
×12 AAB alternates two op lists, a hybrid. c=x,y,z fixes the constant and gives a
Julia set; slice=…, shade=… and drive=… carry the 4-D slice, the colour
network and the drivers (sections 5, 6). The line, the JSON behind it, the graph of section 5.5 and the URL are
one object: every formula is its own address, and its hash is its gallery id.
| Desktop | Touch | |
|---|---|---|
| See the op list as glyphs | Tab (the strip, bottom left) | tap a corner mark |
| Fly | drag to look, wheel to move, WASD QE | one finger looks, pinch moves along the view, two-finger pan slides |
| Drift on or off (it is on until your first press or key) | Space | the drift glyph in the structure layer |
+c), the ruler beside it has one notch per iteration.
Type a formula and press Draw; a new formula is drawn from where the camera is, so a small shape may need a
wheel or a pinch backwards.The mathematics
A formula with op list f1, …, fm is the map
F = fm ∘ … ∘ f1, and the orbit of a point p is
p0 = p, pi+1 = F(pi), stopped after
N steps or when |pi| passes the bail radius. A schedule word picks which list runs at
step i. Each op carries four things: its forward map, an inverse branch (one preimage, picked at
random where there are several), a rule for the running derivative, and its Jacobian. The derivative rules
are few: isometries (folds, rotations, translations) leave the running scale dr unchanged, a scale
multiplies it by |s|, the bulb by n rn−1, and +c adds one when
c follows the point.
2. Three Ways to Draw
The same formula is drawn three ways: forwards from every pixel (pull), backwards from random points (push), and as an image fed back through its own map (loop). P or a double click cycles them.
2.1 Pull: the Cave
Pull marches a ray from the camera through every pixel. At each step it asks the formula how far the nearest surface could be, the distance estimate, and moves that far. Near the surface the steps shrink, and where they fall below a pixel the ray has hit [4] [5]. The estimate comes from the orbit itself: how far the point travelled divided by how much the formula stretched space along the way [6].
A lamp rides just off the camera, so enclosed caves are lit wherever you are; shadows and ambient occlusion appear when the view is still; depth of field focuses on whatever the centre ray hits. Every speed is the distance estimate at the camera: a hall and a crevice feel the same under the hand, and moves that would enter the surface are refused.
Two shaders draw the same formula. An interpreter reads the op list from a buffer and never recompiles, so editing is instant. A JIT writes the formula out as its own shader, every operation inlined and the loop unrolled, compiled in the background once the structure is known; it runs two to twelve times faster and takes over by itself. The two are checked against each other and against a float64 CPU reference on every change. Hover the line under a figure to see which one is drawing.
| Desktop | Touch | |
|---|---|---|
| Look | drag | one finger |
| Move along the view | wheel; W S, Shift faster | pinch |
| Slide sideways, up | A D, Q E; the arrow keys are W A S D | two-finger pan |
The mathematics
With r = |pN| and dr the running derivative, the engine uses two estimates. Fold formulas (an iterated function system run forwards) take
d = r / |dr|,
whether or not the orbit escaped. Power formulas take the potential-based estimate of escape-time fractals,
d = ½ · r log r / |dr| outside the set, 0 inside.
Sphere tracing is safe when d never exceeds the true distance (the estimate is a lower bound, or Lipschitz with constant 1). Operations that break the bound inside the loop, such as a rotation between folds, mark the formula not pull-safe and the march shortens its steps.
2.2 Push: the Nebula
Push runs the formula backwards. The inverse of an expanding map is a contracting one, so walking a point through random inverse branches draws the attractor, Barnsley's chaos game [7]. 32,768 walkers take 24 steps a frame; every sample lands as a small Gaussian splat whose shape follows how the inverse steps squeezed space, and the histogram is tone-mapped by log density as flames are [3]. A walk that hits a dead end backs up instead of retrying in place, so thin branches are not swallowed.
Pull and push are one formula in opposite directions. Without a fixed constant, push shows the Julia set of the point you are looking at, so one toggle gives the cave and the nebula from the same seed.
| Desktop | Touch | |
|---|---|---|
| Pull → push → loop | P or double click | double tap, or the mode glyph in the row (section 9) |
The mathematics
A walker at xk takes one random preimage, xk+1 = Fj−1(xk), through the ops in reverse. The splat's covariance rides the walk,
Σ ← J Σ JT + ε² I,
with J the inverse step's Jacobian (by finite differences with the random choices replayed) and ε one pixel's footprint at the focus. The thin-lens circle of confusion is added to the projected covariance, which gives depth of field for free [8]. Brightness is the log of the density, colour the mean colour landed.
2.3 Loop: the Optical Machine
Point a camera at a monitor showing the camera's own picture and the image feeds back through the optics: the distance is a scale, the roll a rotation, the tone knobs a nonlinearity. Crutchfield showed in 1984 that this is an iterated map acting on images [9], and Dave Blair's Light Herder turned it into an instrument [10]. The loop engine is that machine with the formula as its optics: every frame, each pixel looks up where the formula sends it in the last frame, so the escape-time picture grows out of noise instead of being computed.
The screen is a window on a plane. Its knobs are the monitor's: hue rotation, saturation, gain, contrast about a dark pivot, decay, blur, a seed of sparks and how much of the field is fed in. Gain times decay just under one gives the nested halos of escape time; at or above one the set saturates.
| Desktop | Touch | |
|---|---|---|
| Zoom the window | wheel | pinch |
| Pan, roll | drag; Shift-drag rolls | pan; two-finger twist rolls |
| Turn two knobs | hold still, then drag sideways for the first, up and down for the second; wheel for the next pair | hold, then drag; a second finger's tap for the next pair |
The mathematics
One pass is
I′(y) = T( blur( I( F(y) ) ) ),
with F the formula's forward map and T the tone curve. Pulling back through F is pushing forward through its inverse branches, so the loop applies the Hutchinson operator of F's inverses to the whole image at once [12]; formulas with two op lists sum both pull-backs, the beam splitter of the optical rig. For a 3-D formula the plane shows the shadow of the dynamics.
3. Derivatives: Chaos and the Metric
Every orbit is followed together with its derivative, in position and in one parameter. From that one mechanism come the normals, the Lyapunov exponent, and a measure of how far each parameter moves the surface on screen.
The shader carries dual numbers: alongside each coordinate, how it changes when the starting point or one parameter changes [13]. Five columns ride through every orbit: three for the position gradient (the surface normal), one for the selected parameter, one for the Lyapunov exponent. The exponent says how fast nearby orbits part: negative where the dynamics is calm, positive where it is chaotic [14].
L colours the surface by it, about the view's own median: calm surfaces dark and cool, chaotic ones hot and glowing. In the Mandelbox the sphere-fold pits run hot and the box faces stay calm.
The parameter column gives the metric. A sensing pass marches a coarse grid of rays to the surface and measures, for every parameter, how many pixels the surface moves per unit. Raw sensitivities differ sixfold between the Mandelbox's parameters; divided by the metric, one pixel of hand motion moves the surface about one pixel whichever parameter it is. Every tool in section 4 is built on it.
| Desktop | Touch | |
|---|---|---|
| Lyapunov channel | L | the Lyapunov glyph in the row (section 9) |
The mathematics
Normals are the gradient of the distance estimate from one dual orbit. The Lyapunov exponent is
λ = limn→∞ (1/n) Σi log |J(pi) vi|, vi+1 = J vi / |J vi|,
at fixed c, along the hit point's orbit. The metric of parameter θ at a hit is the normal speed of the surface, (∂d/∂θ) / |∇d|, divided by the pixel's footprint at that depth: pixels per unit. The view's metric is the RMS over the grid's hits. GPU and CPU agree to a median gradient angle of 0.000° and a median relative ∂d/∂θ error under 6·10−5.
3.1 The Derivatives, Compiled
Nothing here is for the hand: the same pictures arrive faster. Section 2.1's JIT writes the forward orbit out as its own shader; the dual orbit that runs at every hit is compiled beside it, into the same pipeline, and the interpreter draws until it is ready. One op becomes one block: what its forward map and its derivatives share is computed once, and a branch that leaves the derivatives alone holds no code. What no hit reads (the selected parameter's column, the colour) is left out. Chimeras unroll, and drivers are written in with their derivatives. Collage pieces compile only the Lyapunov column, and a light collage loses a little: the three-piece test scene runs 3 to 5 % slower, three compiled orbits behind a switch costing about what one saves.
| Scene | Still, before | After | Gain |
|---|---|---|---|
| Mandelbox cave | 37.8 ms | 29.8 ms | ×1.27 |
| Menger | 8.7 ms | 5.4 ms | ×1.61 |
| Driven bulb | 27.5 ms | 8.6 ms | ×3.19 |
| Driven Mandelbox | 245.4 ms | 124.4 ms | ×1.97 |
| Chimera | 156.8 ms | 77.5 ms | ×2.02 |
| Three-piece collage | 13.8 ms | 14.3 ms | ×0.97 |
GPU time per frame at 1440 × 900 on an M3 Pro. The images match the interpreter's to at least 61 dB (SSIM ≥ 0.9999), collages exactly. Push and the loop do not run the duals, so they are unchanged.
4. The Hand: Grab, Lens, Lineage, Breeding
There are no sliders. You edit by holding the image where you want it to change; the engine finds what moves the surface there.
4.1 Grab
Press and hold still for a moment. A sensing pass of 25 rays around the cursor ranks every parameter by how far it moves the surface there, scaled by the parameter's own size so lengths and angles compete fairly. The first is the attention op: its handle appears as its own geometry (the fold plane, the box's edges, the sphere fold's two radii, the scale as nested squares), with the reticle around the held point and the point's real orbit inside it. The ticks on the reticle's ring are the Lyapunov exponent: dense and bright where a change is about to turn chaotic. Drag sideways to edit at the metric's rate. The value appears on a dimension line; it is the only number on screen.
| Desktop | Touch | |
|---|---|---|
| Grab | hold still 280 ms at the cursor, drag sideways | hold anywhere: the grab aims at the centre crosshair, the finger only drags |
| Next op in the ranking | wheel | tap a second finger |
| Undo the grab | Esc | two-finger tap afterwards |
| Pin this region | F in a grab; F on a pin removes it | double tap a second finger |
A press that moves more than 5 pixels in the first 280 ms is a look, not a grab, and a quick click does neither. Only a sideways drag edits; up and down do nothing yet. There is no grab in push, which has no surface to sense, and in the loop a hold takes the knobs (section 2.3).
The mathematics
With θ0 the value at the press and m the local metric in pixels per unit, a drag of Δx pixels sets θ = θ0 + Δx / m. Parameters rank by m · max(|θ|, 0.1) (10 for angles). Pins stop the parameters that score at least a quarter of the top one at the pinned point from wandering in the drift (section 4.4).
4.2 The Atlas Lens
The Mandelbrot set is the map of the Julia sets: each of its points is a parameter, coloured by what that parameter does. The lens generalises the idea to any two parameters of any formula. Hold Shift in a grab and the view becomes the map of the attention parameter and a second one, coloured by how far (in pixels) the surface would be from the held point under each pair. The key colour sits where the surface would touch the point; a hairline marks every doubling of distance. The map spans exactly what a drag across the screen reaches. Moving travels it, both parameters change, and the field itself updates live in a round inset; letting go closes the lens and the grab carries on from there.
| Desktop | Touch | |
|---|---|---|
| Open the lens | Shift during a grab | rest a second finger during a grab |
| Travel it | move | drag the first finger |
The mathematics
Each pixel of the lens is a pair (θ1, θ2) = (θ10 + u/m1, θ20 + v/m2), and its value is the distance estimate at the held point under that pair. The shader reads every op record through overrides that add Δθ · ∂record/∂θ, exact for parameters the record is linear in (all but rotation angles and plane normals, which the lens does not offer). It is the held point's own Mandelbrot set.
4.3 The Lineage
Every formula you make is a node in a tree: going back and editing starts a branch, so nothing is ever overwritten and yesterday's shape is always one click away, the feature the physical machine cannot have. The structure layer shows it as dots and hairlines, the big dot being now; hover a dot for its thumbnail. Moving between nodes is never a crossfade: within one structure the parameters and the camera move in 350 ms, so every frame in between is a real fractal; across structures the old image flows through the new formula's map in the loop engine. R replays the whole lineage from its root at constant visual speed. Any input stops a replay. In the live engine the lineage is kept in your browser (600 nodes, thumbnails for the newest 160); in these figures it lives only as long as the figure. Every edit makes one node when it ends, and so does a change of mode. A dot can also be dragged onto the field: its formula joins what is on screen as a collage's piece (section 7.3).
| Desktop | Touch | |
|---|---|---|
| Structure layer | Tab | tap a corner mark |
| Back, forward | ⌘Z, ⇧⌘Z | two-finger tap, three-finger tap |
| Return to a node | click its dot | tap its dot |
| Replay | R | the replay glyph in the structure layer |
4.4 The Breed Ring, the Archive and the Drift
Hold still for longer, 1.2 s, and eight neighbours open around the cursor. Four are near: the formula stepped 35, 60, 90 and 130 pixels across the screen in a random direction. Four come from an archive of variety that grows in the background whenever your hand is off: a MAP-Elites grid of the best formula found for each combination of how much of the view is surface and how chaotic it is [15]. They sit around the cursor in the direction of their features, and a spoke's length is how different the neighbour looks. Release on one and the field walks there at a constant visual speed; the wheel brings farther or nearer neighbours. Picking from a gallery of variations is old [16] [17]; here the distances are measured.
The drift is the same idea without the hand: the camera glides toward the most open way and every unpinned parameter wanders a few pixels about its home value. The engine arrives drifting. Your first press or key turns the drift off for the session, so nothing moves under a working hand; Space, or the drift glyph on touch, turns it back on, and it then starts four seconds after your last input. It waits while a grab, the graph or the Metasurface is open. F in a grab pins that region: the parameters that move it stop wandering, the pin shows in the structure layer, and F on a pin removes it. Pins are how a composition is herded.
| Desktop | Touch | |
|---|---|---|
| Open the ring | hold still 1.2 s | hold 1.2 s: the ring opens mid-screen |
| Choose | point, release on a thumbnail | point, lift on a thumbnail |
| Farther, nearer | wheel | pinch |
| Stay | release at the centre, or Esc | lift at the centre |
| Keep a neighbour as a piece | point past its thumbnail by 60 px: it follows the hand; release on the field | the same |
The mathematics
A neighbour D pixels away moves each unpinned parameter by θk += D zk / mk, with z a random unit vector, so its visual distance is known before it is drawn. Spoke length is 110 + 110 tanh(D/160) px. Walks move parameters linearly in time at 150 px/s by the metric. The drift is an Ornstein–Uhlenbeck walk about the home value [19], dθ = −κ(θ − θhome) dt + σ dW, with σ = 6 px/√s divided by the metric, so every parameter wanders the same few pixels on screen.
5. New Species
Three ways to mix formulas are kept apart. Breeding interpolates the parameters of one structure. A chimera blends two structures inside every iteration, a new dynamics. A collage joins finished shapes (section 7).
5.1 The Fourth Dimension
The orbit lives in four dimensions and the camera in three. A slice, an offset along w and a tilt toward
it, places the 3-D world inside the 4-D one. Moving the slice is flying through the fourth dimension; tilting it
turns the world toward it. A 3-D formula is a 4-D formula whose ops leave w alone, so the slice changes nothing
for it until a 4-D op (rotate4, bulb4, quat, sort4) mixes w
in. Quaternion Julia sets are the classic case [20].
| Desktop | Touch | |
|---|---|---|
| Move along w | ⌥ + wheel | three-finger pinch |
| Tilt toward w | ⌥ + drag | three-finger drag |
The mathematics
The world point (x, y, z) enters the orbit as x4 = T · (x, y, z, w0), T the rotation by three tilt angles in the xw, yw and zw planes. Every layer (ops, duals, inverses, the JIT, push and loop) carries a vec4; a push sample projects back through the slice with a Gaussian weight on its distance from it.
5.2 The Chimera
Write two op lists in brackets and both run on the same point in the same iteration; the point is then blended between them. Neither formula's shape survives intact: the blend has dynamics of its own, a new species. The weight can be a constant, or a field over the point, so one species gives way to the other across a wall.
[fold.box 1 · fold.sphere .5 1 · scale 2.5 ‖ abs · sort · scale 3 · + -2 -2 0] axis .5 1.5 1 1 0 0 · +c ×12
| Desktop | Touch | |
|---|---|---|
| Make one | the graph (5.5): hold an edge, pick the fork glyph | the same, with a finger |
| Move the wall, the blend | grab (4.1): w, k and r are parameters like any other | grab |
The mathematics
p ← (1 − ω) FA(p) + ω FB(p), ω = σ( logit w + k n̂·p + r(|p| − 1) ).
Its Jacobian is (1 − ω)JA + ωJB + (FB − FA)∇ωT. The running derivative takes Σ ωi dri, the bound on the first two terms; the field's own stretch stays out of it (it grows along escaping orbits and would destroy the estimate far from the set), so a steep wall can be overstepped a little. Push has no closed inverse: one species' inverse is a first guess, refined by Newton on the blend.
5.3 Fields and Tissue
The weight of a chimera is a field, and the field library has eight kinds: a constant, an axis, a sphere, four-dimensional noise [21], Voronoi tissue [22], and three fields read from the fractal itself, its orbit trap, its depth and its running stretch, so a formula can mix itself by its own dynamics. Tissue takes two to seven species: n cells, each one species, with soft walls between them. A field is read either at the orbit point every iteration (new dynamics) or at the world point the orbit started from (a spatial tissue: the shape varies across space).
The mathematics
Tissue weights are a softmax over the sites xj, ωj ∝ exp(−|x − xj|² / (soft · size)), site j a cell of species j mod k. A scalar field s(x) maps to k species through u = (k − 1) σ(logit w + s(x)), shared between the two species it falls between.
5.4 The Metasurface
Sixteen families (Mandelbulb, 4-D bulb, quaternion Mandelbrot and Julia, Mandelbox and its −1.5 form, Amazing Surf, Mandalay, a 4-D-rotated Mandelbox, Menger, Sierpiński, KIFS, pseudo-Kleinian with and without pillars, Apollonian, Kleinian) lie on a square as Voronoi cells, each site its family's thumbnail. Drag the crosshair and the formula follows: inside a cell the family is bred along its own two axes; across a wall, sites of one structure blend their parameters and different structures become a chimera [23]. A stroke can be played in time (a walk through the families) or laid in space (species ordered across the world along the stroke). Any formula can become a site of its own. The four lattice families of section 5.6 have no outside to frame, so their sites open with the camera inside a hall.
Your own sites live in this browser, up to thirteen beside the sixteen families; moved families are remembered too, and a corner mark stays bright while the layout differs from the default. A site that is a chimera has a hard wall, drawn as one hairline: crossing it is a cut, unless the chimera is a constant blend. While the surface is open on a touch screen, only the structure layer's key row answers outside it.
| Desktop | Touch | |
|---|---|---|
| Open, close | M, Esc | the Metasurface glyph in the row |
| Breed, blend | drag the crosshair | drag |
| A stroke in time, in space | Shift-drag, ⌥-drag | draw with one finger resting, with two resting |
| Go to a site | click its disc | tap it |
| Add a site's formula as a collage piece | hold still on its disc (0.45 s): a ring fills around it | hold |
| Drop your formula as a site | hold still on open ground (0.45 s): the ring fills | hold |
| Move, remove a site | drag its disc; off the square, yours is gone and a family goes home | the same |
| Send the families home | double-click a corner of the square | press a corner twice |
The mathematics
Site weights are πj ∝ exp(−(dj − dmin) / 0.035), so a cell is
pure until about 0.1 from its wall. Sites of one structure interpolate parameters exactly; different
structures join a constant-weight chimera (blend a b c …). The walls drawn are contours of
max πj at 0.6, 0.8 and 0.95.
5.5 The Graph
The strip in the structure layer is a folded network. Unfolded, it is the formula drawn top to bottom: each op a glyph node, a chimera a fork into its species and a join at its field's glyph, the iteration a repeat zone with its loop up the right side and the count and schedule below. It is the formula itself, not a picture of it: every edit here is an edit of the line of text, and one node in the lineage.
| Desktop | Touch | |
|---|---|---|
| Unfold, fold | G, or click the strip | the graph glyph; pinch it closed to fold |
| The field without an op | hover the node | press the node |
| Edit a parameter | click the node, drag its dimension lines | tap, drag |
| Insert op | hold an edge: the ring of ops (and the fork) | hold an edge |
| Add species, change the field | hold the field node | hold the field node |
| Move, delete | drag a node onto an edge; Delete | drag; fling it off, or a three-finger tap |
| Iterations | drag the count, one per 12 px | the same |
| Schedule | click a letter, then a letter key (A–H); Delete drops it; the plus after the letters adds one | drag a letter up or down; the plus |
| Add a chain | the plus beside the last chain | the same |
| Zoom the drawing | pinch and pan inside; pinch closed past 0.6 folds it | |
| Back out | Esc clears the ring, then the selection, then folds the graph; G folds it; a press outside folds it | two-finger tap; a press outside, on release |
5.6 Seeds: the Families That Never Escape
The formulas so far stretch space, and the distance estimate measures that stretch. A second kind only folds and inverts: at scale 1 an orbit never escapes, so there is nothing to measure and the old estimate fills all of space. These are the sphere lattices, tunnels and packings of the pseudo-Kleinian family [24], Apollonian packings [25] and Jos Leys's Kleinian limit sets [26].
They are drawn with a seed: a shape placed at the end of the iteration. An op does nothing to the point; the
estimate reads the distance to the shape where the orbit ended, divided by how much the folds stretched space on the
way. The fractal is the seed seen through every fold. There are three, seed.slab,
seed.sphere and seed.pillar. A seed is an op like any other, so the grab, the lens, the
ring and the drivers all reach its numbers. fold.cell is the box fold with a limit per axis,
wrap folds space into a lattice, and kleinian is one step of Leys's algorithm, its two
numbers the real and imaginary parts of the group's trace on Maskit's slice.
| Desktop | Touch | |
|---|---|---|
| Go to a family | M, click its site: the camera lands inside its hall | the Metasurface glyph, tap its site |
| Build one | hold an edge in the graph: the seeds, fold.cell, wrap and kleinian are in the ring of ops; or type it (section 1.1) | hold an edge |
| Change the lattice | grab (4.1): cell limits, seed offset, the trace's a and b | grab |
| Fly the halls | wheel, drag | pinch, one finger |
fold.cell · fold.sphere 0 1 · seed.slab: a pseudo-Kleinian hall, the strata ramp on its orbit trap.wrap · invert · scale 1.1 · seed.slab, a lattice folded through a sphere, in the engine's own colours.kleinian 1.95 .02, a limit set on Maskit's slice.Two limits. The Apollonian slab's estimate is scaled by .4, which keeps the measured stretch under 1 at the 99th percentile, so the march stays safe. The Kleinian estimate jumps at the wrap's seam, where nearby points land on opposite sides of the lattice: the measured stretch there reaches 11 to 13 where a true distance has 1. An overstep at that seam is possible; none has been seen. In push these families read as star clusters and webs, sparse beside pull. Walking the Metasurface between two halls, a blended camera can land on a surface for a frame or two, never at rest.
The mathematics
Pseudo-Kleinian, per iteration: p ← 2·clamp(p, −l, l) − p; k =
max(r²/|p|², 1); p ← k p; D ← k D. No +c. The estimate
is |v(p)/D − t|, with v the distance to the seed: ½|z| for the slab,
max(ρ − r, |ρz|/|p|) for the pillar. An orbit that does escape keeps r/dr.
Sampled over 20,000 point pairs a half-estimate apart, the Lipschitz constant has a 99th percentile of 1.02 and
a maximum of 1.9 for the slab. Kleinian: wrap into a box, turn half the box through 180° about the separation line, invert: z ← −z/|z|², shift by the
trace; estimate min(y, a − y, .3)/max(dr, 2), 99th percentile 1.25.
5.7 The Mandalay Fold
DarkBeam's stepped fold, adapted by knighty [27]: where the box fold
reflects each axis at one wall, fold.mandalay sorts |z| and steps the axes against each other,
so faces rise into towers and domes. It stands in the Mandelbox's place in the formula, and it is what Tom Beddard's
Aurullia series was built from [28].
fold.mandalay .5 .15 · fold.sphere .5 1 · scale 2.3 · rotate 0 0 10 · +c ×12
| Desktop | Touch | |
|---|---|---|
| Go there | M, click the Mandalay site | the Metasurface glyph, tap its site |
| Fold offset, step | grab (4.1): fo and g | grab |
| Use it elsewhere | hold an edge in the graph, pick it from the ring of ops | hold an edge |
fo moves the steps.The mathematics
The estimate here is a heuristic. fold.mandalay uses the box family's r/dr and counts
the fold as a stretch of 1, as Mandelbulber does. But 50.2 % of [−4, 4]³ lies on branches where one axis takes
another's value: no isometry, a stretch of up to √3. Nothing has overstepped visibly. Those branches have images of
no volume, so a generic point's preimages are all axis-wise, and the inverse tries those at random, checking each
forward.
5.8 Subgraphs
A run of ops can be named and used in several places, so that an edit to one reaches them all. In the text it is a
letter: a( … ) the first time, with its ops, and a( … ) after that with only what is its own.
fold.box 1 · a( fold.sphere .5 1 · scale ^1.8 ) · +c · rotate 0 0 15 · a( 1.4 ) ×8
The two uses are linked: the structure and every number are shared, so moving the sphere fold's radius in either
moves both. A number marked with ^ is exposed: it belongs to each use, here 1.8 and 1.4, and a folded
use shows it as an ordinary dimension line. Detach turns one use back into plain ops and leaves the others
linked. The same link works on a piece of the shading network or the driver lane. Breeding treats a shared number as
one gene that moves every use, an exposed number as one gene per use, and never touches the structure.
A definition lives in its formula, so a URL or an export carries it. To use a subgraph in another formula, the shelf keeps saved ones in this browser; placing one copies it in, with no link back.
| Desktop | Touch | |
|---|---|---|
| Choose a run of ops | Shift-click its nodes | a second finger grows the run |
| Wrap run | the plus on the run's bracket | the same |
| Open a use in place | double click; Esc closes | double tap; two-finger tap closes |
| Use it again | Shift-drag a use onto an edge, or pick it in the edge's ring | drag with a second finger resting, or the edge's ring |
| Give a use its own number | with it open, pull a line off itself and drop it on the dashed frame; pull it back inside to share it again | the same |
| Detach use, save to shelf | hold a use: the ring | hold |
| Remove a use | click it, Delete | three-finger tap |
a used twice in one iteration, with a turn between the uses.The limits. The engine's eight slots and 64 ops count every use, because each use is real ops: a subgraph saves typing, not GPU space, and a chimera subgraph used twice takes its species' slots twice. The lens's preview of a shared number moves the first use only; the value applied on release is exact. Ramp stops can't be exposed (a ramp's map lines can). A subgraph can't contain a subgraph, and no link crosses collage pieces. A shelf holds eight entries: an entry can't be removed, and a ninth saved one pushes out the oldest.
The mathematics
A subgraph is a list laid over plain ops: { id, n, uses, expose }, the path of each use's first op and
the exposed numbers. The renderer never sees it. An instanced formula packs byte for byte as its written-out form, so
the shaders, duals and JITs are the same. In the metric, a shared number appears once and carries the sum of what its
copies move: an upper bound, since their partials may cancel, so a step of D pixels never moves more than
D.
5.9 Workflow: Subgraphs, Start to Finish
Follow these in the figure below: the arrival Mandelbox with its graph open and no subgraph yet.
- Wrap a run. A run is a stretch of ops in one chain, clear of other subgraphs. Choose its two ends; a bracket with a plus appears beside them; the plus wraps the run. It takes a letter,
a, and folds: its glyphs shrink between brackets. Desktop Shift-click the first op, Shift-click the last, click the plus.Touch Hold the first op, tap the last with a second finger, tap the plus. - Open and fold it. Open, a use is drawn in place in a dashed frame with the rest of the graph in sight. Edit inside: every edit reaches every use. Hold an edge at the frame's inner ends to add an op to the run itself. Desktop Double-click the use. Esc closes it.Touch Double tap. Two-finger tap closes it.
- Place another use. The new use is linked: it shares the structure and every number. Desktop Hold an edge: the ring lists this formula's subgraphs first. Or Shift-drag a use onto an edge.Touch Hold an edge. Or hold a use, rest a second finger, and drag it onto an edge.
- Expose a number. Exposing makes a number belong to each use instead of being shared. With a use open, select an op, pull its line off itself and drop it on the dashed frame: a dot appears there. One number, one inner parameter. In the text it gets a
^. Desktop Double-click the use, click the op, drag its line up and onto the frame. Pull it back inside to share it again.Touch The same with a finger. - Override it per use. Close the use and select it: the exposed number is an ordinary dimension line, on this use alone. It can be dragged, and bound to a driver with a band. Bindings belong to their use. Desktop Click the folded use, drag its line.Touch Tap, drag.
- Detach or delete. Detach turns one use back into plain ops, with its numbers as they are, and leaves the others linked. Desktop Hold the use: the ring's detach use. Delete removes the selected use.Touch Hold; three-finger tap removes.
- Keep it on the shelf. A subgraph lives in its formula. To carry one to another formula, save it to the shelf, in this browser, and place it there. Placing copies it in, with its numbers, and keeps no link. The shelf holds eight, newest first. An entry can't be removed, and a ninth pushes out the oldest. Desktop Hold a use, pick save to shelf. In the other formula, hold an edge and pick from shelf.Touch The same.
- Do the same in shading and drivers. The same link works on nodes. A use's last node is its output. Opening any use opens the first, and the frame's empty ground takes new members. A folded use has no input dots, so wire its links from outside with it open. A placed use starts free, reading what the first reads, with its output unconnected. From the shelf, a shading or driver subgraph loses its links from outside. Desktop Shift-click nodes, click the bracket's plus, double-click to open. Hold empty frame for another use.Touch Hold a node, tap another with a second finger, tap the plus, double tap to open.
6. Colour and Motion
Colour and motion are networks in the same graph, fed by the orbit's readings: shading nodes for colour, drivers for parameters that vary across space, along the orbit or in time.
6.1 Shading Nodes
Beside the formula's graph sits its shading frame. The orbit's readings flow out of the repeat zone into it: the fold index, the orbit trap, the depth, the Lyapunov exponent, facing, the leading species, the w axis. A colour ramp turns a number into a colour; maths nodes combine numbers (add, multiply, power, sine, bands for terraces); colour mixes combine colours; two outputs take the surface colour and the glow. The ramp has up to sixteen stops, five interpolations, three colour spaces (RGB, HSV, Oklab [29]), an input map (scale, offset, clamp, repeat, mirror, log, invert) and presets: oil, malachite, bone, prism, strata, beetle and abyss, each with the reading it suits (the orbit trap, or facing for the thin films). A new ramp starts as the colour already there, and its presets open beside it, one tap away. Colours are picked on a hue ring around a held stop: angle is hue, distance is saturation. The network is stored in the formula, so the URL, the lineage, breeding and every export reproduce the colour exactly.
| Desktop | Touch | |
|---|---|---|
| Start shading | the plus in the empty frame: the look stays as it was | tap it |
| Link | drag from an output dot to an input dot | the same |
| Add a node | hold a link or an input: a ring of the types that fit; hold empty frame: a free node | hold |
| Ramp presets | a new ramp opens them beside it: click a gradient, or anywhere else to shut them, or Esc; later, hold the ramp, point and release | tap a gradient; hold the ramp |
| Edit a ramp | click it: the bar (click adds a stop), the stops (drag moves), scale, offset and hue turn as lines, and toggles for interpolation, colour space, mapping mode, log and invert | tap |
| Math or mix | click it: its op glyph (click cycles) and its constant as a line | tap |
| Remove | Delete: the selected stop, or the node (its input takes its place) | three-finger tap |
| Pick a colour | hold a stop: the hue ring; wheel = lightness, Shift-wheel = alpha | hold a stop; a second finger sets lightness and alpha |
The mathematics
The shading network is a typed dataflow in topological order, packed after the op records and run per hit by a small register machine (one vec4 register per node). The ramp's hue turn rotates the Oklab a, b plane after interpolation, so lightness stays put. Push splats run the same program with the readings a sample has. The GPU and the CPU evaluator agree to a median channel error of 10−7.
6.2 Drivers
A driver makes a parameter a function instead of a number. Four kinds drive: orbit readings, read every iteration (the iteration count, the radius, the trap, the running stretch, the point's coordinates), which change the dynamics; world fields read where the orbit starts (axis, sphere, noise, tissue, the start point), which vary the shape across space; time, which animates it; and other parameters, which link one op's value to another's. Maths and remap nodes sit between. A bound parameter shows its range as a band on its dimension line, with a live tick at the value the centre's orbit gives it.
A driven shape is no longer guaranteed to have a safe distance estimate, so the engine measures how steep the drivers make it and shortens the march's steps by that factor, only for driven formulas.
| Desktop | Touch | |
|---|---|---|
| Add a driver | hold the empty lane (inside the repeat zone) or the row above it | hold |
| Bind | drag a driver's output dot onto a selected op's dimension line | the same |
| Set the band | drag its ends (low, high) or its middle | the same |
| Read another parameter | pull an op's line off itself into the lane | the same |
| A driver's own numbers | click it: its switches (wave, tissue's cell or wall, maths op, clamp) as glyphs, its numbers as lines below the zone | tap |
| Insert between | hold an input dot, a driver link or a binding's hairline: the ring, inserted there | hold |
| Unbind, remove | click the band or the driver, Delete | three-finger tap |
The mathematics
A binding sets θ = lo + v(hi − lo), with v the driver's value. Drivers whose sources are world, time or parameters are hoisted out of the loop and computed once per pixel; orbit readings run every iteration. The step factor is measured, not bounded: at every sensed hit L = |∇d| / |∇d with the drivers held|, and the march divides its steps by the 90th percentile of L, capped at 16. In the duals a driver enters the Jacobian as ∂F/∂θ · ∇θ, the same form as a chimera's field.
6.3 Drivers into Colour
The drivers are visible to the shading frame. Any driver can feed a ramp, a maths node or a mix, so one noise can bend the shape and paint it in step. Everything in colour can be bound with bands as formula parameters are: the ramp's scale, offset and hue turn, a stop's position, a maths constant, a mix's amount, and the glow's gain. A clock on the hue turns the whole ramp around the hue ring.
| Desktop | Touch | |
|---|---|---|
| Drive a colour input | drag a driver's dot (the second bus) onto a shading input | the same |
| Bind a colour number | drag it onto a shading line or a stop tick | the same |
| The glow's gain | click the glow output | tap |
6.4 The Kaliset
Kali's map is a shader artist's favourite: fold by absolute value, divide by the squared length, subtract a constant,
and a few iterations give dense, glittering detail [30]. The forums used it for
colour and bump on other fractals. Here it is the kali node: a number computed from the point the ray
hit, so any species can take it, and it feeds a ramp, a maths node or a mix like any reading. It does not change the
shape.
| Desktop | Touch | |
|---|---|---|
| Add it | hold a link or an input in the shading frame: kali is in the ring | hold |
| Its constant, frequency | click the node: four dimension lines (cx, cy, cz, f) | tap, drag a line |
The mathematics
p ← |p| / (p·p) − c, from p0 = f x,
with x the hit point and n iterations. The output is the mean change of |p| from one iteration to the next, or in the other mode the least |p|.
7. Collage
A collage leaves every piece's dynamics alone and decides only where one finished surface meets the next, and what the seam looks like.
7.1 Joins
Pieces are whole formulas, up to eight, each with its own iterations, chimeras, drivers and colour. Their distance estimates are joined by smooth minima [31]: a smooth union, and the same kernels turned around for intersection and subtraction; terraced and bevelled seams, the stairs and chamfer of hg_sdf [32]; and a morph, where a field decides which piece is there. The seam width is a parameter like any other, so drivers can vary it across space. A fractal's estimate has no inside, so a cutter is given a grow: its surface pushed out by a margin, which is what a subtraction carves with.
| Desktop | Touch | |
|---|---|---|
| Start a collage | drag a lineage dot onto the field, hold a Metasurface site, or carry a ring neighbour out | the collage glyph: tap a site to add it |
| The collage's graph | G | the collage glyph |
| Change the join | hold the join node: ops and kernels, each drawn as its own contour | hold |
| Seam width | drag the dimension line under the join | drag |
| Add a piece | the plus left of the pieces | the plus |
The mathematics
The default kernel is the quadratic smooth minimum
h = clamp(½ + ½ (b − a)/r), d = a h + b(1 − h) − r h(1 − h),
with the cubic, exponential, circular, stairs and chamfer forms beside it. Intersection is −union(−a,
−b), subtraction a ∖ b = −union(−a, b). Every union kernel's partials are
non-negative and sum to one, so the join stays 1-Lipschitz when its pieces are; the chamfer's bevel is √2, and
the march's step covers it. The partials also give each piece its share at a point: the readings
piece and seam for the collage's own colour.
7.2 Placement and Repetition
Each piece has a rigid placement and a uniform scale, which keep its estimate exact, and may repeat: a grid with counts, a mirror, or a polar array. The repetition is measured in the piece's own units, before its size: a polar radius of 4 on a piece of size 0.25 is a ring of radius 1. Click a surface and the piece that leads there is picked; its affine frame appears in hairlines. Drag an axis to move along it, the ring to turn, the corner to scale, the centre dot to move it freely in the screen's plane. A tap on the centre dot switches the axes between the piece's own and the world's; the world frame is drawn a little dimmer. With a piece picked, its repetition cells are drawn too, the original's solid and the copies' dashed.
| Desktop | Touch | |
|---|---|---|
| Pick a piece | click its surface | tap |
| Move, turn, scale | drag an axis, the ring, the corner; the centre dot moves freely | the same, larger hit areas |
| Local or world axes | click the centre dot | tap it |
| Snap | Shift | rest a second finger |
| Repetition | hold the piece in the collage graph: none, grid, mirror, polar | hold |
| Remove a piece | Delete | three-finger tap in the collage graph |
The mathematics
A world point reaches piece i as rep(R−1(x − t)/s), the repetition folding it into the nearest copy in the piece's own frame, so the array moves, turns and scales with the piece. Its distance is di = s · DEi(that point) − g, and the joins fold left to right: D0 = d0, Dj = joinj(Dj−1, dj). In push, each piece walks its own attractor and a sample is kept with the weight of its piece's share there, so a sample carved away by a subtraction vanishes.
7.3 Workflow: A Collage, Start to Finish
Follow these in the figure below, or in the engine itself, which keeps its lineage. The figure starts on a plain Mandelbulb: there is no collage until step 1 makes one.
- Start one. Four ways, all with the same result: the formula on screen becomes piece 1, the new formula lands on the surface under the pointer (or at the focus), about a quarter of the view across, joined by a smooth union a tenth of its size, and it is picked. Desktop (a) The collage glyph in the row: the Metasurface opens with a plus beside its crosshair; click a site. (b) M, then hold still on a site until the ring around it fills. (c) Tab, then drag a lineage dot onto the field. (d) Open the breed ring and carry a neighbour 60 px past its thumbnail, then release on the field.Touch (a) The collage glyph, then tap a site. (b) The Metasurface glyph, then hold a site until its ring fills. (c) Tap a corner mark, drag a lineage dot out. (d) Hold 1.2 s for the ring, carry a neighbour out.
- Pick a piece. A quick click traces the surface and picks the piece that leads there; its frame appears. Picking again elsewhere moves the pick. With a piece picked, a tap on a Metasurface site changes that piece's formula, not the whole collage's. Desktop Click its surface; click open ground, or Esc, to unpick.Touch Tap its surface; tap open ground to unpick.
- Move, turn, scale. The frame's three axes are the piece's own. The ring turns about your line of sight. The corner between x and y scales. A dimension line, an arc or the size shows while you drag. Desktop Drag an axis, the ring or the corner. Shift snaps: a tenth of the frame, 15°, two figures.Touch The same, with larger hit areas. Rest a second finger to snap.
- Switch the axes, or drag freely. The centre dot does two things. A tap flips the axes between the piece's own and the world's, and the world frame draws dimmer so you can tell which you have. Dragging it moves the piece anywhere in the screen's plane through its origin. The choice lasts the session. Desktop Click the dot; drag it.Touch Tap the dot; drag it. Holding it past 0.4 s names the state and does not flip it.
- Open the collage graph. Pieces side by side, each its own small formula, a join under each neighbouring pair, the output at the bottom. Desktop G, or click the strip in the structure layer. G or Esc closes it.Touch The collage glyph, or tap the strip. Two-finger tap closes it.
- Change a seam. A join's glyph is the join itself, the kernel's real contour. The line under it is the seam width at its true size on screen. Desktop Hold the join: the four ops (with this kernel) and seven kernels (with this op), each drawn as itself. Drag the line for the width. Click the join for its numbers: width, steps, morph weight.Touch Hold it; drag the line; tap it.
- Edit one piece's own formula. Click a piece to pick it: its placement and repetition appear as dimension lines below, behind glyphs for move, turn, scale, grow and repeat. Click one of its ops: that piece's formula graph opens on that op, the ordinary editor of section 5.5. Desktop Click the piece, then its op. G or Esc comes back to the collage.Touch Tap, tap. Two-finger tap comes back.
- Repeat a piece. Hold a piece for the ring: none, grid, mirror, polar. The render shows every copy at once; with the piece picked, the cells are drawn on the field, the original solid and the copies dashed. Spacing is in the piece's own units (section 7.2). Desktop Hold the piece in the collage graph, point, release. Its counts and spacing are lines below.Touch Hold, point, lift.
- Carve with a cutter. Change a join to subtraction or intersection and the piece after it becomes a cutter. A fractal's estimate has no inside, so a cutter needs a grow to cut with: a new one gets a tenth of its size automatically. The cut surface sits that far out from the fractal's. Desktop Hold the join, pick the op; drag the picked piece's grow line.Touch The same.
- Give the collage its own colour and drivers. Each piece keeps its shading, blended across seams. The collage's own shading, when set, wins, and it has two more readings:
pieceandseam. Drivers live in a row above the pieces (start x, y, z, w, the four fields, time, maths, remap), and can bind any seam or placement number with a band. A collage's colour reads the collage's drivers only, never a piece's. Desktop Click the output for the shading frame. Hold the row for the ring of drivers. Drag a driver's dot onto a line or a seam line to bind it. Delete removes the selected driver or band.Touch Tap the output. Hold the row. Drag the dot. Three-finger tap removes. - Add and remove pieces. Up to eight. The plus left of the pieces opens the Metasurface in add mode and comes back with the new piece in the graph. It is gone once the collage is full. Desktop The plus. Click a piece, Delete.Touch The plus. Tap a piece, three-finger tap.
- Save, breed, restore. A collage is a document like a formula: the URL, the lineage, stills and splat files carry it, and every edit above is one lineage node. The breed ring works on it: neighbours move placements, joins and each piece's numbers. Two collages walk into each other when they have the same pieces and joins; otherwise the change is a cut. Desktop ⌘Z and ⇧⌘Z; ⌘S; drop the still back on the engine; hold still 1.2 s for the ring.Touch Two- and three-finger taps; the frame glyph; hold 1.2 s.
| On the Metasurface | Tap or click | Hold 0.45 s |
|---|---|---|
| A site, as usual | goes there: the formula on screen (or the picked piece's) becomes the site's; nothing is added | adds it as a piece, where you pressed |
| A site, plus at the crosshair (add mode) | adds it as a piece, where the view looks | adds it, where you pressed |
| Open ground, as usual | moves the crosshair | drops your formula there as a new site |
| Open ground, add mode | adds the formula at that point of the Metasurface, where the view looks; a drag does too | drops your formula there as a new site |
Refused along the way: a collage dropped onto a collage, a ninth piece, the lens, and the loop (P skips it). A push of a collage walks each piece's attractor and keeps samples by their share of the join.
8. Keeping It: Exports and State
What is on screen leaves as a 4K still, a video, a cloud of Gaussian splats or a mesh, and every file carries the formula that made it.
The still is 3840 pixels on the long side at 64 samples, rendered by the JIT in 512-pixel tiles that are each exactly their window of the full frame, so the seams do not show. The video walks the lineage from its root to here at constant visual speed, one PNG per frame. The splats are push samples captured with their covariance and written as a 3D Gaussian splatting file [33]. The mesh samples the distance estimate on a 128³ grid around the focus and extracts the surface with surface nets [34], as a binary STL.
Stills and splat files hold the whole state (formula or collage, camera, mode, look, focus and pins): drop one back onto the engine and it opens where it was made. A mesh does not, and neither does the video. The URL holds the formula, camera and mode, so a link is a scene, without the look. The live view pauses while an export runs, and a hairline at the bottom of the structure layer fills. A video's PNG sequence goes to a folder you pick, or to a streamed ZIP where the browser has no folder access.
| Desktop | Touch | |
|---|---|---|
| 4K still | ⌘S, or the frame glyph | the frame glyph in the structure layer |
| Video, splats, mesh | the film, dots and cube glyphs, bottom right of the structure layer | the same |
| Open a state | drop a still or a .ply onto the engine | not yet (section 11.3) |
9. Touch and the Overlay Toggles
Desktop decides what happens; touch adapts the gesture and the layout, never the behaviour, and adds no buttons.
A phone has no keyboard, no Shift, no ⌥, no wheel and no hover. The engine answers with one rule: a second finger is the modifier, everywhere. Resting, it is Shift (the lens opens, the gizmo snaps); a quick tap is one notch of the wheel (the next op, the next knob pair, farther neighbours); a double tap pins. A touch grab aims at the crosshair in the middle of the screen, so nothing hides under the thumb. Three fingers move the 4-D slice. Two- and three-finger taps walk the lineage back and forward.
The menu mark at the top right unfolds a row of hairline glyphs, the same set on every device: the graph, shading, drivers, Metasurface, collage, structure, Lyapunov and the mode, and last a page glyph that opens this paper in a new tab. A glyph is dim while off and bright while on; every key keeps working, the row only shows them.
The mark takes three presses. The first unfolds the row. A second, while the row is out, folds it and opens the site's own menu, whose docs item opens this paper in a new tab. A third closes the menu. In these figures the mark only folds the row. The mode glyph shows the mode and cycles it: pull, push, loop. Inside the graph, the shading and drivers glyphs fold that part away so the network takes the room, and bring it back; with the graph closed they open it. In a collage the shading glyph opens the collage's own shading and the drivers glyph its graph. The collage glyph opens that graph too, and before there is a collage it opens the Metasurface to add the first piece. One drawing at a time: opening one closes the others. Replay and drift have no glyph here; they sit in the structure layer's key row, with Lyapunov and the Metasurface, on a touch screen.
| Desktop | Touch | |
|---|---|---|
| The row of toggles | the menu mark, top right | the menu mark |
| Mode | P, double click | double tap |
| Back, forward | ⌘Z, ⇧⌘Z | two-finger tap, three-finger tap |
| Shift, the wheel, F | a second finger: resting, a tap, a double tap | |
| The 4-D slice | ⌥ + wheel, ⌥ + drag | three fingers: pinch, drag |
Names on demand. The drawings have no words, so every control can say its name when asked. Rest the
mouse still on a node, a port, a line, a ring item or a toggle for less than half a second, or hold a finger
still on it, and its name appears in small text beside it: an op by its notation (fold.box), anything
else in one to three words (colour ramp, smooth union · quad, orbit trap). On a desktop the
key follows where there is one. The label only reads: a hold still does what it always did (the thumbnail, the
ring of choices, the grab), and a second finger or any move takes the name away. These are the names this paper
uses.
| Desktop | Touch | |
|---|---|---|
| A control's name | rest the pointer on it (0.4 s) | hold a finger still on it (0.4 s); the name sits above the finger |
Not yet on touch. One thing a desktop does has no finger: opening a saved still or splat file, which a desktop drops on the engine.
10. Examples: As Published, and One Step Further
Seven fractals people know, each drawn as it was published and then taken one step further with a tool from the chapters above. Left, the original; right, the step.
The sources are the forums and programs where 3-D fractals grew up: Fractal Forums, where the Mandelbulb, the Mandelbox and the kaleidoscopic folds were posted and argued over; Fragmentarium and Mandelbulber, whose open source code holds the formulas exactly [35] [36]; and the artists who made them a medium. Each pair starts from that formula as published.
10.1 The Mandelbulb
Daniel White and Paul Nylander's power-8 bulb of 2009: in spherical coordinates, raise the radius to the
eighth power and multiply both angles by eight, then add the starting point
[18]. The engine's bulb 8 · +c ×10 is that formula with
its derivative carried alongside (section 3). The step: a tissue in which every cell of space is a bulb of
its own power, 8 or 5, with soft walls between them (section 5.3). The classic hybrids alternated whole
formulas from one iteration to the next; here the species are laid out in space.
10.2 The Mandelbox at −1.5
Tom Lowe's Mandelbox, posted as the "amazing fractal" in February 2010: fold into a box, fold through a sphere, scale, add the starting point [1]. At scale −1.5 the faces turn into castles. The step is a collage (section 7): six small −1.5 boxes in a polar ring around a seventh, joined by smooth unions, a cathedral ring no single formula draws.
10.3 The Kaleidoscopic Folds
Knighty's kaleidoscopic iterated function systems of 2010: fold space across mirror planes, then stretch it about a corner [37]. The Menger sponge is abs, sort, scale 3; the Sierpiński tetrahedron three plane folds and scale 2. The step: a chimera that runs both inside every iteration and averages the point (section 5.2), a species between the sponge and the tetrahedron.
10.4 The Quaternion Julia Set
Alan Norton drew Julia sets of the quaternions in 1982; Hart, Sandin and Kauffman ray traced them with a distance estimate in 1989 [20] [5]. A three-dimensional slice of a four-dimensional set: q → q² + c. The step: drivers (section 6.2) put the constant c on a slow clock, so the slice drifts through the family of quaternion Julia sets on its own.
10.5 Amazing Surf
A Mandelbox variant from the Mandelbulber library (credited there to Kali): the box fold on two axes only, so the shape runs out into sheets and terraced "lands" [36]. It is still one of the most used formulas in Mandelbulber galleries, usually with depth of field [38]. The step: painted in one hue in terraces of the orbit trap (section 6.1), with the rotation inside its iteration on a slow clock (section 6.2), so the lands turn as you watch.
10.6 A Cave in the Manner of Fractal Nature
Julius Horsthuis's films (Foreign Nature, Recombination) made fractals into places: enveloping halls with natural light, rendered in Mandelbulb3D [39]. The engine arrives in such a hall. Painted in one hue, in terraces, with the camera's depth of field, it is the left figure. The step: the same hall with its scale changing through space, a noise driver moving it between 2.35 and 2.65 (section 6.2), so the architecture shifts as you fly through it. Enter and fly (the wheel, or a pinch). A tissue of two Mandelboxes, the obvious step, measured over half a second a frame here: too heavy for a page.
10.7 A Fractal as Gaussian Splats
3D Gaussian splatting represents a scene as millions of small coloured ellipsoids [33], and it is usually fitted to photographs. The engine makes them from the formula: push walks a Julia-type bulb backwards and every sample becomes an ellipsoid shaped by its walk (section 2.2), and the structure layer's dots glyph writes them as a file any splat viewer opens. Left, the bulb as a surface; right, the same set as splats.
11. Planned
What the engine does not do yet, in the same form as the chapters above. Nothing here runs: each section is a place held for a tool that is coming.
Two things are by design, not missing: a collage has no loop, since it has no one map to feed back through; and
the real-iPhone checks (three-finger gestures, the corner marks against rounded screens) wait for a first session
on the device. The design document beside the engine, fractal-engine/DESIGN.md, records every
stretch, its decisions, what was measured and what was left.
11.1 New Capability
Orbit Density as a Medium
A finite density inside the fractal: where orbits spend their time, drawn as a volume the camera looks through, so a surface can sit inside its own nebula.
| Desktop | Touch | |
|---|---|---|
The mathematics
The volume integral of Radiance Fields, with σ the orbit histogram: C = ∫ T(t) σ(r(t)) c(r(t)) dt.
More Than Four Dimensions, and a Full-Frame Tilt
The orbit in ℝᴺ, up to eight, as a change of representation through every layer. The slice will be stored as a whole frame: three plane angles cannot reach every 3-plane of ℝ⁴.
| Desktop | Touch | |
|---|---|---|
The mathematics
xN = O + E·x3, E an orthonormal N × 3 frame.
Structural Mutations
Neighbours in the breed ring that add, remove or swap an op, where today they only move numbers, so that breeding can leave a structure.
| Desktop | Touch | |
|---|---|---|
View-Dependent Emission
Colour that changes with the direction you look from, on surfaces and on exported splats (higher-order spherical harmonics), where today every point sends one colour.
| Desktop | Touch | |
|---|---|---|
The mathematics
c(x, d) = Σl ≤ L Σ|m| ≤ l klm(x) Ylm(d), (L + 1)² numbers per channel.
Drawn Fields and Tissue of Tissues
A field painted by hand on the view, sites placed by hand, and a tissue whose cells are tissues themselves.
| Desktop | Touch | |
|---|---|---|
A Collage Dropped onto a Collage
Today the drop is refused, since collages do not nest. The incoming collage's pieces will join the one on screen, re-placed where they land.
| Desktop | Touch | |
|---|---|---|
A Sun-and-Fog Look
A look for open landscapes: a low sun, height fog and a film grade. The lamp carried beside the camera suits caves; it does not make a sky.
| Desktop | Touch | |
|---|---|---|
11.2 Speed
A GPU Sensing Pass for Collages
Dual numbers through the joins: an exact normal and the metric of every number at once, replacing today's CPU pass.
| Desktop | Touch | |
|---|---|---|
Skipping Far Collage Pieces
Bounding volumes, so a piece out of reach costs nothing. The join must then give exactly the near piece's value, kernel by kernel, and the exponential kernel never quite does.
| Desktop | Touch | |
|---|---|---|
A Step Factor per Tile
The measured step factor per screen tile rather than one for the frame, so a steep corner of a driven scene does not slow the rest.
| Desktop | Touch | |
|---|---|---|
Over-Relaxed Stepping, Far-Iteration LOD, Temporal Reuse
Three ways to draw faster, each of which changes the image: the glow is summed per march step, so fewer steps change the glow. Not decided: they wait for before-and-after images.
| Desktop | Touch | |
|---|---|---|
The mathematics
Over-relaxed sphere tracing steps ω·d, 1 ≤ ω < 2, and steps back when two successive unbounding spheres stop overlapping (Keinert et al., 2014).
11.3 Finishing Touches
The Lens, Further
The lens on driver and shading parameters and on collages, and a map that follows an edit made inside it. Today it is computed once, on op parameters of a formula.
| Desktop | Touch | |
|---|---|---|
Shading Lines
A bound shading line's live range, as an op's line shows the orbit's, and param nodes that read shading parameters.
| Desktop | Touch | |
|---|---|---|
Clock Controls
Pause and scrub for anything driven by time, and the clock in thumbnails, which read it as zero today.
| Desktop | Touch | |
|---|---|---|
Push, Caught Up
The Lyapunov channel and the metric in push, editing in push (a grab needs a surface to sense), and the piece and seam readings on splats.
| Desktop | Touch | |
|---|---|---|
The Neighbour Across a Cell Wall
A repetition reads the nearest copy only, so a piece wider than its cell is overstepped at the wall. The neighbouring copy will be read as well.
| Desktop | Touch | |
|---|---|---|
Moving Pictures and Mesh Regions
MP4 and WebM straight from the engine, where video is a PNG sequence today, and a mesh of any chosen region, where today it is the cube around the focus.
| Desktop | Touch | |
|---|---|---|
Opening a File on Touch
A way to open a saved still or splat file on a phone, where nothing can be dropped on the page.
| Desktop | Touch | |
|---|---|---|
Small Readouts
A hairline cue while the drivers' shader variant compiles, and a readout of w while the slice moves.
| Desktop | Touch | |
|---|---|---|
11.4 Further Out
Deep Zoom
Perturbation and bilinear approximation, for 2-D formulas only, opt-in.
| Desktop | Touch | |
|---|---|---|
A Sparse 3-D Loop
The feedback loop in a sparse volume, where today a 3-D formula shows only the shadow of its dynamics on a plane.
| Desktop | Touch | |
|---|---|---|
A WebGL2 Fallback
The engine for browsers without WebGPU.
| Desktop | Touch | |
|---|---|---|
Recorded Paths
A path through parameter space recorded by hand and replayed at constant visual speed, beyond today's replay of the lineage.
| Desktop | Touch | |
|---|---|---|
Physical Controllers
MIDI and hardware knobs mapped to the two gesture tiers: big slow gestures for structure, small ones for tone.
| Desktop | Touch | |
|---|---|---|
A Growth Engine
A fourth way to draw, hooking the silviculture modules of paper 0 to the formula.
| Desktop | Touch | |
|---|---|---|
Soft Walls Around Chimera Sites
On the Metasurface a chimera's cell is a hard cut unless it is a constant blend. One more level of mix nesting will let it blend softly through a field.
| Desktop | Touch | |
|---|---|---|
Reference: Every Key and Gesture
One page to keep open beside the engine. An empty cell means that side has no gesture for it.
The field
| Desktop | Touch | |
|---|---|---|
| Look | drag | one finger |
| Move along the view | wheel; W S or ↑ ↓ | pinch |
| Slide | A D or ← →; Q E down, up | two-finger pan |
| Faster | hold Shift | |
| Mode: pull, push, loop | P, double click | double tap, or the mode glyph |
| Drift on, off | Space | drift glyph (structure layer) |
| Lyapunov | L | Lyapunov glyph |
| Structure layer | Tab | tap a corner mark |
| Docs | the page glyph; the site menu | the same |
Grab, lens, pins
| Desktop | Touch | |
|---|---|---|
| Grab | hold still 280 ms | hold anywhere: aims at the centre |
| Edit | drag sideways | drag |
| Next op | wheel | tap a second finger |
| Undo | Esc | two-finger tap afterwards |
| Pin, unpin | F | double tap a second finger |
| Lens | hold Shift; move to travel | rest a second finger |
The loop
| Desktop | Touch | |
|---|---|---|
| Zoom, pan, roll | wheel, drag, Shift-drag | pinch, pan, twist |
| Knobs | hold, drag across and up | hold, drag |
| Next knob pair | wheel | tap a second finger |
Lineage and the ring
| Desktop | Touch | |
|---|---|---|
| Back, forward | ⌘Z, ⇧⌘Z (ctrl elsewhere) | two-finger tap, three-finger tap |
| Return to a node | click its dot | tap its dot |
| A node as a piece | drag its dot onto the field | the same |
| Replay | R; any input stops it | replay glyph |
| Ring | hold still 1.2 s | hold 1.2 s |
| Choose | release on a neighbour | lift on one |
| Farther, nearer | wheel | pinch; a second finger taps farther |
| Stay | release at the centre, Esc | lift at the centre |
| Neighbour as a piece | carry it 60 px past its thumbnail | the same |
The fourth dimension
| Desktop | Touch | |
|---|---|---|
| Along w | ⌥ + wheel | three-finger pinch |
| Tilt | ⌥ + drag | three-finger drag |
The graph
| Desktop | Touch | |
|---|---|---|
| Open, fold | G, click the strip | graph glyph, tap the strip; pinch closed |
| Field without an op | hover the node | press it |
| Select, edit | click, drag its lines | tap, drag |
| Insert, fork | hold an edge | hold |
| Add species, change field | hold the field | hold |
| Move | drag a node onto an edge | the same |
| Delete | Delete or ⌫ | fling off, three-finger tap |
| Iterations | drag the count | the same |
| Schedule | click a letter, A–H, Delete; the plus | drag a letter; the plus |
| New chain | the plus beside the last chain | the same |
| Back out | Esc, step by step | two-finger tap |
| A control's name | rest on it 0.4 s | hold still on it 0.4 s |
Subgraphs
| Desktop | Touch | |
|---|---|---|
| Choose a run | Shift-click | hold, tap with a second finger |
| Wrap | the bracket's plus | the same |
| Open, close | double click, Esc | double tap, two-finger tap |
| Another use | the edge's ring, Shift-drag a use | the ring; hold a use, second finger rests, drag |
| Expose, share | pull a line onto the frame, back inside | the same |
| Detach, shelf | hold a use | hold |
Shading and drivers
| Desktop | Touch | |
|---|---|---|
| Start | the plus in the frame | the same |
| Link | drag dot to dot | the same |
| Add | hold a link, an input, empty frame or lane | hold |
| Bind | drag a driver's dot onto a line or a stop | the same |
| Band | drag its ends or its middle | the same |
| Read a parameter | pull an op's line into the lane | the same |
| Presets | a gradient beside a new ramp; hold a ramp | tap a gradient; hold |
| Stop | click the bar adds; drag; Delete | tap, drag, three-finger tap |
| Colour | hold a stop: angle, distance; wheel lightness, Shift-wheel alpha | hold; a second finger sets lightness and alpha |
| Glow's gain | click the glow output | tap |
The Metasurface
| Desktop | Touch | |
|---|---|---|
| Open, close | M, Esc | glyph; two-finger tap |
| Crosshair | drag, click | drag, tap |
| Walk | Shift-drag | one finger rests, another draws |
| Lay in space | ⌥-drag | two rest, a third draws |
| Go to a site | click it | tap |
| Add as a piece | hold it 0.45 s | hold |
| Drop your formula | hold open ground 0.45 s | hold |
| Move, remove a site | drag; off the square | the same |
| Families home | double-click a corner | press a corner twice |
Collage
| Desktop | Touch | |
|---|---|---|
| Pick, unpick | click, Esc | tap |
| Move, turn, scale | axis, ring, corner | the same |
| Snap | Shift | rest a second finger |
| Local, world | click the centre dot | tap it |
| Free move | drag the centre dot | the same |
| Graph | G | collage glyph |
| Add a piece | the graph's plus; collage glyph | the same |
| Join's kind | hold it | hold |
| Seam width | drag its line | the same |
| Repetition | hold a piece | hold |
| Piece's formula | click it, click an op | tap, tap |
| Collage's shading | click the output | tap |
| Remove | Delete | three-finger tap |
The row and exports
| Desktop | Touch | |
|---|---|---|
| The row | press the mark | the same |
| Site menu | press the mark again | the same |
| Close it | a third press | the same |
| 4K still | ⌘S, frame glyph | frame glyph |
| Video, splats, mesh | glyphs, bottom right of the structure layer | the same |
| Open a state | drop a file on the engine | not yet |
What the Engine Refuses, and Its Limits
- Formulas. Eight op lists (slots) and 64 ops, counting every use of a subgraph. A chimera holds two to seven species, with no chimera inside a chimera.
- Grab. Pull only: push has no surface to sense, and in the loop a hold takes the knobs. Moves that would enter the surface are refused.
- Lens. Op parameters of a formula. Not rotation angles or plane normals, not driver or shading parameters, not collages. Its map is computed when it opens and does not follow an edit made inside it. On a shared subgraph number, the preview moves the first use.
- Breeding. Parameters only, never structure. The archive restarts after a flight, because its features depend on the view.
- Drivers. 32 nodes and 16 bindings; four rebuilt ops, eight such bindings. Four driven ramp stops.
kalican't be driven. A driven formula's shader variant takes a few seconds to compile the first time, and it draws with its own values until then. - Collages. Eight pieces. No collage inside a collage. No loop and no lens. A repetition reads the nearest copy only, so a piece wider than its cell is overstepped at the wall.
- Subgraphs. None inside another, none in a species if it holds a chimera, no link across collage pieces, no ramp stops exposed. Eight on the shelf, none removable, and a ninth pushes out the oldest.
- The Metasurface. 29 sites, 16 of them the families. At most four species blend across a wall. A chimera's wall is a cut unless it is a constant blend.
- Stored here only. The lineage, your sites and the shelf live in this browser. A link carries the formula, camera and mode; a still or a splat file also carries the look, focus and pins.
- The figures in this paper. Store nothing, and their mark only folds the row.
References
- Lowe, T. (Tglad). The Mandelbox ("amazing fractal"). fractalforums.com, 2010.
- Mandelbrot, B. B. Fractal aspects of the iteration of z ↦ λz(1 − z) for complex λ and z. Annals of the New York Academy of Sciences 357 (1980) 249–259.
- Draves, S., Reckase, E. The fractal flame algorithm. 2003 (revised 2008). flam3.com
- Hart, J. C. Sphere tracing: a geometric method for the antialiased ray tracing of implicit surfaces. The Visual Computer 12(10) (1996) 527–545.
- Hart, J. C., Sandin, D. J., Kauffman, L. H. Ray tracing deterministic 3-D fractals. Computer Graphics (SIGGRAPH '89) 23(3) (1989) 289–296.
- Hvidtfeldt, M. Distance estimated 3D fractals (a series in eight parts). Syntopia, 2011. blog.hvidtfeldts.net
- Barnsley, M. F., Demko, S. Iterated function systems and the global construction of fractals. Proceedings of the Royal Society of London A 399 (1985) 243–275.
- Potmesil, M., Chakravarty, I. A lens and aperture camera model for synthetic image generation. Computer Graphics (SIGGRAPH '81) 15(3) (1981) 297–305.
- Crutchfield, J. P. Space-time dynamics in video feedback. Physica D 10 (1984) 229–245.
- Blair, D. The Light Herder, a 4K optical video-feedback instrument. thelightherder.com, 2020–2026.
- Douady, A., Hubbard, J. H. Étude dynamique des polynômes complexes. Publications Mathématiques d'Orsay, 1984–1985.
- Hutchinson, J. E. Fractals and self similarity. Indiana University Mathematics Journal 30(5) (1981) 713–747.
- Wengert, R. E. A simple automatic derivative evaluation program. Communications of the ACM 7(8) (1964) 463–464.
- Wolf, A., Swift, J. B., Swinney, H. L., Vastano, J. A. Determining Lyapunov exponents from a time series. Physica D 16 (1985) 285–317.
- Mouret, J.-B., Clune, J. Illuminating search spaces by mapping elites. 2015. arXiv:1504.04909
- Sims, K. Artificial evolution for computer graphics. Computer Graphics (SIGGRAPH '91) 25(4) (1991) 319–328.
- Marks, J. et al. Design galleries: a general approach to setting parameters for computer graphics and animation. SIGGRAPH '97 (1997) 389–400.
- White, D. The unravelling of the real 3D Mandelbulb. skytopia.com, 2009.
- Uhlenbeck, G. E., Ornstein, L. S. On the theory of the Brownian motion. Physical Review 36 (1930) 823–841.
- Norton, A. Generation and display of geometric fractals in 3-D. Computer Graphics (SIGGRAPH '82) 16(3) (1982) 61–67.
- Perlin, K. An image synthesizer. Computer Graphics (SIGGRAPH '85) 19(3) (1985) 287–296.
- Worley, S. A cellular texture basis function. SIGGRAPH '96 (1996) 291–294.
- Sibson, R. A brief description of natural neighbour interpolation. In Barnett, V. (ed.), Interpreting Multivariate Data, Wiley, 1981, 21–36.
- Theli-at, Kleinian drops (2011); knighty's recast as a hybrid, as told at imaginary.org/node/2364; Fragmentarium,
Knighty Collection/PseudoKleinian.frag. - Quilez, I. Apollonian. Shadertoy, 2013. shadertoy.com/view/4ds3zn
- Leys, J. An escape time algorithm for Kleinian group limit sets. Fractal Forums, 27 October 2016. fractalforums.com
- DarkBeam, knighty. 'New' fractal type: Mandalay. Fractal Forums, 2011–12. fractalforums.com
- Beddard, T. Fractal Lab, 2011. creativeapplications.net
- Ottosson, B. A perceptual color space for image processing. 2020. bottosson.github.io
- Kali. The kaliset, Fractal Forums, 2011; explained in Kaliset explorer (defgsus, 2021).
- Quilez, I. Smooth minimum. iquilezles.org, 2013 (revised since).
- Mercury. hg_sdf: a GLSL library for building signed distance functions. mercury.sexy/hg_sdf, 2016.
- Kerbl, B., Kopanas, G., Leimkühler, T., Drettakis, G. 3D Gaussian splatting for real-time radiance field rendering. ACM Transactions on Graphics 42(4) (2023) 139.
- Gibson, S. F. F. Constrained elastic surface nets: generating smooth surfaces from binary segmented data. MICCAI '98, LNCS 1496 (1998) 888–898.
- Christensen, M. H. (Syntopia). Fragmentarium: an IDE for exploring 3D fractals and other systems on the GPU. 2011. github.com/Syntopia/Fragmentarium
- Marczak, K. et al. Mandelbulber 2. github.com/buddhi1980/mandelbulber2
- knighty. Kaleidoscopic (escape time) IFS. Fractal Forums, 1 May 2010. fractalforums.com
- Abalo, J. Fractal gallery (Mandelbulber 2 renders, 2020–2026). fractal.batjorge.com
- Horsthuis, J. Foreign Nature (2015) and Recombination (2022); interview: The beauty of fractal art, 80.lv. 80.lv