ArmorPaint’s brush system is built around a node-based architecture. Every brush slot contains its own node canvas (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) that procedurally generates the brush shape, mask, and output. At runtime, the brush node graph is evaluated by brush_output_node_run() each time the brush is applied to the canvas—giving you full control over brush appearance through a live node graph rather than fixed presets. For common workflows, the default brush node graph provides a conventional circular stamp, while the node editor unlocks fully custom procedural brush effects.
Brush Properties
The active brush’s core parameters are stored on the application context (context_t) and updated each frame. They can be adjusted interactively via keyboard shortcuts or numerically in the tool options panel.
Radius
Context field:
When the node graph sets a custom radius, it is stored in
brush_radiusThe painted stamp radius in screen pixels. Interactive shortcuts:| Shortcut | Action |
|---|---|
F | Scrub radius with mouse movement (brush_radius) |
[ | Decrease radius (brush_radius_decrease) |
] | Increase radius (brush_radius_increase) |
brush_nodes_radius.Opacity
Context field:
brush_opacityHow strongly the brush stamp is blended onto the layer (0.0–1.0). Interactive shortcut: Shift+F (brush_opacity). When the node graph drives opacity, the value is stored in brush_nodes_opacity.Hardness
Context field:
brush_hardnessControls the falloff from the brush center to its edge. A hardness of 1.0 produces a sharp, crisp edge; lower values produce a soft, feathered edge. The node graph value is stored in brush_nodes_hardness.Angle
Context field:
brush_angleRotates the brush stamp around its center. Interactive shortcut: Alt+F (brush_angle). Useful for angled brushes or aligning decal-style textures. The node graph angle is stored in brush_nodes_angle.Spacing
Context field:
brush_scale / brush_lazy_stepControls how far the brush must travel before placing another stamp. Lower spacing values produce denser, more continuous strokes; higher values create a dotted pattern. The lazy step (brush_lazy_step) governs lazy mouse smoothing.Blending Mode
Context field:
brush_blendingThe compositing blend mode used when the stamp is applied to the layer. All 18 blending modes from blend_type_t are available (Mix, Darken, Multiply, Burn, Lighten, Screen, Dodge, Add, Overlay, Soft Light, Linear Light, Difference, Subtract, Divide, Hue, Saturation, Color, Value).Pen Pressure
When painting with a stylus, pen pressure can drive multiple brush parameters simultaneously. Each mapping is enabled with a boolean in the application config (config_t):
| Config Field | Description |
|---|---|
pressure_radius | Pen pressure scales the brush radius. A lighter touch produces a narrower stamp. |
pressure_hardness | Pen pressure scales brush hardness. Light strokes produce softer edges. |
pressure_angle | Pen pressure influences the brush rotation angle. |
pressure_opacity | Pen pressure scales brush opacity. A lighter touch gives more transparent strokes. |
pressure_sensitivity | Global sensitivity multiplier applied to all pressure mappings (0.0–1.0). |
On touch devices (Android/iOS), ArmorPaint automatically enables
pen_painting_only mode the first time a stylus tip input is detected. Subsequent painting with a finger is ignored until the next session, preventing accidental paint from palm resting.Brush Depth Rejection
Config field:brush_depth_reject
When enabled, the brush will not paint on areas of the mesh that are behind other geometry from the current camera perspective. This prevents paint from bleeding through a mesh onto surfaces hidden from view.
Enable in Preferences → Usage.
Brush Angle Rejection
Config field:brush_angle_reject
When enabled, the brush skips painting on surface areas whose normal angle relative to the camera exceeds a threshold stored in brush_angle_reject_dot. This keeps paint from being applied to steeply angled or back-facing surfaces, producing cleaner results on curved geometry.
Enable in Preferences → Usage.
Brush Alpha Discard
Config field:brush_alpha_discard
A threshold value (0.0–1.0). Brush stamp pixels with an alpha value below this threshold are discarded and not painted. This cleans up the edges of textured brush stamps that have a semi-transparent border, preventing faint halos from accumulating over repeated strokes.
Configure in Preferences → Usage.
Live Brush Preview
Config field:brush_live
When brush_live is enabled, a real-time preview of the brush stamp is rendered under the cursor as you hover over the mesh—before you click to start painting. This lets you see exactly how the brush will look at the current position, including any texture or procedural effects from the node graph.
Enable in Preferences → Usage.
Node-Based Brushes
The brush node graph is parsed at paint time bybrush_output_node_run(). Key runtime values produced by the graph include:
| Context Field | Description |
|---|---|
brush_nodes_radius | Radius computed from the node graph. |
brush_nodes_opacity | Opacity computed from the node graph. |
brush_nodes_hardness | Hardness computed from the node graph. |
brush_nodes_scale | Scale factor from the node graph. |
brush_nodes_angle | Angle from the node graph. |
brush_nodes_uses_random | Whether the graph uses random variation; triggers re-evaluation on each stamp. |
brush_mask_image | Resolved brush mask texture used for the stamp shape. |
brush_stencil_image | Stencil image overlaid on the viewport. |
Brush Slots
The Brushes panel (sidebar) displays all brush slots in the project as a grid of thumbnail previews.| Action | How |
|---|---|
| New brush | Click New (+) in the Brushes panel. |
| Import brush | Click Import to load a .arm brush file. |
| Select brush | Click a thumbnail to make it the active brush. |
| Open node editor | Double-click a thumbnail, or click Nodes. |
| Duplicate | Right-click → Duplicate or Ctrl+D. |
| Delete | Right-click → Delete (requires at least two brushes in the project). |
| Reorder | Drag and drop a brush thumbnail to a new position in the grid. |