Point Delete
Removes points or shape vertices where a mask value exceeds a threshold. Polymorphic — accepts either a Points or a Shape stream, outputs the same type.
Category: Point Ops Menu path: Point Ops > Point Delete
Ports
| Port | Type | Direction | Description |
|---|---|---|---|
in | points | input | Points or shape to filter (shape vertices are treated as points) |
mask_in | scalarField | input | Optional scalar field sampled at each element's position to drive deletion |
out | points | output | Filtered stream (type mirrors input) |
Parameters
| Param | Type | Default | Description |
|---|---|---|---|
rule | enum | By Attribute | What marks an element for deletion: By Attribute (a selection over any attribute, intrinsic, or the mask field), Range (an element-order span), Every Nth (periodic thinning — no attribute needed) |
attribute | string | (empty) | By Attribute rule: the column read when mask_in is disconnected — an attribute, group, or intrinsic. Empty deletes nothing |
attrRule | enum | Member | How the value marks an element: Member (> 0.5 — "delete the group", no extra knob), Greater Than, Less Than. Committing an intrinsic auto-flips Member to Greater Than |
attrValue | scalar | 0 | Comparison operand for Greater Than / Less Than. Hidden under Member |
rangeFirst / rangeLast | scalar | 0 / 9 | Range rule: inclusive @index span to delete |
everyN / everyOffset | scalar | 2 / 0 | Every Nth rule: delete element i when (i − offset) mod n = 0 |
invert | boolean | false | Flip any rule into "keep only these" — keep the group / span / every Nth, delete the rest |
How It Works
PointDelete resolves a per-element scalar mask, then keeps elements whose mask value is at or below threshold (or above, when invert is set).
Mask resolution priority:
- If
mask_inis connected, sample the scalar field at each element's position. - Otherwise, read the named scalar attribute from the element stream. Missing attribute → mask = 0 → element kept.
Shape handling: when a vertex is deleted, adjacent segments are rewired as straight-line bridges across the gap. Original bezier segments whose endpoints are both kept preserve their control points. Paths with fewer than 2 remaining vertices are dropped. PointIds are preserved, so downstream cache keys remain stable for elements that survive.
Per-vertex / per-point attributes (color, scale, opacity, custom, etc.) are filtered in parallel with the element list, so a downstream DrawShape or DrawPoints continues to render per-element variation correctly.
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.
So attribute = "@y", threshold = 300 deletes every element above y = 300 — a filter that previously had no node in the catalog, because position was a struct field rather than an addressable name.
Usage Examples
Delete points inside a shape
Grid → PointDelete (mask_in: DistanceField from some shape, threshold: 0.5) → DrawPoints. Points inside the shape's distance field get removed, leaving only those outside.
Attribute-driven subset
Grid → PointAttributes (target: Custom, customAttribute: "selection", field: Noise.scalarField) → PointDelete (attribute: "selection", threshold: 0.7) → DrawPoints. Points where the noise field exceeds 0.7 are deleted.
Sparse cloned shapes
Grid → PointDelete (mask_in: Random.scalarField, threshold: 0.8) → CloneToPoints (shape: Circle) → DrawShape. Randomly thin out the grid to about 20% of points before cloning.
Tips
- Binary masks (scalar values of exactly 0 or 1) work as hard on/off switches with the default threshold of 0.5
- Smooth fields give soft cutoffs — raise or lower
thresholdto control how aggressive the deletion is - Use
invertwhen you want to keep the selected region and delete everything else - For shapes, deletion can split a closed path into disconnected pieces if enough interior vertices are removed — use
ResampleShapeupstream to densify first if you need smoother results after deletion - No per-path deletion yet; this node works at the vertex/point level. A future
ShapeDeletenode may add path-level filtering
Related Nodes
- PointAttributes — write the
selectionattribute (or any named scalar) that PointDelete consumes - ShapeAttributes — write per-vertex attributes on shapes
- AttributeToField — bridge per-element attributes into field space for FieldMath composition
- FieldMath — combine multiple fields before feeding
mask_in(e.g. multiply by a distance field to restrict the deletion region) - DistanceField — common
mask_insource for "delete inside/outside this shape" workflows