MIKE PORETTISupervisor - Creative Technologist - VFX Artist
← Tools Development

TOOLS DEVELOPMENT / MAYA SCATTERING

Worldbrush

Paint with assets.
Build with a live node graph.

Worldbrush is a GPU-accelerated asset-scattering tool for Maya, developed for environment building and set dressing in film and VFX. It brings direct brush control and procedural scattering into one workflow, from the first placement to a published USD scene.

Scatter foliage across terrain, build up ground litter, or art-direct a field of rocks. Use the graph to establish the distribution, then shape it in the viewport with brushes. Layers, masks, and asset variation keep the result organised as the environment develops.

Worldbrush on a real Maya scene — 850 rock instances on an authored terrain, evaluated and drawn by Worldbrush. Demonstration scene.

01 / THE LIVE NODE GRAPH

A scatter you can
keep working on.

The live node graph is the spine of Worldbrush. It describes where instances come from, how their attributes change, and which masks influence them. Connections carry either a stream of instances or a field of mask weights.

Paint and Fill produce instances; Instance Attributes varies transforms and prototypes; Prune removes instances reversibly. Mask sources and processors form their own connected branches. Named ports make the difference between instance streams and mask weights explicit.

Individual node outputs can be viewed independently, so you can inspect the scatter before and after a stage. Brushes edit an existing Paint or Fill stage; a separate node is not created for every brush stroke. The graph stays focused on meaningful stages of the setup.

Bypass controls, backdrops, and portals help organise larger graphs. Cache and freeze controls serve explicit stages; the normal workflow keeps recipes editable.

The live scatter graph — The running Maya session’s Talus graph: slope and noise masks, Levels, Fill, Instance Attributes, and the viewed Paint stage.
Inspect the distribution before and after variation — Matching-camera viewport captures: Fill output on the left; downstream transform variation on the right.

02 / PAINTING & ART DIRECTION

Work on the scatter
with your hands.

Brushes give artists local control over the distribution. Build up a region, open a gap, soften a crowded patch, or change the asset mix without reconstructing the entire setup.

Brush shape, falloff, and transform controls define how an edit affects the area beneath the cursor. Use broad edits to establish the composition and smaller passes to refine the areas closest to the camera.

Paint / Erase add and remove placements. Move / Relax / Pinch reshape the distribution. Edit changes transforms and prototype IDs. Comb directs orientation; Clone repeats a sampled arrangement; Pile gathers placements. Mask paints local protection with add, remove, and smooth operations.

Brush Library — The brush tools in the Library, including the newer Physics Paint entry.
Brush shapes — Built-in brush-shape presets in the actual Library browser.
Editable falloff — Native Bezier falloff widget showing the smooth default influence curve.

03 / LIBRARY & PRESETS

Reuse a setup.
Keep its controls.

The Library brings brushes, brush shapes, falloff curves, transform presets, modifiers, asset lists, and node-graph templates into a searchable browser. Select a brush to activate it, or apply a preset to its matching panel.

Built-in graph templates include Meadow Carpet, Pocket Litter, Bloom Islands, Crease Rocks, Lowland Moss Band, Talus Breakup, Crop Furrows, and Shade Understory. Each stores node recipes and connections; it does not freeze a finished scatter or package the target geometry.

Save a useful setup as a user preset, or point the Library at a shared preset folder. Graph templates retain parameters and texture references, so portable setups still need their source assets and textures to resolve.

Graph preset browser — Eight shipped graph templates in the native Library. Thumbnails are the application’s own preset previews.
Modifier shelf — The native Library’s modifier category, with the actual tile labels and icons.
Shared Library settings — The actual Worldbrush Library settings, using the capture session’s isolated preset folder.

04 / SURFACE-AWARE MASKS

Give the distribution
a reason to be there.

Geometry masks expose slope, ambient occlusion, curvature, and height controls. Use them to favour flat ground, find recesses, follow an elevation band, or distinguish ridges from cavities.

Procedural noise and tile patterns provide breakup. Texture masks read authored imagery, including UDIM textures; UV Transform adjusts the sampling coordinates. Merge combines mask branches, while Levels, Remap, Clamp, Invert, and Blur reshape the result.

Masks can control Fill generation or Prune existing instances. Previewing a mask separately helps explain why a region receives coverage before you judge the final asset mix.

Height-mask preview — Worldbrush’s live mask preview on the demonstration terrain, driven by its height channel.
Slope-mask preview — The same terrain and camera with slope weights displayed directly in the viewport.

05 / INSTANCE ATTRIBUTES

Control the variation,
axis by axis.

Translation, rotation, and scale use per-axis modifier stacks rather than a single randomise switch. Stack constants, random values, curves, noise, and expressions; enable axes independently and lock uniform scale where the asset needs to keep its proportions.

The Instance Attributes node exposes transform and asset-ID variation in the graph, including local or world space. The Edit brush applies changes locally, with Set, Blend, Multiply, Min, Max, Add, and Subtract modes.

