Skip to content

[particles] — for attractor

KeyValuesNotes
familyde_jong, clifford, thomas, lorenz, fern, tree, dragon, sierpinski, spiralWhich figure the compute step iterates. Optional — absent means de_jong. The last five are IFS figures, not strange attractors — see below.
density0.0005 .. 1.0What fraction of the tier’s particle budget to draw. Optional — absent means 1.0, the whole budget. The budget is not a fixed number — see below.
morph_toany IFS figure nameThe figure the bindable morph param travels towards. Optional — absent pins the figure and makes morph inert. A load error on the four map families, which have no table to interpolate.
system = "attractor"
[particles]
family = "lorenz"
density = 0.02

density and fade are one look, not two settings. density decides how many points you are drawing with; fade decides how long each one stays on screen. What you see is the product:

low fade (short trail)high fade (long trail)
high densitya crisp stipple — the attractor’s measure, every point an independent samplefog — so many overlapping trails that the figure fills in solid
low densitya sparse scatter of dots, usually too thin to readcurves — few enough trajectories that you can follow each one, which is the classic plotted attractor

The bottom-right cell is the one density was added for. At density = 1.0 the scene draws the whole budget, and raising fade just makes a denser cloud — you cannot get a trace out of it, because that many simultaneous trails overlap into a solid. Drop to 0.02 or below and the same fade reads as banded spiral curves instead.

density is a fraction of a budget that moves with the window. Since ADR-0140 the attractor’s sample budget is a density against the render target, not a flat tier constant: it is the tier’s own count at 640x360 and below, and rises with the pixel count above that, capped lower in a window than under shot --render. So the same density draws a different absolute number of points at different sizes — deliberately, because the deposit spreads over the render target and a flat count is what made a 1080p render read as an upscale. Author to the look, not to a count. Two consequences worth holding: a preset tuned in a small window keeps its look at 1080p rather than thinning out, and the point counts quoted anywhere in this file are the 640x360 anchor’s, not a promise about your display. docs/capturing.md carries the per-size table.

Two things worth knowing before you reach for it:

  • Total light does not change when you move it — but the picture does. The engine divides each particle’s deposit by how many are drawn, so the sum is invariant: a sparser cloud is not a dimmer one. That is what makes density a structural choice rather than an exposure control. It is not a free re-aim, though, and the first two presets to go sparse both had to pay for it: the same light landing on a fraction of the pixels is far brighter per texel, so a sparse preset needs a cut on the order of trail frames / density to stay off the tonemap shoulder. Spend that cut on brightness. It is a plain multiplier on the same already-count-normalized deposit, so it composes with density instead of fighting it, and being scene-local it blends as pixels across a dissolve. size and fade also buy level and change the picture while they do it — a wider nib and a longer trail are looks, not stops — so reach for them when you want what they do, not when you only want less light. (attractor_thomas ships brightness = 0.10 at density = 0.02, and the since-retired attractor_lorenz shipped 0.03 at 0.002 — the worked examples of that cut. An older copy of either may carry the same number on exposure instead; the swap is level-neutral and the value transfers unchanged.)
  • The tier caps the top, it does not set the value. density is a fraction of whatever the current quality tier allows — 50 000 at the standard tier and 150 000 at the rich one at the 640x360 anchor, and more than that at a larger target (see the note above). So density = 0.02 is 1 000 points on one and 3 000 on the other in a small window, and proportionally more in a big one. You are choosing a proportion, not a count.

It is structural: set once when the preset loads, and not bindable to audio. An eased particle count would re-decide the picture every frame.

The two flow families draw strokes, not dots. thomas and lorenz integrate a trajectory, so each particle’s position this frame is one step along a path from where it was last frame — and the engine draws that whole step as a short segment with rounded ends. de_jong and clifford are maps: each iteration throws the point somewhere else entirely on the figure, so a line between successive positions would be a bright chord across the picture rather than a piece of it. Those two keep drawing dots, and nothing you can set changes either choice — it is a property of the attractor, not a preference.

What that means when you are tuning:

  • On lorenz and thomas, low density is finally worth reaching for. The segments join end to end with no gap, so a sparse cloud reads as continuous curves instead of a dotted line. This is the combination the table above calls “curves”, and before the segment existed you could not actually get there — a sparse cloud just looked sparse.
  • They are brighter than they used to be, and you may need to pull them back. A segment covers more of the frame than a dot, so the same preset now lays down more light: measured on a plain figure, mean frame luminance went up 2.0x on thomas and 3.1x on lorenz. This is deliberately not compensated in the engine — a faster-moving particle drawing a longer, brighter streak is arguably the correct rendering of speed. If it is too hot for your look, the lever is brightness — one multiplier on the deposit, which is exactly what “the same figure, less light” asks for. size and fade will also pull it back, at the cost of a finer nib and a shorter trace; exposure will too, and should be your last resort rather than your first, because it moves the whole frame.

The family sets the map and the meaning of the four bindable coefficients a/b/c/d, each of which defaults to that family’s canonical value (De Jong 1.641 1.902 0.316 1.525; Clifford -1.4 1.6 1.0 0.7; Thomas uses a alone at 0.19; Lorenz sigma/rho/beta = 10 28 2.667, d unused). Bind them to bands for a morphing cloud, but move them slowly and by a little — these are chaotic maps, and a large jump reads as a hard cut rather than a morph. On the five IFS figures they mean nothing at all — that family’s shape is an affine table, and morph/curl/vigor/lean/bias are what reach it.

Built from a8ce055 at version 0.115.0. This site tracks main and is not versioned per release.