Multi-values in the Emitter Guide

Multi-values in the Emitter Guide

Almost every number you see in the Emitter Guide — a starting size, a speed, a color — is a value: something the editor computes for each particle. A value starts out as a single row (a fixed number, a random range, a graph over the particle's life …), but it does not have to stay that simple. This page describes how a value grows into a multi-value: several rows combined by an expression, with rows that can themselves be multi-values.

From a single value to rows

Every value shows an S button at its right edge while it is in its simple, single form. Press it — or pick Switch to Multi-Value from the value's type menu — and the value becomes a list of rows:

  • Each row is a full value of its own, with its own type (Fixed, Random, a graph, and the rest) picked from its type button.
  • Each row has a one-letter name (a, b, c …) shown at its left.
  • The expression line at the bottom combines the rows into the final result, referring to them by those names — a * b, lerp(a, b, c), a + vec2(0, b) and so on.
  • The + button on the expression line adds another row; the trash button on a row removes it.

The S button on the last remaining row collapses the value back into its simple form.

Nesting: a row that is a multi-value

A row of a multi-value can itself be switched to a multi-value, from the same Switch to Multi-Value entry in the row's type menu. The nested level appears inline under its row, indented, with rows and an expression line of its own — so a value like "a base size, times a variation that is itself randomized per particle" can be built entirely in the Guide, without touching the Emitter Scheme.

A few things to know:

  • Levels nest up to four deep. The menu entry is simply not offered where a value does not allow nesting, or the depth limit is reached.
  • A nested level that has real structure — several rows, or an expression — is framed by a pair of thin vertical lines, so where one level ends and the next begins stays readable even a few levels down. A nested level holding a single plain row stays as light as an ordinary row.
  • The S button on the nested level's own row collapses the level back into a plain row (its expression is discarded; the surviving row's value is kept).
  • Undo and redo treat every step of this — nesting a row, growing a level, collapsing it — like any other edit.

Whole levels can be copied and pasted: copying a nested level puts the entire level on the clipboard, and it can be pasted into any row that accepts one. See Emitter Guide presets, which also covers copying single values between rows.

The Noise value

Any 3D value slot offers a Noise type in its type menu. The value becomes a 3D noise field sampled at a point you choose:

  • Input — a nested value: the 3D point the noise is sampled at. It defaults to the particle position, so nearby particles get similar noise and the effect reads as a coherent field; but it is a full multi-value — replace it with a fixed point, an emitter property, an expression over several rows, or anything else.
  • Smoothness — the size of the noise pattern in space: bigger values give broader, slower-changing noise.
  • Anim. speed — a 3D velocity that slides the noise field through space over time, so the noise "boils" even for particles that stand still.
  • Scale — a nested 1D value multiplying the output range. The raw output spans [-1; 1] per component; the scale stretches it.

A typical use is a per-particle color or size variation driven by where the particle is: pick Noise on the slot, keep the particle-position input and tune the smoothness until the pattern reads at your effect's scale. Under the hood the value drives a Noise3 scheme block; its remaining parameters (interpolation type, additive mode, output range bounds) keep their defaults and can be edited in the Emitter Scheme if needed.

Values decided at birth

Some values are computed once, when a particle is born, and stay put for the particle's whole life — the starting size, the maximum lifetime, the steady rotation axis. For these, the editor freezes the value's final result on the particle: one stored property per value, created only when the value actually varies from particle to particle. A value that is the same for every particle (all rows fixed) stores nothing at all. This keeps the per-particle state of exported effects small no matter how many rows and nested levels the value uses.

Values that are recalculated every frame — movement, forces, a color over the particle's life — instead offer a per-row storage toggle (the padlock on the row), which freezes that row's result at birth when you switch it on. Row types that only make sense frozen (Random) have it switched on for you; types that only make sense live (a graph over the particle's life) have it off. The rest is your choice.