# How to Create Custom Brush Presets in ArmorPaint: A Complete Guide

> Learn to create custom brush presets in ArmorPaint. Save radius, opacity, hardness, and masks as reusable JSON presets for easy sharing and quick reuse.

- Repository: [Armory 3D/armorpaint](https://github.com/armory3d/armorpaint)
- Tags: how-to-guide
- Published: 2026-09-11

---

**ArmorPaint allows you to save any brush configuration—including radius, opacity, hardness, and masks—as a reusable JSON preset through the Export dialog, storing it in `data/export_presets/` for quick reuse or sharing across machines.**

Custom brush presets in ArmorPaint streamline repetitive texturing workflows by letting you capture and reload complex tool configurations instantly. According to the armory3d/armorpaint source code, the application serializes brush states to portable JSON files that can be shared between projects and users. This guide walks through the exact implementation details, file paths, and functions that power this feature.

## Creating and Saving Custom Brush Presets

Creating a preset involves three stages: configuring the brush, triggering the export UI, and writing the JSON file to disk.

### Step 1: Configure Your Brush

Start by defining the brush characteristics you want to preserve. In the **Brushes** tab, add a new brush using the `+` button or select an existing one. Adjust parameters like radius, opacity, hardness, tilt, and mask settings. Paint on the canvas to verify the behavior before saving.

### Step 2: Open the Export Context Menu

To initiate the export process, hover over the brush thumbnail and right-click to open the context menu. According to [`paint/sources/ui/tab_brushes.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/tab_brushes.c), the `tab_brushes_draw_context_menu()` function (lines 41-44) handles this interaction:

```c
void tab_brushes_draw_context_menu() {
    i32 i = _tab_brushes_draw_i;
    if (ui_menu_button(tr("Export"), "", ICON_EXPORT)) {
        context_select_brush(i);
        box_export_show_brush();          // Opens the export-preset dialog
    }
}

```

Selecting **Export** calls `box_export_show_brush()`, which launches the preset naming dialog defined in [`paint/sources/ui/box_export.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/box_export.c).

### Step 3: Save the Preset to Disk

After naming your preset in the Export dialog, `box_export_save_preset()` serializes the brush data and writes it to your project directory. As implemented in [`paint/sources/ui/box_export.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/box_export.c) (lines 191-200), the function constructs the file path and saves the JSON:

```c
void box_export_save_preset() {
    char *name = box_export_files->buffer[box_export_preset_index];
    char *path = string("%s%sexport_presets%s%s.json",
                       path_data(), PATH_SEP, PATH_SEP, name);
    iron_file_save_bytes(path,
        sys_string_to_buffer(box_export_preset_to_json(box_export_preset)), 0);
}

```

The preset is stored at `data/export_presets/<preset-name>.json`, making it a plain-text file that can be edited externally or version-controlled.

## Loading and Reusing Brush Presets

Once saved, presets persist in the **Export Presets** panel and can be applied to any brush instance.

### Accessing the Export Presets Panel

The preset list is populated by `box_export_fetch_presets()` defined in [`paint/sources/ui/box_export.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/box_export.c) (line 208). Open the **Export** tab in the UI to view all available `.json` files in the `data/export_presets/` directory.

### Applying a Saved Configuration

To load a preset, select it from the list and click **Load** (or double-click). The `box_export_parse_preset()` function reads the JSON and applies the stored values to the active brush:

```c
void box_export_parse_preset() {
    char *file = string("export_presets/%s.json",
                       box_export_files->buffer[box_export_preset_index]);
    /* … JSON is parsed and applied to the brush … */
}

```

This overwrites the current brush settings with the radius, opacity, and mask data stored in the preset file.

## Sharing Presets Between Machines

Because ArmorPaint stores presets as JSON files in `data/export_presets/`, you can manually copy these files to another machine's equivalent directory to share custom brushes. The serialization logic in [`paint/sources/io/export_texture.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/export_texture.c) (specifically `box_export_preset_to_json()`) ensures compatibility across different installations using the same version of the software.

## Summary

- **Brush presets** in ArmorPaint are JSON files stored in `data/export_presets/` that capture radius, opacity, hardness, and mask settings.
- **Export workflow**: Right-click any brush thumbnail to trigger `tab_brushes_draw_context_menu()`, then use `box_export_save_preset()` to write the file.
- **Import workflow**: Use `box_export_fetch_presets()` to list available presets and `box_export_parse_preset()` to apply them.
- **Cross-platform sharing**: Copy JSON files between machines manually since the format is plain text and human-readable.

## Frequently Asked Questions

### Where are custom brush presets stored in ArmorPaint?

Presets are saved as individual JSON files in the `data/export_presets/` directory within your project folder. The `box_export_save_preset()` function in [`paint/sources/ui/box_export.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/box_export.c) constructs this path automatically using `path_data()` and the preset name you provide.

### Can I edit a brush preset manually after exporting it?

Yes. Because `box_export_preset_to_json()` (defined in [`paint/sources/io/export_texture.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/export_texture.c)) serializes brush data to standard JSON, you can open any file in `data/export_presets/` with a text editor to tweak values like radius or opacity before reloading them via `box_export_parse_preset()`.

### How do I transfer brush presets to another computer?

Copy the `.json` files from your `data/export_presets/` folder to the same directory on the target machine. Since the preset format uses platform-agnostic JSON, ArmorPaint will recognize and load them immediately via `box_export_fetch_presets()` without additional conversion.

### What brush parameters are included in a preset?

According to the brush data structures in [`paint/sources/util/util_brush.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/util/util_brush.c), presets capture radius, opacity, hardness, tilt settings, and any active mask configurations. When you invoke `box_export_show_brush()`, the entire state of the selected brush is serialized, ensuring identical behavior when the preset is later loaded.