Skip to content

Point Attributes ​

Sets per-element attributes on points, either from a spatial field or a uniform value. Attributes are read by downstream Draw and Clone nodes.

Category: Point Ops Menu path: Point Ops > Point Attributes

Ports ​

PortTypeDirectionDescription
points_inpointsinputSource points
field_inscalarFieldinputSpatial field to sample at each point position (also accepts vectorField and colorField)
outpointsoutputPoints with attributes set

Parameters ​

ParamTypeDefaultDescription
targetenumScaleWhich attribute to write: Scale, Scale X/Y, Opacity, Rotation, Color, Index, or Custom
sourceenumFieldWhere the value comes from: Field / Value (literal), or a ramp source — Index, Age, Random, Speed — that samples the curve / colour ramp below. See Sources
valuescalar1.0Uniform value (used when source=Value, or as fallback when source=Field with no field connected)
valueXYvec21, 1Per-axis uniform value for the Scale X/Y target (linked pair; unlink for independent X/Y)
colorValuecolorwhiteColor value (used when source=Value, target=Color)
customAttributestringcustomAttribute key name (used when target is Custom)
indexCurvecurveRamp0→1 linearRamp sources + scalar target. The curve is sampled at t (see Sources) and its value is written. Shown as the Curve widget in the Output section
indexColorRampgradientRampblack→whiteRamp sources + target=Color. The gradient is sampled at t. Shown as the Color Ramp widget in the Output section
indexCyclescalar, keyframeable0Offsets t before the repeat mode — animate it to scroll the ramp along the points (or along each particle's life)
indexRepeatModeenumClampWhat happens outside 0–1 after cycling: Clamp, Repeat, Mirror
randomSeedscalar0Source=Random. Changes which fixed random value each element gets
ageRangescalar60Source=Age, in frames. Only applies to points without life (or with life ≤ 0): t = age / ageRange. Emitted particles carry their own life and ignore it. Properties shows a live hint under the row — input age: 0 → 61 read from the connected points, or unused — input points carry Life (70) when they have one
speedRangescalar500Source=Speed, in px per second. t = speed / speedRange, so a particle moving at this speed reads the end of the ramp. Properties shows the connected points' actual speed under the row (input speed: 12 → 540 px/s — velocity length × comp fps) so the range can be sized against it
outputMinscalar0Lerp the [0,1] ramp / field output into [outputMin, outputMax]. Hidden for Color and Rotation targets and for source=Value. Default 0/1 is identity
outputMaxscalar1See outputMin

How It Works ​

PointAttributes evaluates per point. For each point in the input it computes a value according to source, optionally remaps it through Output Min / Max, and writes it under the target's attribute key.

Sources ​

SourcePer-point valueTypical use
Fieldfield_in sampled at the point's position (origin-centred comp pixels); falls back to value / colorValue when nothing is connectedSpatial variation — bigger near the centre, coloured by a gradient
ValueThe literal value / valueXY / colorValueA uniform base scale, opacity or colour
IndexCurve / ramp sampled at t = normalized index (0 for the first point, 1 for the last)Progressive per-copy animation (the AE Repeater pattern)
AgeCurve / ramp sampled at t = age / life; immortal points use age / ageRangeOver-life ramps on particles: size, opacity, colour that change from birth to death
RandomCurve / ramp sampled at t = a hash of the point's stable id and randomSeedPer-element randomness that stays fixed for the element's whole life, wherever it moves
SpeedCurve / ramp sampled at t = `velocity

age, life and velocity are the standard particle attributes written by Point Solver (Track Points writes velocity and age too). A point without them reads age 0 and speed 0 — the start of the ramp. Random hashes the point's id, not its position or list index, so it is stable across motion and across neighbours dying; Grid, Point Scatter and every other producer give their points ids, so Random works on any stream, not only particles. indexCycle and indexRepeatMode apply to all four ramp sources.

The result is stored as a named attribute on each point:

TargetAttribute keyRead by
ScalescaleDrawPoints (radius multiplier), CloneToPoints (uniform scale)
Scale X/Yscale (per-axis)Same key, stored per-axis: DrawPoints renders ellipses, CloneToPoints stretches instances. A vector field drives per-axis magnitudes; a scalar field or the uniform valueXY broadcasts/sets both axes
OpacityopacityDrawPoints (alpha), CloneToPoints (path-level opacity)
RotationrotationCloneToPoints (instance rotation in radians), PointDeform (Normal/Tangent local frame)
ColorcolorDrawPoints (RGBA override), CloneToPoints (path-level color)
IndexindexDrawInstances time offsets (default offsetAttribute) and ConnectPoints Sequential traversal order (default orderBy), so a field-driven Index re-routes the polyline — e.g. connect points in SDF-distance order. Not variant selection: index is an order, renumbered 0…n by every membership change, so CloneToPoints / DrawInstances "Point Index" read shapeIndex instead — write that with the Custom target (attribute name shapeIndex). Values there are floored and wrapped modulo the variant count, so remap via outputMin/outputMax to span 0..N
Customuser-definedAvailable for custom pipelines. One name other nodes read by convention: shapeIndex (see the Index row above), which DrawInstances reads in Point Index mode

Field type handling:

  • ScalarField for rotation uses v * TAU mapping: [0, 1] maps to [0, 2pi].
  • VectorField for rotation uses eval_bipolar() [-1, 1] for full atan2 range [-pi, pi].
  • ColorField writes RGBA directly per point.

Custom target output type: The Custom target follows the field type of the connected input:

  • ColorField -> Vec4 (RGBA stored per point)
  • VectorField (alone) -> Vec2 (bipolar [-1,1] vectors stored per point)
  • ScalarField or uniform value -> Scalar

This lets Custom carry any of the four attribute array types (Scalar, Vec2, Vec4) — whatever matches the field semantics you wired in.

Usage Examples ​

Basic: Spatially varying size ​

Grid -> PointAttributes (target: Scale, field: Noise.scalarField) -> DrawPoints. Points near noise peaks are larger, near troughs smaller.

Per-point color from a gradient ​

Grid -> PointAttributes (target: Color, field: Gradient.colorField) -> DrawPoints. Each point picks up the gradient color at its position.

Rotation for instancing ​

Grid -> PointAttributes (target: Rotation, field: Noise.scalarField) -> CloneToPoints (shape: small arrow). Each instance rotates based on the noise field, creating a flow visualization.

Curve-aligned rotation ​

For rotation that follows a curve's tangent (e.g. branches along a stem), use ShapeAttributes with target: Rotation, source: Tangent upstream of ShapeToPoints → CloneToPoints. The Tangent mode on ShapeAttributes computes the angle directly from the shape's geometry, which is cleaner than wiring up a VectorField for the same result.

Size over life (particles) ​

PointEmitter -> PointSolver -> PointAttributes (target: Scale, source: Age, Curve: 1 -> 0) -> DrawPoints. Every particle is born full size and shrinks to nothing exactly as it dies, whatever its individual life. Chain a second node with target: Opacity for a fade-out, or target: Color with a ramp (white -> orange -> transparent) for cooling embers.

Per-particle random size ​

PointSolver -> PointAttributes (target: Scale, source: Random, Output Min/Max: 0.5 / 2) -> DrawPoints. Each particle picks a size once, at birth, and keeps it — unlike a Random field, which would re-roll as the particle moves through the grid of cells.

Colour by speed ​

PointSolver -> PointAttributes (target: Color, source: Speed, speedRange: 800, Color Ramp: blue -> white) -> DrawPoints. Fast particles glow white, slow ones stay blue.

Tips ​

  • You can chain multiple PointAttributes nodes to set different attributes (e.g., one for Scale, another for Color)
  • When no field is connected, all points get the same uniform value -- useful for setting a base scale or opacity
  • The field_in port accepts scalarField, vectorField, and colorField despite showing as scalarField type
  • Missing attributes in downstream nodes use backward-compatible defaults (scale=1, opacity=1, color=white)
  • Properties: the literal value rows show for Field / Value; the Curve or Color Ramp (whichever the target needs) plus Cycle / Repeat show for the four ramp sources; Age Range, Seed and Speed Range appear only with their own source
  • Age Range and Speed Range carry a live hint of what the input points actually have — their age span in frames, or their speed range in px/s — read from the same capture the Details panel shows. Age Range's hint says unused when the points carry Life, because Age is already normalised by each particle's own life. The hint is blank until the upstream node has been inspected (selecting this node captures one hop upstream)
  • For "random but different every frame" use a Random field with animated evolution; for "random once per element" use source: Random or the @rand01 intrinsic in an Apply To rule
  • ShapeAttributes -- same concept for shape vertices, plus Tangent rotation mode for curve alignment
  • PointSolver / PointEmitter -- write the age, life and velocity the Age and Speed sources read
  • DrawPoints -- reads scale, opacity, and color attributes per point
  • CloneToPoints -- reads rotation, scale, opacity, and color per point; supports pivot modes and group filtering
  • PointDeform -- reads rotation attribute for Normal/Tangent mode local frame
  • Noise -- common field source for spatial variation
  • Random -- positional random field; see the per-element note above
  • DistanceField -- shape-proximity-based field source