Asset IDs choose prototypes, while weights in the asset list control the mix of newly created placements. Material and look assignment remain part of the downstream look-development pipeline.

Instance Attributes on the live layer — Native controls for the running sample: per-axis stacks, asset ID, combine mode, and transform space.
Uniform and randomised variation — The same 850-instance distribution and camera: uniform scale/orientation on the left, randomised modifier stacks on the right.
Two prototypes in one layer — Actual cooked prototype mix: 663 Strata Stone instances and 187 Weathered Stone instances, selected through the asset-ID stack.

06 / LAYERS, ASSETS & TARGETS

Keep the environment
easy to revise.

Separate ground cover, rocks, and hero dressing into scatter layers. Each layer carries its graph, asset slots, visibility, and target settings. Duplicate, merge, or hide layers as the environment develops.

Bring scene assets into a layer or resolve them through a filesystem asset library. The import workflow includes updating library-backed assets to their latest version and reimporting the source while retaining asset IDs and painted placements.

Target lists support more than one surface, with a grid fallback. Maya meshes and gpuCache geometry can supply scatter surfaces. Keep the target binding separate from a reusable graph template so the same recipe can be applied to another landscape.

The active scatter layer — The native layer list from the saved demonstration scene.
The source asset — The authored Weathered Stone mesh used by the scatter, isolated in Maya for inspection.
Target controls and surface — The real target list and its authored terrain. The terrain is separate from the reusable graph recipe. Native detail captures, stacked.

07 / VIEWPORT & SCALE

Built around
dense environments.

Worldbrush is designed around GPU-accelerated evaluation and viewport interaction. The goal is to keep the artist working directly with the scatter as instance counts grow, including the start, movement, and end of a brush stroke.

The viewport system includes levels of detail, distance and screen-size culling, and optional occlusion culling. These controls reduce the amount of geometry that needs to be displayed while an artist navigates and edits a dense scene.

Performance at millions of instances is a development target. The practical limit depends on asset complexity, hardware, viewport settings, and the graph being evaluated.

High, Balanced, and Low representations provide different asset detail levels. Motion and stroke LOD can reduce display cost during navigation or painting. The renderer also includes paged instance handling and optional distant-page impostors.

High, Balanced, and Low — Three actual viewport captures with the same camera and simple demonstration asset, using each representation setting. This is a visual comparison, not a performance benchmark.
Viewport and culling controls — The running application’s viewport settings, including detail and navigation controls.

08 / USD & PIPELINE HANDOFF

From Maya
into the VFX pipeline.

The finished scatter is published as USD, with a PointInstancer for each layer. Prototypes and per-instance position, orientation, and scale carry the arrangement into the downstream scene.

The publishing workflow also carries target-surface UV data and ShotGrid look-resolution metadata. This connects the scatter to a pipeline where Katana resolves published look files and Arnold renders the finished assets.

USD import brings PointInstancers back into editable layers. Baking to native Maya geometry provides another output when the scene requires it. Material and look development belong to the downstream rendering workflow.

Target-surface UVs are published as mgsp_target_st, allowing a downstream shader to sample a texture using each instance’s landing position. USD bake settings include overwrite or version-up policies. The newer graph-owned publish/import actions sit alongside the generic USD import and bake workflow.

USD output settings — Native Worldbrush settings pointing to the actual exported demonstration file.
The published file in MayaUSD — The saved USD deliverable loaded through a MayaUSD proxy. Its PointInstancer was independently read and verified to contain all 850 placements.

09 / IN DEVELOPMENT

Physics-assisted
placement.

A newer Physics Paint implementation adds a settling step to asset placement, with per-asset, surface, and environment controls.

This development work is separate from the earlier physics tools, with a focus on settling behaviour and integration with the layer graph.

10 / AN EXAMPLE WORKFLOW

From a broad distribution
to deliberate placement.

A useful scatter needs both coverage and composition. Procedural tools establish the broad rules; painting lets an artist respond to a camera, a silhouette, or a specific patch of terrain. Worldbrush brings those two ways of working together inside Maya.

  1. Choose the surface and assets

    Set up the target geometry and organise assets into scatter layers. A layer can contain multiple asset slots, with weights to control the mix of newly created instances.

  2. Paint, fill, and shape

    Paint placements directly or generate a distribution with Fill. Introduce masks and transform variation, then use brushes to refine the arrangement where the composition needs attention.

  3. Inspect, revise, and publish

    View individual stages of the graph, adjust the upstream setup, and inspect the downstream result. Publish the finished layers as USD PointInstancers for look development and rendering.

From target surface to varied scatter — Actual viewport captures: target terrain, uniform transforms, and randomised transforms. The cameras match within this comparison.

11 / DEVELOPMENT

An ongoing
tools-development project.

I’m developing Worldbrush around three connected priorities: a live, inspectable node graph; responsive brush interaction at scale; and reliable USD output for a film and VFX pipeline.

The project combines a native Maya plug-in, CUDA-based GPU work, a Python/PySide interface, and USD integration. It is actively evolving, with development focused on preserving edits as the graph changes and keeping the viewport and published result consistent.