# armory3d/armorpaint architecture

> Architecture diagram of the GitHub repository armory3d/armorpaint, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/armory3d/armorpaint
- Repository: https://github.com/armory3d/armorpaint

## Overview

ArmorPaint is a 3D PBR texture-painting application. An artist works through the painting UI and viewport, edits project assets and materials, and relies on rendering to see the result before exporting textures or project data. The tree also shows importers, material and brush node systems, neural image features, and an embedded engine. The README establishes the product and painting workflow; source excerpts show application initialization and some module wiring, but many feature implementations were not sampled, so those relationships are marked unverified rather than asserted as calls.

Main entry points: [`paint/sources/render/make_paint.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/render/make_paint.c) (Paint operations), [`paint/sources/project.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/project.c) (Project state), [`base/sources/engine.c`](https://github.com/armory3d/armorpaint/blob/main/base/sources/engine.c) (Engine services), [`paint/sources/ui/ui_base.c`](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/ui_base.c) (Painting UI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application"]
  node_appmain["App startup<br/>[main.c]"]
  node_ui["Painting UI<br/>[ui_base.c]"]
  node_viewport["Viewport<br/>[viewport.c]"]
  node_project["Project state<br/>[project.c]"]
  node_history["Undo history<br/>[history.c]"]
end

subgraph group_paint["Painting"]
  node_paintops["Paint operations<br/>[make_paint.c]"]
  node_renderpaths["Render paths"]
  node_material["Material nodes<br/>[nodes_material.c]"]
  node_brush["Brush nodes<br/>[nodes_brush.c]"]
  node_neural["Neural image nodes<br/>[neural_node.c]"]
end

subgraph group_assets["Assets and nodes"]
  node_import["Asset import<br/>[import_arm.c]"]
  node_legacy["Legacy import<br/>[import_legacy.c]"]
  node_plugins["Format plugins<br/>[plugins.c]"]
  node_exporttexture["Texture export<br/>[export_texture.c]"]
  node_exportproject["Project export<br/>[export_arm.c]"]
end

subgraph group_runtime["Engine runtime"]
  node_engine["Engine services<br/>[engine.c]"]
  node_gpu["GPU abstraction<br/>[iron_gpu.c]"]
  node_math["Math utilities<br/>[iron_math.c]"]
  node_storage["Dynamic arrays<br/>[iron_array.c]"]
end

node_artist(("Artist"))

node_artist -.->|"uses"| node_ui
node_ui -.->|"interacts"| node_viewport
node_appmain -.->|"initializes"| node_project
node_appmain -->|"initializes"| node_renderpaths
node_viewport -.->|"paints through"| node_paintops
node_paintops -.->|"renders via"| node_renderpaths
node_material -.->|"supplies materials"| node_renderpaths
node_brush -.->|"defines brushes"| node_paintops
node_neural -.->|"provides image tools"| node_paintops
node_ui -.->|"records edits"| node_history
node_project -.->|"loads assets"| node_import
node_project -.->|"loads legacy data"| node_legacy
node_plugins -.->|"extends formats"| node_import
node_project -.->|"saves project"| node_exportproject
node_paintops -.->|"exports textures"| node_exporttexture
node_engine -.->|"uses GPU services"| node_gpu
node_engine -.->|"uses"| node_math
node_engine -.->|"uses arrays"| node_storage

click node_appmain "https://github.com/armory3d/armorpaint/blob/main/paint/sources/main.c"
click node_ui "https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/ui_base.c"
click node_viewport "https://github.com/armory3d/armorpaint/blob/main/paint/sources/viewport.c"
click node_project "https://github.com/armory3d/armorpaint/blob/main/paint/sources/project.c"
click node_history "https://github.com/armory3d/armorpaint/blob/main/paint/sources/history.c"
click node_paintops "https://github.com/armory3d/armorpaint/blob/main/paint/sources/render/make_paint.c"
click node_renderpaths "https://github.com/armory3d/armorpaint/blob/main/paint/sources/render/render_path_paint.c"
click node_material "https://github.com/armory3d/armorpaint/blob/main/paint/sources/nodes_material.c"
click node_brush "https://github.com/armory3d/armorpaint/blob/main/paint/sources/nodes_brush.c"
click node_neural "https://github.com/armory3d/armorpaint/blob/main/paint/sources/nodes_neural/neural_node.c"
click node_import "https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/import_arm.c"
click node_legacy "https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/import_legacy.c"
click node_plugins "https://github.com/armory3d/armorpaint/blob/main/paint/plugins/plugins.c"
click node_exporttexture "https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/export_texture.c"
click node_exportproject "https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/export_arm.c"
click node_engine "https://github.com/armory3d/armorpaint/blob/main/base/sources/engine.c"
click node_gpu "https://github.com/armory3d/armorpaint/blob/main/base/sources/iron_gpu.c"
click node_math "https://github.com/armory3d/armorpaint/blob/main/base/sources/iron_math.c"
click node_storage "https://github.com/armory3d/armorpaint/blob/main/base/sources/iron_array.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_appmain,node_ui,node_viewport,node_project,node_history toneBlue
class node_paintops,node_renderpaths,node_material,node_brush,node_neural toneAmber
class node_import,node_legacy,node_plugins,node_exporttexture,node_exportproject toneMint
class node_engine,node_gpu,node_math,node_storage toneRose
class node_artist toneIndigo
```

## Components

### Application

- [App startup](https://github.com/armory3d/armorpaint/blob/main/paint/sources/main.c): `paint/sources/main.c`
- [Painting UI](https://github.com/armory3d/armorpaint/blob/main/paint/sources/ui/ui_base.c): `paint/sources/ui/ui_base.c`
- [Viewport](https://github.com/armory3d/armorpaint/blob/main/paint/sources/viewport.c): `paint/sources/viewport.c`
- [Project state](https://github.com/armory3d/armorpaint/blob/main/paint/sources/project.c): `paint/sources/project.c`
- [Undo history](https://github.com/armory3d/armorpaint/blob/main/paint/sources/history.c): `paint/sources/history.c`

### Painting

- [Paint operations](https://github.com/armory3d/armorpaint/blob/main/paint/sources/render/make_paint.c): `paint/sources/render/make_paint.c`
- [Render paths](https://github.com/armory3d/armorpaint/blob/main/paint/sources/render/render_path_paint.c): `paint/sources/render/render_path_paint.c`
- [Material nodes](https://github.com/armory3d/armorpaint/blob/main/paint/sources/nodes_material.c): `paint/sources/nodes_material.c`
- [Brush nodes](https://github.com/armory3d/armorpaint/blob/main/paint/sources/nodes_brush.c): `paint/sources/nodes_brush.c`
- [Neural image nodes](https://github.com/armory3d/armorpaint/blob/main/paint/sources/nodes_neural/neural_node.c): `paint/sources/nodes_neural/neural_node.c`

### Assets and nodes

- [Asset import](https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/import_arm.c): `paint/sources/io/import_arm.c`
- [Legacy import](https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/import_legacy.c): `paint/sources/io/import_legacy.c`
- [Format plugins](https://github.com/armory3d/armorpaint/blob/main/paint/plugins/plugins.c): `paint/plugins/plugins.c`
- [Texture export](https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/export_texture.c): `paint/sources/io/export_texture.c`
- [Project export](https://github.com/armory3d/armorpaint/blob/main/paint/sources/io/export_arm.c): `paint/sources/io/export_arm.c`

### Engine runtime

- [Engine services](https://github.com/armory3d/armorpaint/blob/main/base/sources/engine.c): `base/sources/engine.c`
- [GPU abstraction](https://github.com/armory3d/armorpaint/blob/main/base/sources/iron_gpu.c): `base/sources/iron_gpu.c`
- [Math utilities](https://github.com/armory3d/armorpaint/blob/main/base/sources/iron_math.c): `base/sources/iron_math.c`
- [Dynamic arrays](https://github.com/armory3d/armorpaint/blob/main/base/sources/iron_array.c): `base/sources/iron_array.c`

### Other components

- **Artist**

## Connections

- Artist → Painting UI: uses
- Painting UI → Viewport: interacts
- App startup → Project state: initializes
- App startup → Render paths: initializes (evidence: `paint/sources/main.c`)
- Viewport → Paint operations: paints through
- Paint operations → Render paths: renders via
- Material nodes → Render paths: supplies materials
- Brush nodes → Paint operations: defines brushes
- Neural image nodes → Paint operations: provides image tools
- Painting UI → Undo history: records edits
- Project state → Asset import: loads assets
- Project state → Legacy import: loads legacy data
- Format plugins → Asset import: extends formats
- Project state → Project export: saves project
- Paint operations → Texture export: exports textures
- Engine services → GPU abstraction: uses GPU services
- Engine services → Math utilities: uses
- Engine services → Dynamic arrays: uses arrays
