Iterator

Iterate over points or elements, executing a subgraph for each.

What it does

Iterator takes shapes, geometry, or a distance field and either replicates them into copies across a distribution, or transforms the existing elements in place without cloning. The distribution pattern, Linear, Grid, Radial, Object (onto another shape's points or surface), or Path (along a curve), works the same way for both operations, so switching between copying and re-placing needs no rebuild of the layout.

Each instance can carry its own rotation, position offset, scale, anchor point, animation time offset, and fill/stroke colour or PBR material. Wire an array or an easing curve into any of these and one value is distributed per instance.

When to use it

ParameterTypeDefault
sourceOneOf([Collection, FieldOf(Sdf)])
operationString"Replicate"
targetOneOf([Collection, CollectionOf(Crc), Vec3, Vec3Array])"None"
distributionString"Vertex"
distribution_countNumber100
distribution_axisString"X"
align_to_normalBooleantrue
variantAny0
overflowString"Cycle"
rotationAny0
position_offsetAny(0, 0, 0)
scaleAny1
anchorAny(0, 0, 0)
time_offsetAny0
fillOneOf([Color, FieldOf(Color), ColorArray, Field, Material, MaterialArray, RasterArray])rgba(0.00, 0.00, 0.00, 0.00)
strokeOneOf([Color, FieldOf(Color), ColorArray, Field, Material, MaterialArray, RasterArray])rgba(0.00, 0.00, 0.00, 0.00)
materialOneOf([Collection])
strengthNumber1

Gotchas

Fill and Stroke behave differently from the other widgets. An unwired swatch fills or strokes every instance, and fully transparent (alpha 0, the default) means inherit the source's own colour. Wiring something in replaces the swatch completely rather than composing with it.

Under Transform Only, the distribution's position is added to each element's existing position rather than replacing it. Elements that already share a common origin lay out cleanly; for elements that do not, set Anchor to pull them back to a shared point first.

Distribution set to None appears under Transform Only only. It keeps every element exactly where it is, so per-element Fill, Rotation, Scale, or Time Offset can be driven with no relayout. Under Replicate, None would stack every copy on one spot, so it falls back to Linear.

Every per-instance widget (Rotation, Scale, Position Offset, Anchor, Time Offset, Fill, Stroke) is a base, not a fallback. Left unwired, it applies uniformly to every instance. Wired, it composes with the incoming array or curve: additively for rotation, offset, anchor and time, multiplicatively for scale, so 1 stays neutral. It never overrides a wire.

Variant, which source shape goes at each position, does nothing until an array, number, or easing curve is wired into it. Its slider is an index offset added on top of that wire and has no effect while Variant is unwired, where the single source is replicated across every position.

Worked example

  1. Add an Iterator and wire a shape or geometry into Source. Leave Operation on Replicate and Distribution on Linear to see a row of copies.

  2. Raise Count and adjust Spacing/Direction to space the copies out.

  3. Switch Distribution to Grid or Radial to try a different layout, or to Object and wire a Collection into Target to scatter copies onto its points or surface.

  4. Wire an easing curve into Scale, or a colour array into Fill, to give each copy its own look instead of a uniform one.

  5. To restagger existing elements instead of cloning them, set Operation to Transform Only, which re-places what is already there onto the same distribution rather than adding copies.

See also

Stamp · Scatter · Spawn · Points