Skip to content

Swarm & attractor — the per-particle hue band

ParamDefaultWhat it does
hue_spread1.0 (swarm) / 0.15 (attractor)Width of the per-particle hue band. Low = a coherent, single-family cloud; 1.0 on the swarm is the full-wheel rainbow.
hue_center0.5 (swarm) / 0.075 (attractor)Centre of that band in the gradient. Two presets that differ only here render as different colours.

Particle hues occupy hue_center + (particle_seed - 0.5) * hue_spread. hue_center is cyclic for the same reason color_center is — a negative centre wraps into the bright end of the gradient, it does not clamp toward the dark one.

depth_hue rides this same coordinate on the two 3-D attractor flows, and what it does is whatever moving along your ramp does — it has three regimes, none of them discoverable from the roster (design-backlog 0062):

  1. It reads as a hue cue only on a ramp that travels in hue at roughly constant lightness. Rendered side by side at perspective = 0.5: against the since-retired attractor_lorenz’s night-blue → teal → mint → solar-white ramp, a depth_hue of 0.4 reads as the near material getting brighter — a second contrast lever pointing the same way as depth_fade, not an independent cue. Against a constant-lightness hue-travel ramp (blue → cyan → gold → orange → rose) the identical figure at the identical value puts a cool cyan on the far wing and warm gold on the near one, which is the atmospheric reading the parameter was built for. A dark-to-light ramp is what an additive glow scene is normally tuned for, so this is the trap the default tuning walks into.
  2. It wraps, and the wrap can make far material look near. The offset is ±depth_hue/2 on a coordinate the LUT sampler repeats — keep it under 2 * min(hue_center, 1 - hue_center) or one end walks off the ramp and wraps to the other. attractor_lorenz’s hue_center ran as low as 0.13, so a depth_hue much above 0.26 sends the far end negative and lands the far material on the same bright mint as the near — the cue inverts into a collision. At depth_hue = 1.0 with hue_center = 0.20, both ends of the depth range sample the same coordinate (0.70, and -0.30 which wraps to 0.70). The repeat is the LUT’s documented behaviour everywhere else in the colour surface, so it is not clamped specially here.
  3. It is structurally dead under ink_amount = 1, like saturation: the terminal remap keys on luminance and discards hue, and a depth tint is exactly the cue an ink preset cannot show. Not quite inert on a mono palette (the coordinate shift moves lightness, which the remap does see), but measured at depth_hue = 0.4 it moves 42 % of pixels by a mean of 2/255 — a rounding error against what depth_fade does deliberately on the same frame.

On the five IFS figures that coordinate has two more terms, and they are the reason a wide hue_spread can make them look broken (ADR-0087, ADR-0088). The full expression there is

hue_center + (particle_seed - 0.5) * hue_spread
+ (which_sub_copy - 0.5) * map_tint
+ how_far_from_skeleton * root_tint

The third term is not the same shape as the other two. map_tint is centred — it spreads either side of the colour you chose — while root_tint is anchored at zero: a point sitting on one of the figure’s contraction points takes no shift at all and keeps your colour exactly, and the rest of the figure ramps away from there in one direction. So the third term only ever pushes the coordinate one way, which matters when you are budgeting.

And it is a budget. All three write the same number, so adding one means taking authority away from another, not stacking a third term on top. It has been measured twice on the same preset:

the changewhy
attractor_fern’s hue_spread 0.16..0.420.05..0.125at the wider spread the random per-particle scatter smeared the parts together and map_tint was a faint wash at any setting
the same fern’s map_tint 0.460.22stacked at full strength alongside root_tint the plant washes out; the stock preset looked better once the budget was split

The *_hue routes are the escape, and that is what they are for. Neither map_hue nor root_hue touches this coordinate — they rotate the hue of the colour the ramp already returned — so a figure whose coordinate is fully spent can still take a part separation or a depth cue through the hue route. That is also why they throw a part out of a narrow palette rather than moving it within one.

On the fern the escape won, so the second row is a measurement rather than the shipped tuning. Judged against root_hue — which did not exist when the split was measured — the fern keeps map_tint at its full 0.46 and takes its depth cue through the hue route instead, giving up nothing. Every shipped IFS preset binds root_hue; none binds root_tint. The budget is real; paying it is the second choice.

One more trap on root_tint specifically: its effective range is per figure, from 0.41 on the spiral to 1.05 on the dragon, so the same binding is not the same look across figures. See the full section in the parameter roster for the table and for the age_* params these replaced.

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