Attributes

Attributes are the named values every point, vertex or shape carries: position, colour, size, and anything else you add.

Each element of a collection travels with a bundle of named values. Those are its attributes. One element knows where it is (@P), which way it faces (@N), what colour it is (@Cd), and how big it should be (@pscale). Across a thousand points that is an editable dataset flowing down the graph.

Every attribute name starts with @, and that is how it is referenced everywhere: in node parameters, in the Expression language, and on the spreadsheet. For the value shapes underneath, see Fields.

The standard attributes

These follow well-known conventions, so the same name means the same thing across every node.

NameWhat it holdsExample use
@PPosition in spaceMove points around, scatter, animate
@NThe direction a surface faces (its normal)Lighting, aligning instances
@CdColourTint by height, paint, randomise hue
@pscaleSize, one number for all axesGrow and shrink instances
@scaleSize per axisSquash and stretch, and what a transform writes
@orientOrientation (which way it's turned)Rotate copies, point shapes along a path
@idA stable unique number per elementKeep identity across frames, group by id
@uvTexture coordinatesPlace an image onto a surface
@vVelocityMotion blur, simulation, trails
@analyticWhich Analytic shape this row isDraw a crisp circle rather than a baked one

@id is stable from frame to frame. Colour element 7 red on frame 1 and it is still element 7 on frame 100, even if row order changes.

@analytic

A shape carrying @analytic is drawn as an Analytic shape, sharp at any zoom, because the shape is described mathematically rather than baked into pixels. A circle stays a circle whether it fills the screen or sits one pixel wide.

You rarely set @analytic by hand. Nodes like Circle stamp it, and the Analytical toggle switches a shape between crisp analytic drawing and a baked version. Some effects cannot keep a shape analytic and bake it down first, which happens automatically.

Where attributes live

@P, @orient and the size together make up each row's placement, the frame it sits in. That is why they behave as a set: transform a collection and one authority rewrites the frame, writing @scale per axis and removing @pscale rather than leaving two spellings of one size to disagree. Author whichever you like on a fresh collection; once something has moved the rows, @scale is the one that is there, and anything that wants a single number takes the average of its three axes.

Most attributes ride with points: @P, @pscale, @id, @orient. A few live at a finer level so a surface can carry extra detail.

Each attribute is placed where it belongs automatically. The distinction matters for a sharp crease or a seam in a texture, both of which need per-corner data.

Open the spreadsheet to see every attribute laid out as a table, one row per element and one column per attribute.

Writing one without code

An Expression is not the only way to set an attribute. Attribute Assign writes a named one onto a collection: pick or type the name, wire the values in, and every element gets one. A single value spreads across the collection and an array lands one value per element, so a Noise, Flood Fill or Brush output becomes an attribute directly.

The write is a blend rather than an overwrite. Each element ends at lerp(existing, new, w), where w is the mask_weights you wire multiplied by the selection-weight column mask names. Leave both out and w is 1 everywhere. That is how a painted mask confines the write to part of a collection.

Attribute Reader goes the other way, pulling one named attribute out as an array to drive something else.

The bridge into Expressions

Inside an Expression node you read and write attributes directly by name:

@Cd = {1, 0, 0};                  // paint everything red
@P.y += sin(@P.x);                // ripple along X
@pscale = hash(float(@id), 1.0);  // random size per element, stable by id

Read an attribute to drive something, assign to it to change it. Anything you can name with @ you can shape with an Expression.

Assigning to a non-standard name like @myValue creates a brand-new attribute. Watch the spelling: @hieght does not error, it makes a new attribute nothing reads. Reading a name you never assigned is the opposite: a compile error that names the attribute, so a typo shows up immediately on the read side and silently on the write side.

See also