Skip to content

Point Scatter

Generate N points from a shape — scattered inside the fill region, along the perimeter, or from the existing vertices.

Category: Points Menu path: Points > Point Scatter

Ports

PortTypeDirectionDescription
shape_inshapeinputSource shape to scatter from
outpointsoutputGenerated points

Parameters

ParamTypeDefaultDescription
modeenumFillWhere to place points: Fill (inside filled region), Boundary (along perimeter), Vertices (random picks from source vertices)
countscalar100Number of points to emit. Keyframeable. Clamped to 100,000 (rejection-sampling safety cap).
seedscalar0Integer seed for deterministic random placement (Fill, Vertices)

Expose Channels

When enabled (E button on node header), adds input ports that override params via edge connections:

PortTypeOverrides
count_inscalarcount
seed_inscalarseed

Useful for time-driven point counts (e.g. Time → count_in for a growing scatter) or randomizing seed from a vector field.

How It Works

Fill

Rejection-sampling inside the shape's AABB: generates candidate points, keeps the ones that pass a ray-casting point-in-polygon test. Uses even-odd winding across all paths, so shapes with holes (e.g. a donut from ShapeBoolean(Subtract)) are respected — points stay in the filled region and avoid interior holes.

Seeds produce deterministic output — animating seed over time gives a reshuffled scatter each frame; keeping seed fixed gives a stable distribution.

Rejection attempts are capped at count × 50; shapes with tiny fill area (e.g. very thin strokes treated as filled) may emit fewer points than count.

Boundary

Distributes count points uniformly along the combined arc-length of all closed paths. Beziers are subdivided before measuring so curved shapes get accurate arc-length parameterization. Points from multi-path shapes are shared proportionally to each path's perimeter contribution.

Unlike Fill, Boundary is deterministic without a seed — the same shape + count always gives the same output positions.

Vertices

Pulls count points from the shape's existing vertex list, hash-shuffled by seed. If count is smaller than the source vertex count, each output is a random (deterministic) pick. If count exceeds the vertex count, it wraps — each output slot gets hash(seed, i) % vertex_count, so duplicates are expected at high counts.

Attributes

All modes write the standard index attribute (0..N-1) on the output points, so downstream PointAttributes(source=Index) works immediately for per-point styling ramps.

Source-shape vertex attributes are not propagated to scatter output — Fill and Boundary points are fabricated from scratch. If you need source attributes on downstream scatter points, use ImageSample + a renderable representation of the shape to sample back.

Usage Examples

Fill with circles

Circle (radius: 200) → PointScatter (mode: Fill, count: 500, seed: 0) → DrawPoints → Output

Dense scatter inside a circle — foundation for dust, confetti, particle emitters.

Boundary for perimeter effects

Polygon (sides: 6) → PointScatter (mode: Boundary, count: 60) → PointAttributes (target: Color, source: Index, ramp: red→blue) → DrawPoints

60 colored dots evenly spaced around a hexagon, colored by position along the perimeter.

Clone shapes onto scatter

Circle → PointScatter (Fill, 200) → CloneToPoints ← Star

200 stars scattered randomly inside a circle mask.

Advect scattered points

Circle → PointScatter (Fill, 500) → PointAdvect ← Noise.vectorField → PointTrail → DrawShape

Classic "fluid inside a container" effect — particles start inside a circle and advect through a noise field.

Density-driven look via upstream shape

ImageSample (from a silhouette texture) → Threshold/ShapeOp → ... → PointScatter (Fill)

Feed any shape into scatter — text from TextToShape, extracted contours from ContourExtract, boolean compositions, anything that produces closed paths.

Vertices mode for mesh-like effects

EditableShape (hand-drawn) → PointScatter (Vertices, count=10, seed=0) → DrawPoints

Pick 10 random vertices from a hand-drawn shape — deterministic "interesting points" for accents.

Boolean + scatter

Shape A ─┐
          ├→ ShapeBoolean (Subtract) → PointScatter (Fill) → DrawPoints
Shape B ─┘

Points only in the subtracted region — holes in shape B are preserved as empty zones in the scatter.

Tips

  • Boundary is deterministic, Fill and Vertices need a seed. Animating seed on Fill is the easiest way to get twinkling / reshuffling scatter.
  • Count is keyframeable — animating from 10 → 500 gives a progressive density reveal. Works especially well paired with PointAttributes for per-point animation.
  • Rejection sampling slowdown: Fill mode on very thin shapes (e.g. a 1px line treated as filled) may emit fewer points than requested because the AABB is mostly empty. Use Boundary instead for thin shapes.
  • Self-intersecting shapes work under even-odd winding — a figure-8 scatters in the two lobes, avoids the crossing.
  • For dense scatter with high visual uniformity, see the Sunflower pattern on Grid — it's deterministic phyllotaxis, no gaps or clusters.
  • Grid — regular point distributions (Grid / Radial / Hex / Sunflower / Jittered / Concentric); complements PointScatter for non-shape-driven point sources
  • ShapeBoolean — compose shapes before scattering for complex fill regions
  • ContourExtract — field-driven shapes as scatter source
  • CloneToPoints — instance shapes at scattered point positions
  • PointAdvect — animate scattered points through vector fields
  • PointAttributes — style scattered points via fields or index ramps