How an Editable Project Survives the File Boundary
ArmorPaint’s file boundary has two different jobs. A project file must preserve enough structure to reopen an editable scene, while an exported texture set must translate that structure into images another tool can consume. This chapter traces both paths: how an .arm project is assembled and reconstructed, and how import/export deliberately preserve, flatten, or transform different parts of the same PBR state. The practical judgment is simple: a saved project and an exported texture are not two versions of the same thing.
A stroke has just changed GPU targets and project relationships. Those changes are useful only if they can outlive the current frame. ArmorPaint therefore has to answer several questions at once: which graphs and layers must remain editable, how mesh and object relationships are restored, where external assets are found, what happens when they are packed, and which channel meanings survive when the result is flattened for export.
Saving preserves the reasons a surface looks the way it does
The project-save path assembles a versioned .arm representation from runtime state. It does not simply copy the final viewport image. Material and brush node canvases are cloned into a serializable form. Image-node references are rewritten into asset names that can be stored. Mesh data, transforms, parent relationships, layer properties, channel textures, camera and environment settings, and other project information are gathered into the saved structure.
Layer pixels are compressed for storage, while the surrounding layer meaning remains explicit. A saved layer can carry its name, resolution and precision information, UV choices, blend and opacity settings, parent relationship, object mask, channel participation, path information, and references to fill or path materials. The point is not to enumerate fields; it is to preserve the decisions that determine how the pixels should be interpreted when the project is reopened.
The same principle applies to meshes. A mesh object’s geometry is not enough if its transform, parent, material relationship, or optional animation and physics information is lost. ArmorPaint’s project representation therefore retains mesh-related data and the relationships needed to reconstruct the scene. Camera and environment settings are part of the experience as well: they determine how the reopened project is viewed, even though they are not paint pixels.
External assets create a choice. The project can store references to files next to or outside the project, or it can pack image bytes into the project when packing is requested. A relative path can make a project easier to move with a neighboring asset directory, but it still depends on that directory remaining recognizable. Packing improves self-containment for those assets at the cost of larger project data and a different asset-management relationship.
Loading is reconstruction, not decompression
Opening an .arm file reverses the direction of the save path, but it does not merely unpack a byte stream.