Skip to content

Label Points

Renders a formatted text label next to every point — indices, coordinates, or any per-point attribute — as real vector glyph outlines.

Category: Point Ops Menu path: Point Ops > Label Points

Ports

PortTypeDirectionDescription
points_inpointsinputPoints to label
mask_inscalarFieldinputOptional selection mask, sampled at each point's position — values > 0.5 get labels. Overrides maskAttribute
outshapeoutputAll labels merged into one shape. Per-path index = source point index, glyphIndex preserved (counters fill correctly), per-path color inherited from the point's color attribute

Parameters

ParamTypeDefaultDescription
templatestring{index}Label text per point. Tokens: {index} (point array index), {x} / {y} (position), {attr:NAME} (any per-point column, e.g. {attr:speed}), {@NAME} (intrinsics, e.g. {@id}). Unknown tokens render literally
decimalsscalar0Decimal places for {x} / {y} / {attr:} values (clamped 0–4)
fontFamilystringCourier NewLabel typeface
fontWeightscalar400Font weight (100–900 typical)
fontSizescalar12Label size in px
offsetvec2(8, 0)Label anchor offset from the point, px
anchorenumLeftLeft = text extends right of point + offset. Center = centered on it. Right = text extends left
maskAttributestring(empty)Name of a per-point column (attribute or intrinsic); values > 0.5 get labels. Used only when mask_in is unconnected. Empty = label every point

Expose Channels

None.

How It Works

Each selected point's template is expanded, laid out through the real text engine (shaping, kerning), and converted to glyph outlines — identical strings are laid out once and stamped per point. Labels are vertically centered on point + offset; anchor controls the horizontal side. Everything merges into one shape with per-path index carrying the source point's index, so downstream nodes can still tell labels apart. Output is capped at 2,000 labels.

Selection follows the PointDelete convention: a connected mask_in field wins, otherwise maskAttribute, otherwise everything. Values > 0.5 select.

Intrinsic Names

Any attribute-name field here also accepts an intrinsic — a property every element has by virtue of existing, computed on read and never stored. The leading @ is a reserved namespace: no attribute may be named with one, so a name starting with @ never hits the attribute map.

NameValue
@indexPosition in the list, starting at 0
@idStable PointId — survives filtering and reordering
@x / @yPosition, in local geometry space
@nTotal number of elements
@indexnorm@index / (@n - 1), normalized 0–1
@rand01Deterministic 0–1 per element, keyed on @id (stable as neighbours come and go)

Names are case-insensitive (@Y = @y). A misspelled intrinsic (@bogus) resolves to nothing rather than falling through to an attribute lookup.

Non-scalar attributes reduce to a scalar by one rule everywhere: Vec2/Vec3 → magnitude, Vec4 → Rec.709 luma of RGB.

{index}, {x} and {y} are the legacy spellings of {@index}, {@x} and {@y} — aliases, not separate code paths, and they keep working in saved projects. {@index}, {@id} and {@n} print as whole numbers; everything else honours decimals. A token whose name resolves to nothing renders literally, so a typo is visible in the render.

Usage Examples

Basic: Debug indices

Grid → LabelPoints ({index}) → DrawShape (fill on, stroke off) → Output. Every grid point shows its index — the fastest way to understand point ordering before wiring attribute-driven effects.

Data readout

PointAttributes (Custom target writes speed) → LabelPoints (v = {attr:speed}, decimals 1). Each point displays its own live value; keyframe or field-drive the attribute and the labels update every frame.

Creative: Coordinates HUD

TrackPoints → LabelPoints ({x}, {y}, decimals 0, offset (12, −12), Courier New) → DrawShape. Tracked features get a motion-graphics coordinate tag that follows the footage.

Tips

  • mask_in takes a scalar field — Noise or a DistanceField makes labels appear only inside a region; animate the field to reveal them.
  • Point color attributes carry through as per-path colors, so DrawShape tints each label to match its point automatically.
  • Labels are ordinary shape geometry: TextToShape-style effects (ShapeDeform, per-path ops) work on them, and per-path index distinguishes the labels.
  • Missing fonts fall back to Arial/Helvetica (same fallback chain as the Text node).
  • Keep templates short at high point counts — every unique string is a fresh text layout (identical strings are cached within the frame).
  • ConnectPoints — draw the network these labels annotate
  • PointAttributes — write the per-point attributes that {attr:NAME} reads
  • PointDelete — same mask_in / attribute selection convention
  • Text — full text layout for standalone copy (rich runs, wrapping, alignment)
  • FormatNumber — string formatting for single values instead of per-point labels