Painter bridge
The Substance 3D Painter bridge connects Painter and Unreal through a watch folder. Send to Unreal in Painter (a small Painter plugin that Material Smith installs for you) exports every texture set with Unreal names into the folder. Material Smith imports the textures, creates or updates the material instances and puts them into the mesh slots named like the texture sets. Export again and the same assets update.
Open it on the Painter tab of the panel.
Set it up
Section titled “Set it up”-
Painter plugin: click Install Painter plugin. It copies
materialsmith_send_to_unreal.py(from the plugin’sExtras/Painterfolder) into Painter’s plugins folder,Documents/Adobe/Adobe Substance 3D Painter/python/plugins, and writes the watch folder next to it inmaterialsmith_send_to_unreal.json. The step then shows Plugin installed with the folder, and the button reads Install again. Open plugins folder shows the folder. -
Watch folder: turn on Watch for Painter exports. The line under it says Watching
<Project>/Saved/MaterialSmith/Painter(or Off and the folder). The folder is<Project>/Saved/MaterialSmith/Painterunless you pick another one with Change folder…. If you change the folder, click Install again, so the Painter plugin exports into the new one. -
In Painter: choose Python > Reload Plugins Folder, then tick
materialsmith_send_to_unrealin the Python menu once. Painter remembers it.
Now File > Send to Unreal (ta Material Smith) in Painter, or Ctrl+Shift+U, sends the textures.
The Painter page
Section titled “The Painter page”| Part | What it shows |
|---|---|
| Title and intro | Substance 3D Painter bridge and Send to Unreal → watch folder → instances on the mesh; re-export updates. |
| 1 Painter plugin | Plugin installed or Not installed, the plugins folder, Install Painter plugin / Install again and Open plugins folder. |
| 2 Watch folder | The Watch for Painter exports switch and its status line, Change folder…, Open folder, Import an export folder…, the Import into field and Create material instances right away. |
| 3 In Painter | The three steps in Painter: Reload plugins, Tick the plugin once and File > Send to Unreal / Ctrl+Shift+U. |
| Received | The last exports: Time, Mesh, Textures, Sets, Created, Updated, Mesh slots and Error (in red). Before the first export it says Nothing received yet. In a compact panel the Textures, Sets and Mesh slots columns are hidden. |
The status line at the bottom of the panel shows the state of the bridge, for example Painter bridge is off. Turn on Watch for Painter exports to receive Send to Unreal. or Watching. Received Chair at 14:05: 2 created, 0 updated, 2 mesh slots.
Watch folder controls
Section titled “Watch folder controls”| Control | What it does |
|---|---|
| Watch for Painter exports | Import Painter exports from the watch folder while the editor runs. Exports that arrived while the editor was closed are imported when watching starts. |
| Change folder… | Pick the folder Painter exports into (stored per user). |
| Open folder | Show the watch folder. |
| Import an export folder… | Bring in a folder of Painter textures now, without watching. |
| Import into | Content folder for Painter textures, /Game/Painter by default: textures go to <folder>/<mesh>/Textures, instances to <folder>/<mesh>/Materials. |
| Create material instances right away | On (default): every export is imported and the instances are created or updated at once. Off: the textures are imported and a notification asks first, for example Painter export Chair: 6 textures imported, 2 texture sets ready. with a Create material instances button. |
What Send to Unreal exports
Section titled “What Send to Unreal exports”The Painter plugin exports every texture set of the open project into <watch folder>/<mesh>/, where <mesh> is the name of the mesh file imported into Painter (or the project name). It uses the maps of Painter’s Unreal Engine (Packed) preset plus opacity and height, named $mesh_$textureSet_<Map>: _BaseColor, _OcclusionRoughnessMetallic, _Normal, _Emissive, _Opacity and _Height, as 8-bit PNG files with infinite padding. UDIM projects export one file per tile (Chair_Wood_BaseColor.1001.png …).
Last, it writes materialsmith.json with the mesh name, the mesh file and the list of files. Material Smith starts the import about a second after that file appears, and renames it to materialsmith.done.json when it is done.
You can also export by hand with Painter’s Unreal Engine (Packed) preset into a subfolder of the watch folder. Without materialsmith.json the import starts about 4 seconds after the last file changes, and the subfolder name is used as the mesh name.
What Unreal does with an export
Section titled “What Unreal does with an export”-
Imports the textures into
<Import into>/<mesh>/Textures, replacing the ones of an earlier export. UDIM tiles are imported together as one UDIM texture. -
Groups them into texture sets with the name table, for example
Chair_WoodandChair_Metal. -
Finds the mesh and its slots. See How the mesh and slots are found.
-
Creates or updates the material instances in
<Import into>/<mesh>/Materials(with the default Output Folder setting) and puts them into the slots, like Create on the Texture sets page. UDIM sets use the virtual texture master. -
Shows a notification, for example Painter export Chair: 2 created, 0 updated, 2 mesh slots., and adds a row to Received.
The options come from Project Settings > Plugins > ta Material Smith (default master, Default Master Type, Virtual Textures, Fix Texture Settings, Pack Channels, Save Assets …), not from the panel’s Options. Assign to meshes and Update existing are always on for Painter exports.
Export again from Painter and the same textures and instances are updated in place; parameters you tuned by hand in the instances stay.
How the mesh and slots are found
Section titled “How the mesh and slots are found”- Mesh: a static or skeletal mesh anywhere under
/Gamewhose name without its prefix matches the export’s mesh name:Chair.fbxfindsSM_Chair,SK_ChairorChair. If several meshes have that name, the one imported from the same file wins (the same full path, then the same file name). If that doesn’t decide it, no mesh is changed and the result lists the candidates: Several meshes are named Chair and none was imported from Chair.fbx, so no mesh was changed: … Assign the instances by hand, or rename or reimport the right mesh. - Slots: Painter names texture sets after the material slots of the mesh. Each texture set (without the mesh name in front) goes into the slot with the same name, compared without prefixes like
M_orMI_, separators and case: the setChair_Woodfills the slotWood(orM_Wood). A mesh with one slot and an export with one texture set always match. - No mesh: No mesh named Chair was found; the instances were made without a mesh. Import the mesh, then export again or use Import repair.
From Python
Section titled “From Python”import unreal
smith = unreal.get_editor_subsystem(unreal.TAMaterialSmithSubsystem)result = smith.import_painter_export("D:/PainterExports/Chair", smith.get_default_options())print(len(result.created_instances), "created,", len(result.updated_instances), "updated", list(result.warnings))install_painter_plugin(), get_painter_watch_folder() and open_painter_bridge() are there too. See Python.