The scatter pipeline consists of several modular components. In essence, scattering is a sequence of actions:

  1. Generate points, either 2D or 3D.
  2. Remove points that do not satify certain conditions.
  3. Place objects on the resulting points.

We break down the sequence into finer components:

  1. Scatterer: Produces a point collection, for 3D, ISpatialScatterer, and for 2D, IPlanarScatterer.
  2. Augmenter: IScatterAugmenter, Augment each point in the point collection to ScatterData (with normal vector, size, etc.)
  3. Preprocessor: IScatterDataPreprocessor, Preprocess each point before feeding them to a filter. Modifies a IFilterContext. e.g. Raycast on terrain.
  4. Filter: IscatterDataFilter, Removes points that do not satisfy certain conditions. Uses a IFilterContext as supplementary data.
  5. Object Placer: Places objects according to ScatterData. Uses an IObjectProvider.

These components and other used data are all interfaces. An abstract implementation of how these components are connected can be found in AbstractScatterPipeline. This forms the barebone of the scatter pipeline, and each component can either be implemented with a plain C# class, or a Robert Houdin Node.