Painting Data & Channels
PaintData assetization, per-channel painting, save and duplicate behavior.
PaintData Assets
Painting results no longer live only inside the scene — they are persisted as permanent assets in the project. The storage is split into two trees: an Editor-only tree and a Runtime tree that ships in builds.
Editor tree — PaintData .asset
{SaveDataFolder}/PaintData/{Material name}/{Channel name}/
└─ <channel name>.asset
PaintData is an editor-only ScriptableObject and is not included in builds.
SaveDataFolder default: Assets/UModelerXData/Editor
Runtime tree — .mat / .png
{PaintRuntimeFolder}/{Material name}/{Channel name}/
├─ <material name>.mat (runtime material)
└─ <channel name>.png (runtime texture)
The material and texture are runtime assets, so they live in a separate Runtime tree.
PaintRuntimeFolder default: Assets/UModelerXData/Runtime/PaintData
Auto-Setup
The moment a material is assigned to an object's material slot, the corresponding PaintData / channel / layer assets are created automatically and bound to the slot, and you can begin painting immediately.
What gets created vs. reused depends on what the slot already contains — the rules below keep the painter from accidentally overwriting source assets that aren't meant to be edited.
Material handling
| Material in the slot | Behavior |
|---|---|
| None | Auto-setup is skipped. Assign a material first to begin painting |
Modifiable .mat (regular material under Assets/) | The original is shared. Other objects using the same material stay in sync with painting results |
Read-only material (built-in, under Packages/, inside the UModelerX package, etc.) | A .mat clone is created in the PaintData folder and the object's slot is swapped to the clone. The original is preserved |
Texture handling (per channel)
| Texture in the slot | Behavior |
|---|---|
| None (empty slot) | A new PNG is created, pre-filled with the channel's default background color |
Modifiable Texture2D asset (under Assets/, main asset) | The texture is adopted as-is and painting writes directly into the original PNG. Every object that shares this texture stays in sync |
| Read-only / sub-asset / other type (built-in, embedded FBX texture, RenderTexture, etc.) | A new PNG is created with the original pixels copied in as the initial content. It looks identical to the source even before Apply, and painting never touches the original asset |
Per-Channel PaintData
Each channel (Albedo / Normal / Metallic / Roughness / Mask, etc.) is managed as a distinct channel entry. Channels that point at the same PNG automatically share a single PaintData instance (deduplication).
Channels Panel
The Channels panel in the Painting 3D inspector lists the channels owned by the current material. From here you can change the resolution and select channels. See the Channels Group page for details.
Painting Multiple Channels Simultaneously
Brush, shape, and gradient commands all iterate over the active channels and apply in a single pass. You can paint the same stroke onto multiple channels at once, which speeds up PBR material work.
Scene Save Behavior
When a scene is saved, the PaintData on UModelerX components inside that scene is flushed to disk along with the scene. Render textures are restored immediately after the save so you can keep working without interruption.
Object Duplication
When a painted object is duplicated, its PaintData / material(.mat) / texture(.png) assets are also duplicated and detached from the original. Edits on either side do not affect the other.
Prefab Stage
When you paint inside a Prefab Stage and then leave the stage, in-progress PaintData is cleaned up alongside the prefab as part of the closing handlers. (The actual prefab save still follows Unity's standard save flow.)
Brush Color Persistence
The brush color is stored per channel (Albedo / Metallic / Roughness, etc.) and automatically persisted, so closing and reopening the window preserves the last color you used on each channel.
