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 scalar attribute, e.g. {attr:speed}). 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 scalar attribute; 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.
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