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
| Port | Type | Direction | Description |
|---|---|---|---|
shape_in | shape | input | Source shape to scatter from |
density_in | scalarField | input | Optional. Where the points land, as a 0–1 field read at each candidate — an image's luminance through ImageSample, Noise, Gradient, DistanceField. Fill keeps a candidate with probability = the field there; Path spaces points evenly in the field-weighted arc measure; Points weights each pick. Unwired: the plain scatter. See Density. |
out | points | output | Generated points |
Parameters
| Param | Type | Default | Description |
|---|---|---|---|
mode | enum | Fill | Where to place points: Fill (inside the filled region), Path (along the outline), Points (random picks from the source vertices) |
count | scalar | 100 | Number of points to emit. Keyframeable. Clamped to 100,000 (rejection-sampling safety cap). |
seed | scalar | 0 | Integer seed for deterministic random placement (Fill, Points) |
Formerly Boundary / Vertices.
PathandPointswere calledBoundaryandVerticesbefore September 2026 — older tutorials mean the same thing, and saved projects pick up the new names on load.
Expose Channels
When enabled (E button on node header), adds input ports that override params via edge connections:
| Port | Type | Overrides |
|---|---|---|
count_in | scalar | count |
seed_in | scalar | seed |
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.
Density
With a field on density_in (clamped to 0–1): Fill keeps each inside candidate with probability equal to the field there — the same count × 50 attempt budget applies, so a mostly-black field can return fewer than count points (it never spins). Path keeps its even spacing but measures the outline in field-weighted arc length (sampled every ~2 px), so points crowd where the field is bright and thin out where it is dark; a point-count of N still gives N points. Points weights each slot's pick by the field at the vertex. A flat field (or an all-zero one on Path / Points) is exactly the plain scatter, so wiring the port changes nothing until the field varies.
Path
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, Path is deterministic without a seed — the same shape + count always gives the same output positions.
Points
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 Path 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 → OutputDense scatter inside a circle — foundation for dust, confetti, particle emitters.
Path for perimeter effects
Polygon (sides: 6) → PointScatter (mode: Path, count: 60) → PointAttributes (target: Color, source: Index, ramp: red→blue) → DrawPoints60 colored dots evenly spaced around a hexagon, colored by position along the perimeter.
Clone shapes onto scatter
Circle → PointScatter (Fill, 200) → CloneToPoints ← Star200 stars scattered randomly inside a circle mask.
Advect scattered points
Circle → PointScatter (Fill, 500) → PointAdvect ← Noise.vectorField → PointTrail → DrawShapeClassic "fluid inside a container" effect — particles start inside a circle and advect through a noise field.
Scatter where an image is bright
ImageSource → ImageSample (Luminance, coord space: Comp) → PointScatter.density_in
Rectangle (the image's size) → PointScatter.shape_in (Fill, count: 2000) → DrawPointsPoints land in proportion to brightness — a stipple / halftone of the image that re-flows as the image animates. Invert upstream to stipple the shadows; a Remap between ImageSample and the scatter reshapes the response. Any closed shape works as the region: text from TextToShape, contours from ContourExtract, boolean compositions. For births over time from the same field use Point Emitter's density_in.
Points mode for mesh-like effects
EditableShape (hand-drawn) → PointScatter (Points, count=10, seed=0) → DrawPointsPick 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
- Path is deterministic, Fill and Points need a seed. Animating
seedon 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 Path 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.
Related Nodes
- 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
- ImageSample — an image's luminance as the
density_infield - PointEmitter — the same density port, for births over time