The brush node system is a logic-node graph that runs every time you apply a brush stroke. Unlike material nodes — which compile into GPU shader code — brush nodes execute as a lightweight logic tree on the CPU each paint frame. The graph’s job is to compute the dynamic properties of the current brush stamp: where it paints, how large it is, what its opacity looks like, and which mask or stencil image it uses. Every brush slot in the Brushes panel has its own independent node graph, so you can give each brush a completely different procedural behavior.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/armory3d/armorpaint/llms.txt
Use this file to discover all available pages before exploring further.
Canvas Type
The brush node editor operates onCANVAS_TYPE_BRUSH. You can open it by clicking the Node Editor button in the Brush panel, or by pressing Tab when the brush editor is focused. Brush node canvases are entirely separate from material canvases — nodes and links in one do not affect the other.
Brush Output Node
Every brush graph must contain exactly one Brush Output node (typebrush_output_node). It is the terminal node that the paint engine reads each frame to determine how to stamp the current brush.
| Input Socket | Type | Default | Description |
|---|---|---|---|
| Position | VECTOR | (0.0, 0.0, 0.0) | XY paint position in normalized screen space |
| Radius | VALUE | 1.0 | Brush radius multiplier |
| Scale | VALUE | 1.0 | Brush stamp scale multiplier |
| Angle | VALUE | 0.0 | Brush stamp rotation in radians |
| Opacity | VALUE | 1.0 | Brush opacity (also accepts a texture name string for mask images) |
| Hardness | VALUE | 1.0 | Brush hardness (edge falloff) |
| Stencil | VALUE | 1.0 | Stencil mask (also accepts a texture name string for stencil images) |
.rgb or .a suffix), the paint engine uses that texture as a mask image instead of a flat scalar. Connecting a tex_image_node — which outputs asset name strings — to these sockets is the standard way to drive texture-based brush masks.
Available Brush Node Types
Brush nodes are per-brush-slot. Each brush in the Brushes panel has its own node canvas. Brush graphs are saved as part of the project file and are not shared between brushes unless you manually duplicate them.
| Node | Type String | Description |
|---|---|---|
| Brush Output | brush_output_node | Terminal output node. Drives Position, Radius, Scale, Angle, Opacity, Hardness, and Stencil for each paint stamp. Required in every brush graph. |
| Input | input_node | Reads the current pointer/pen position in normalized screen coordinates. Also drives lazy stroke interpolation via Radius and Step inputs. Supports pen pressure for position, ruler-locked painting, and grid snapping. |
| Tex Image | tex_image_node | Samples an asset image. Outputs the file name string with .rgb or .a suffix. Connect to the Brush Output’s Opacity or Stencil socket to use an image as a brush mask. |
| Color | color_node | Outputs a constant RGBA color value. |
| Float | float_node | Outputs a constant float (scalar) value. |
| Integer | integer_node | Outputs a constant integer value. |
| Vector | vector_node | Outputs a constant float3 vector value. |
| Boolean | boolean_node | Outputs a constant boolean (true/false) value. |
| String | string_node | Outputs a constant string value. |
| Math | math_node | Applies a scalar math operation (Add, Subtract, Multiply, Divide, etc.) to one or two float inputs. |
| Vector Math | vector_math_node | Applies a vector math operation (Add, Subtract, Normalize, Cross, Dot, etc.) to one or two vector inputs. |
| Separate Vector | separate_vector_node | Splits a float3 vector into its X, Y, and Z scalar components. |
| Random | random_node | Generates a random float value. When a graph contains a random_node, the paint engine sets brush_nodes_uses_random = true, causing each stamp to get a fresh random value. |
| Time | time_node | Outputs the current application time as a float, enabling time-animated brush properties. |
| Null | null_node | A passthrough/identity node. Outputs its input unchanged; useful as a routing placeholder. |
Example Workflow: Stamp Brush with a Texture Mask
Open the brush node editor
Click the Nodes icon on the brush slot, or press Tab with the brush panel focused. The canvas opens with a default Brush Output node already present.
Add an Input node
Press Space to open the node search. Type
input and select Input to add the pointer/pen position node. Connect its Vector output to the Position input of the Brush Output node.Add a Tex Image node
Press Space again and search for Tex Image. Select your stamp image asset from the node’s dropdown. This node outputs the image’s asset name string.
Connect the mask
Wire the Tex Image node’s RGB output to the Opacity input of the Brush Output node. The brush will now use the image as its opacity mask.
Adjust stamp tiling
To tile the stamp, add a Float node set to a value less than 1.0 and connect it to the Scale input of the Brush Output. This scales the UV space and produces a tighter tiling of the stamp texture.
Brush graphs evaluate on the CPU every paint frame, not on the GPU. Keep brush node graphs small for optimal performance during high-frequency strokes or particle painting.