Skip to content

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

PortTypeDirectionDescription
inpointsinputPoints or shape to filter (shape vertices are treated as points)
mask_inscalarFieldinputOptional scalar field sampled at each element's position to drive deletion
outpointsoutputFiltered stream (type mirrors input)

Parameters

ParamTypeDefaultDescription
ruleenumBy AttributeWhat 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)
attributestring(empty)By Attribute rule: the column read when mask_in is disconnected — an attribute, group, or intrinsic. Empty deletes nothing
attrRuleenumMemberHow 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
attrValuescalar0Comparison operand for Greater Than / Less Than. Hidden under Member
rangeFirst / rangeLastscalar0 / 9Range rule: inclusive @index span to delete
everyN / everyOffsetscalar2 / 0Every Nth rule: delete element i when (i − offset) mod n = 0
invertbooleanfalseFlip 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:

  1. If mask_in is connected, sample the scalar field at each element's position.
  2. 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.

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.

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 threshold to control how aggressive the deletion is
  • Use invert when 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 ResampleShape upstream 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 ShapeDelete node may add path-level filtering
  • PointAttributes — write the selection attribute (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_in source for "delete inside/outside this shape" workflows