Skip to main content

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.

ArmorPaint’s brush system is built around a node-based architecture. Every brush slot contains its own node canvas (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: brush_radiusThe painted stamp radius in screen pixels. Interactive shortcuts:
ShortcutAction
FScrub radius with mouse movement (brush_radius)
[Decrease radius (brush_radius_decrease)
]Increase radius (brush_radius_increase)
When the node graph sets a custom radius, it is stored in 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 FieldDescription
pressure_radiusPen pressure scales the brush radius. A lighter touch produces a narrower stamp.
pressure_hardnessPen pressure scales brush hardness. Light strokes produce softer edges.
pressure_anglePen pressure influences the brush rotation angle.
pressure_opacityPen pressure scales brush opacity. A lighter touch gives more transparent strokes.
pressure_sensitivityGlobal sensitivity multiplier applied to all pressure mappings (0.0–1.0).
Pen pressure settings are configured in Preferences → Pen.
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

Each brush slot has its own independent node canvas. Open it by clicking Nodes in the Brushes panel, or by double-clicking a brush thumbnail. For a complete reference of available brush nodes—including texture inputs, mask generators, and output controls—see the Brush Nodes page.
The brush node graph is parsed at paint time by brush_output_node_run(). Key runtime values produced by the graph include:
Context FieldDescription
brush_nodes_radiusRadius computed from the node graph.
brush_nodes_opacityOpacity computed from the node graph.
brush_nodes_hardnessHardness computed from the node graph.
brush_nodes_scaleScale factor from the node graph.
brush_nodes_angleAngle from the node graph.
brush_nodes_uses_randomWhether the graph uses random variation; triggers re-evaluation on each stamp.
brush_mask_imageResolved brush mask texture used for the stamp shape.
brush_stencil_imageStencil image overlaid on the viewport.

Brush Slots

The Brushes panel (sidebar) displays all brush slots in the project as a grid of thumbnail previews.
ActionHow
New brushClick New (+) in the Brushes panel.
Import brushClick Import to load a .arm brush file.
Select brushClick a thumbnail to make it the active brush.
Open node editorDouble-click a thumbnail, or click Nodes.
DuplicateRight-click → Duplicate or Ctrl+D.
DeleteRight-click → Delete (requires at least two brushes in the project).
ReorderDrag and drop a brush thumbnail to a new position in the grid.

Build docs developers (and LLMs) love