Layout

Arrange geometry into a flow: pack along an axis with gap, padding and cross-axis alignment.

What it does

Layout arranges what is wired into it. Rows pack along a main axis with a gap between them, inside a container, with padding and cross-axis alignment. Flow packs in one run, Grid uses the counts, Wrap breaks at the container edge, and Pack fits the largest first.

One collection wired into Content arranges its rows. Several connections arrange each whole value as one unit. The node preserves kind: points in, points out. Bounds Out reports the container it settled on, and Count reports how many rows it placed.

When to use it

ParameterTypeDefaultWhat it does
contentAnyListConnect one collection to arrange its rows, or several inputs to arrange each as a whole unit
boundsNumber[] or Collection or SDFContainer bounds. An SDF makes the container non-rectangular — rows land inside the shape. Leave unconnected to use the Region params below.
modeString"Flow"Flow packs along the main axis · Grid uses the counts below · Wrap breaks at the container edge · Pack fits largest-first. One of: Flow, Grid, Wrap, Pack.
main_axisString"x"Axis rows pack along. The negative senses pack from the far side back. One of: x, y, z, neg_x, neg_y, neg_z.
gapNumber0Space between consecutive rows. On a fill axis the viewport handle yields to the share splitters — edit it here.
countsVec3(0, 0, 0)Grid only: how many along X / Y / Z. 0 = no limit. Rows fill along the main axis first, then the other two; the last of those takes as many tracks as it needs.
padding_minVec3(0, 0, 0)Inset from the region's minimum side (per axis)
padding_maxVec3(0, 0, 0)Inset from the region's maximum side (per axis)
cross_align_xString"start"Alignment on X. Ignored when X is the main axis. One of: start, center, end.
cross_align_yString"start"Alignment on Y. Ignored when Y is the main axis. One of: start, center, end.
cross_align_zString"start"Alignment on Z. Ignored when Z is the main axis. One of: start, center, end.
sizing_xString"fixed"X sizing. hug = content + padding · fill = stretch rows to shares of the container (per-row @grow weights the shares; scales the rows, so corner radii and strokes stretch too). One of: fixed, hug, fill.
sizing_yString"fixed"Y sizing. hug = content + padding · fill = stretch rows to shares of the container (per-row @grow weights the shares; scales the rows, so corner radii and strokes stretch too). One of: fixed, hug, fill.
sizing_zString"fixed"Z sizing. hug = content + padding · fill = stretch rows to shares of the container (per-row @grow weights the shares; scales the rows, so corner radii and strokes stretch too). One of: fixed, hug, fill.
pin_xString"none"Anchor rows to the container on X. min/max hold a face · center tracks the centre · both stretches · scale proportions. Per-row @pin_x overrides this. One of: none, min, max, both, center, scale.
pin_yString"none"Anchor rows to the container on Y. min/max hold a face · center tracks the centre · both stretches · scale proportions. Per-row @pin_y overrides this. One of: none, min, max, both, center, scale.
pin_zString"none"Anchor rows to the container on Z. min/max hold a face · center tracks the centre · both stretches · scale proportions. Per-row @pin_z overrides this. One of: none, min, max, both, center, scale.
spaceString"auto"Where the container defaults from. auto = follow the content's layer · comp = the canvas rect · world = the 3D defaults. Only sets the Region defaults below — never how things are measured. One of: auto, world, comp.
region_centerVec3(0, 0, 0)Container centre, used when the bounds pin is unconnected
region_sizeVec3(0, 0, 0)Container size, used when the bounds pin is unconnected. Zero packs outward from the centre.
overridesString""
strengthNumber1Effect strength / wet-dry (0 = no effect, 1 = full). Editable, wirable, keyframable.

Gotchas

Bounds takes a six-element array, a collection, or a Distance Field. A Distance Field makes the container non-rectangular and rows land inside the shape, in every mode. Admission tests a row's eight corners and its centre, which is exact for a convex container and can admit a box straddling a thin neck on a concave one. Leave Bounds unconnected and the Region parameters set the container instead.

Counts applies in Grid mode only. Cross Align on the main axis is ignored by construction.

Fill stretches a row by writing a non-uniform scale, so corner radii and stroke widths stretch with it.

Per-row attributes beat the parameters. @grow weights a row's share of a fill axis, and @pin_x, @pin_y and @pin_z override the Pin parameters. Both accept a per-row array or a single value that broadcasts to every row.

Strength moves rows partway towards their arranged positions only when a single collection is wired into Content. With several connections the wet and dry row counts differ and Strength becomes an on-off.

Overrides is not typed. It records what the viewport gestures write, the drag that reorders a row and the drag that re-divides a split, and it beats the parameters.

Layout solves on the CPU. A point cloud that was living on the GPU is read back before it is arranged, at a cost proportional to the row count.

Worked example

  1. Wire several shapes into Content, or one collection to arrange its rows.

  2. Set Main Axis, then raise Gap until the spacing reads.

  3. Set Region Size to give the rows a container, or wire one into Bounds.

  4. Set Sizing X to fill so the rows stretch to shares of that container.

  5. Wire a Distance Field into Bounds to pack them inside a shape instead.

See also

Merge · SDF · Attribute Assign · Collections