Skip to content
Русский

The built-in systems

Every built-in system is addressable from a preset. Their named parameters, defaults, and per-system notes are tabulated in Parameter roster — that table is maintained alongside the presets and is the authoritative list.

system = What it draws
fragment_fieldA fullscreen domain-warped light field (fragment shader).
swarm~10k CPU-simulated particles on an evolving flow field in a volume, projected through the same perspective camera as plexus: near marks draw larger and move faster, and a focal plane blurs the layers in front of and behind it.
parametric_curveA sampled line curve from one of seven families — the Maurer rose, Lissajous, hypotrochoid, superformula or harmonograph in the plane, or a torus knot or 3D Lissajous figure in space (below).
lsystemAn L-system turtle figure, precomputed per depth.
star_patternA Hankin star pattern over a regular tiling.
reaction_diffusionA Gray-Scott reaction-diffusion field.
attractorGPU compute particles iterating a strange attractor. Its two 3D families, thomas and lorenz, are seen through the same perspective camera as plexus (below).
spectrumThe log-spaced band array as N elements — bars, a contour, or a ring.
emitterObjects that spawn, ride their own parabola, and die — the only system whose population varies.
shape_fieldOne mark silhouette drawn at frame scale as a signed-distance field, so banding the palette draws concentric offset contours.
warp_meshThe previous frame, resampled through a grid with one transform per vertex — the only system that draws nothing of its own.
shape_collageFlat opaque elements on their own off-white paper, composited in painter order — the only system in which one object is genuinely in front of another, and the only one that draws a graphic rather than light.
analytic_fieldA fullscreen closed-form function of position from one of two families — the Chladni plate’s nodal lines, or an escape-time Julia or Mandelbrot set with optional orbit traps (below).
cellularA discrete cellular automaton on a grid of cells, from one of three families — Conway’s Life and every birth/survival rule, Larger than Life’s wide neighbourhoods, or the cyclic automaton’s spirals — painted with the history of each cell (below).
plexusA few hundred points in 3D, joined by a line wherever two come close, seen through a perspective camera with a real focal plane: lines and dots blur with their distance from focus. The points drift through a cube or ripple on a sheet (below).
waterfallThe spectrum’s recent past as a landscape in 3D: each row is the band array at one moment, the newest at the front and older rows receding behind it, seen through the same perspective camera as plexus (below).
voxelA 3D cellular automaton in a cube of cells, drawn as a glowing volume that absorbs the light behind it, or as lit solid cubes, and seen through the same perspective camera as plexus. Its rules come from a list the preset can switch among on the bar (below).

There is deliberately no per-system preset count here. A count re-drifts every time a preset is added and nothing fails when it does. presets/ is the list; ls presets/*.toml is the count.

shape_collage adds parameters, not grammar. Every variable, constant, function, operator and error message in The expression language is the same with it as without, and a collage preset is written with the same vocabulary as every other preset — worth stating, because a new system reads like it must have brought new grammar with it.

The four line systems share one stroke. parametric_curve, lsystem, star_pattern and spectrum all draw through the same line renderer, so thickness, brightness, glow and softness mean the same thing on all four and a value that reads well on one transfers. softness is the shape of the stroke across its width: 0 is solid with a one-pixel antialiased edge, 1 is a pure quadratic falloff, and the default is 0.25. It is coverage where glow is light — reach for softness when a figure reads blurred and glow when it reads too bright. The working ranges, the sub-pixel limit and the thickness dead zone that sits beside it are in Parameter roster.

Beyond a system’s own parameters, every preset may also bind the engine-wide compositing controls — the shared view transform (zoom, pan_x, pan_y), the background pass (bg_*), feedback trails, the screen-space kaleidoscope (kaleido_*), bloom_*, occlude (how much of the figure’s coverage the backdrop resolves against), the frame exposure, and the final ink-on-paper remap (ink_* / paper_*). Those are documented under Engine-wide controls.

They run in a fixed order, which is worth knowing when a look does not compose the way you expect:

|------------------ linear light, unbounded -------------------| |-- 0..1 --|
scene -> post chain (trails -> kaleidoscope -> bloom) OVER background -> [transition blend] -> tonemap/exposure -> ink -> present

Everything up to and including the post chain is per preset — during a dissolve each side composites its own backdrop and chain, independently. The blend, the tonemap and the ink remap are engine-wide: one pass each, over the frame both presets produced.

Everything left of the tonemap is floating-point linear light, so an additive accumulation is free to exceed 1.0 and no hand-off clips; the tonemap is the single place the frame becomes a displayable picture. That is why bloom_threshold can mean “brighter than the display could show” and why stacked strokes roll off with their colour intact instead of flattening to white.

bg_paper = 1 moves the backdrop to the other side of that line. The background pass then clears the frame transparent, the same bg_* gradient is painted after the tonemap, and the tonemapped scene is laid over it by its own coverage. A #ffffff stop at bg_bright = 1 is display white, which the light route cannot reach, and a pixel the scene fully covers is exactly what it is over black. Paper is not light: it does not bloom, it is not folded by the kaleidoscope, it does not smear under trails, and exposure does not move it. Additive light over it composites by its coverage rather than adding, and a gradient on it is not dithered. The details and the traps are under Paper (ADR-0270).

The post chain renders at the render target’s own resolution. trails and kaleido_* follow the target (quantized and capped) rather than a fixed grid, so composing either one costs no sharpness at any display size.

A stage changes softness, never shape. The internal grid is a resolution, not a proportion: your scene is drawn at the window’s aspect and the stage’s present stretches it back by exactly the inverse, so the grid’s own ratio cancels out and a circle stays a circle whether trails is on or off (ADR-0037). A preset comment that blames a stage for a figure’s shape is stale.

Two things still follow from a stage being a resample:

  • On a line scene, mirror_order / mirror_reflect replicate real geometry before rasterization, so they cost nothing in resolution, while kaleido_* folds finished pixels. Prefer the mirror when either would do — see Mirror or kaleidoscope?.
  • Reaction-diffusion is a special case in the other direction. Its simulation grid is deliberately fixed and independent of the window, but the field is toroidal, so pan_* is a seamless infinite scroll and zoom > 1 tiles rather than running out of field.

In this section

Built from f4f807a at version 0.178.0. This site tracks main and is not versioned per release.