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
| Port | Type | Direction | Description |
|---|---|---|---|
points_in | points | input | Points to label |
mask_in | scalarField | input | Optional selection mask, sampled at each point's position — values > 0.5 get labels. Overrides maskAttribute |
out | shape | output | All 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
| Param | Type | Default | Description |
|---|---|---|---|
template | string | {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 |
decimals | scalar | 0 | Decimal places for {x} / {y} / {attr:} values (clamped 0–4) |
fontFamily | string | Courier New | Label typeface |
fontWeight | scalar | 400 | Font weight (100–900 typical) |
fontSize | scalar | 12 | Label size in px |
offset | vec2 | (8, 0) | Label anchor offset from the point, px |
anchor | enum | Left | Left = text extends right of point + offset. Center = centered on it. Right = text extends left |
maskAttribute | string | (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.
| Name | Value |
|---|---|
@index | Position in the list, starting at 0 |
@id | Stable PointId — survives filtering and reordering |
@x / @y | Position, in local geometry space |
@n | Total number of elements |
@indexnorm | @index / (@n - 1), normalized 0–1 |
@rand01 | Deterministic 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_intakes a scalar field — Noise or a DistanceField makes labels appear only inside a region; animate the field to reveal them.- Point
colorattributes 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
indexdistinguishes 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).
Related Nodes
- 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