DCC addons

Updated July 2026

Dousen lives inside the tools you already use. Each supported application gets a Dousen panel, dock, or shelf that lets you publish work, run pre-export validation, set up assets from your project's naming conventions, and see Perforce file status — all without leaving the app. Six DCCs are covered here: Blender, Maya, 3ds Max, Substance Painter, Substance Designer, and Houdini. Unreal Engine is a seventh, first-class bridge participant with its own page — see Unreal Engine.

Everything on this page is artist-facing: what you click, what it does, where the files land. The rules a validator run actually checks — naming, mesh hygiene, Nanite budgets, rig limits, and so on — are documented once, DCC-agnostically, on the Asset validation page. This page covers the panel mechanics: Run Validation, Fix, Export & Notify, and how each addon is built.

What each addon can do

Four of the six — Maya, 3ds Max, Substance Painter, and Substance Designer — are literally built on the same shared PySide6 base class (DousenPanelBase), which is why their Validate and Perforce tabs look and behave identically; only the extra tabs each DCC bolts on differ. Blender uses native bpy panels instead of Qt, and Houdini has no dock at all — it's shelf tools only.

CapabilityBlenderMaya3ds MaxPainterDesignerHoudini
UI shapeN-panel tabShelf + dockMenu/toolbar + dockDockDockShelf only
Run Validation + Fix✓ (no Fix buttons in the console output)
Export & Notify (error-gated)— (export tools don't gate on validation)
Auto-publish on save✓ opt-in✓ opt-in✓ opt-inwired, no UI toggle
Set Up / New Asset— (infers type from file path)
Materials / Nanite picker✓ (single-slot only)
Perforce ops (checkout/sync/revert)
Send to Painter
Send to Unrealvia Export & Notify*via Export & Notify*via Export & Notify*✓ button✓ buttons✓ shelf tool
Receives bridge events (mesh.export)✓ (stashed only)
Per-task context (live)

* Blender, Maya, and 3ds Max have no dedicated "Send to Unreal" button — send_to_unreal() exists as a Python function for studio scripts to call, but the panel's actual path to Unreal is Export & Notify: it publishes the same mesh.export/animation.export event, which FAssetSyncManager polls and imports automatically. Substance Painter, Substance Designer, and Houdini expose an explicit button/shelf tool because their export flow doesn't otherwise map to a single mesh file the way a DCC-native scene save does.

Auto-publish-on-save is wired but not reachable from the UI yet in Houdini: it registers a real save-triggered callback (fires on hou.hipFile.AfterSave and checks an internal _auto_publish flag), but the addon has no shelf tool that ever sets it. Until one ships, treat Houdini auto-publish as off in practice — a studio startup script could flip the flag directly in the meantime, but there's no supported way to do it from inside the app. Blender, 3ds Max, and Substance Painter all expose an opt-in checkbox (3ds Max's is on the panel's Tools tab and persists with the scene via appData key 1001 on the root node).

Installing and enabling the addons

There is normally no manual install. The old “install the addon by hand” flow no longer applies — DousenDesktop launches each application with the Dousen addon injected automatically (a bootstrap script per DCC sets its Python path and registers the addon before the UI comes up).

To get the in-app panel, you only need to:

  1. Open Settings → DCC Apps and confirm the executable path for each application. Installed DCCs are auto-discovered, so this is usually already filled in.
  2. Launch the application from DousenDesktop's launcher. The Dousen panel, shelf, or menu appears inside it.

On Windows, the installer bundles the addons, so nothing extra is downloaded.

The addon only appears when the DCC is launched from DousenDesktop — a desktop shortcut starts the plain application. If the panel is missing even when launched correctly, the most common cause is a sys.path collision: an older addon build inserted the Dousen Python path at the front of sys.path, which could shadow the DCC's own standard-library modules and fail the import silently (no error dialog, no console message — the app just starts with nothing extra). This was fixed for Blender, Maya, and 3ds Max by appending instead of inserting. If a DCC still loads with no Dousen panel and no error printed, check its console/script-editor output for import errors and see Troubleshooting.

How the addons talk to Dousen

DousenDesktop runs a small local relay (the bridge) on your own machine at 127.0.0.1 port 8766. Addons publish events to the bridge and poll it for incoming events about twice a second. This is the channel that lets one application hand work to another — for example, sending a mesh from Maya to Substance Painter.

The bridge is plain HTTP on port 8766 only. There is no separate service port to open, and every request is authenticated with a per-session token, so other programs on your machine can't read or inject events.

Bridge event types

Almost everything the addons do maps to one of six event types:

EventMeaning
mesh.exportA published mesh / FBX (or Alembic, for Houdini).
texture.exportPublished textures or a .sbsar package.
animation.exportA published animation clip.
scene.exportAn auto-publish triggered when you save the scene.
dcc.openA request to open a file in a specific DCC.
task.contextThe active Jira task and changelist, pushed to running DCCs.

Each running application announces itself to the bridge when it starts (register) and withdraws when it closes (deregister). That presence handshake is separate from the events above — it's how features like Send to Unreal know which DCCs are currently open, and how a DCC's shelf only shows Send to Painter when Substance Painter is actually registered.

Studio tools can join the bridge exactly like the built-in addons — the full protocol, payload shapes, and a Python example are on the Bridge API page.

Per-task context

When you select a task in DousenDesktop, the active Jira key and changelist are pushed to every running DCC as a task.context event. From then on, everything you publish is tagged with the right task and linked to the right Perforce changelist — you don't have to label exports by hand.

When DousenDesktop launches a DCC while a task is selected, the same context is also passed to the application as environment variables, so the addon picks it up immediately on startup.

Auto-tagging on export (preview)

After a mesh export lands on the bridge, DousenDesktop can run a local, CPU-only computer-vision pass over it — geometry heuristics (poly tier, whether it has UVs, whether it's skinned) plus an optional bundled classifier that guesses an object class and style hint. This runs in DousenDesktop itself, not inside the DCC, so it applies the same way regardless of which addon published the mesh. A review dialog lets you accept or edit the suggested tags before they're stamped on the source asset record. This feature is still rolling out (DOU-219 epic) — treat any auto-tag as a suggestion, not a fact, until it's had more studio mileage.

Blender

The Blender addon adds a Dousen tab to the View3D sidebar (N-panel), built from native bpy panels rather than Qt. The top-level panel holds the always-visible actions; three collapsible sub-panels hold the rest.

WhereButtonWhat it does
Dousen panelAuto-publish on SaveToggle, stored as a window-manager property — resets to off every time Blender restarts. While on, every save exports the whole scene as FBX and publishes a classified mesh.export or animation.export.
Dousen panelExport Scene & NotifyPublishes a bare scene.export event carrying the current .blend path — no FBX export, no validation gate. Distinct from Export & Notify below.
Dousen panelExport with TagsOpens a dialog to pick asset type/taxonomy without moving the file, then exports FBX and publishes with those tags applied. Useful for tagging an asset that's already sitting in the right place.
Dousen panelSend to Substance PainterOnly shown once Painter is registered on the bridge. Exports the selection as FBX and publishes mesh.export targeted at substance_painter.
Validation sub-panelRun ValidationRuns the shared validator engine, scoped by persisted convention tags (or the saved path if untagged). Lists results by category with per-rule Fix buttons where a validator supplies one.
Validation sub-panelExport & NotifyEnabled once validation has run with no errors. Blocks with "Fix N validation error(s)" if any remain, confirms first if only warnings remain, then whole-scene FBX-exports and publishes the classified UE import contract.
New Asset sub-panelSet Up AssetWalks your project's naming conventions (asset type, cascading taxonomy, orthogonal dimensions like variant/LOD, and an optional rig to link for animation assets), then save_as_mainfiles the .blend to the resolved source path and p4 adds it to the active task's changelist.
Materials sub-panelEdit Material Slot / Auto-Fill Textures / Refresh Material CatalogAssigns a project material-catalog entry per mesh material slot, guesses texture bindings from filenames, and persists the assignment — see Materials & Nanite gating.
File Status (P4) sub-panelRefresh Lock Status / Check Out (p4 edit) / Sync & Reload / Revert CheckoutLive Perforce lock state for the current .blend — see Perforce operations.

Convention tags persist as a JSON scene ID property (dousen_convention_tags) and are stamped as custom properties on every mesh, armature, and empty object before FBX export, which Unreal's importer reads as FBX user-defined properties.

Whole-scene FBX export (not selection-only) is deliberate: a skeletal mesh needs its armature along for the ride, and the export classifier looks at whether the scene actually has an armature/actions before deciding mesh.export vs animation.export.

Maya

Maya gets two Dousen surfaces that both auto-load from userSetup.py: a Dousen shelf of native cmds buttons, and a dockable PySide6 panel that opens automatically on startup (and can be reopened from the shelf). Both drive the same underlying export/validation/P4 functions, so they never disagree — the shelf's Validate and Asset buttons are just lighter-weight windows for the same flows the dock's tabs offer.

SurfaceItemWhat it does
ShelfDousenOpens/raises the dockable panel.
ShelfDousen ValidateOpens a standalone, non-dockable cmds window: Run Validation, per-rule Fix, a P4 status frame, and Export & Notify — separate from the dock's Validate tab, same underlying validation call.
ShelfDousen AssetOpens a standalone conventions-driven New Asset window (cascading option-menus), same resolve-and-save logic as the dock's New Asset tab.
ShelfSend to PainterOnly added to the shelf at startup if Painter is already registered on the bridge. Exports the selection as FBX and publishes mesh.export targeted at Painter.
Dock — Validate tabRun Validation / Export & NotifySame gate as every DousenPanelBase DCC: errors block, warnings confirm.
Dock — Perforce tabCheck Out / Sync && Reload / Revert / RefreshSee Perforce operations.
Dock — New Asset tabLoad Conventions / Set Up Assetp4 adds the new .ma to the active task's changelist once saved.
Dock — Materials tab(catalog picker)Shared MaterialPickerWidget — see Materials & Nanite gating.
Dock — Tools tabSend to PainterAlways visible here (unlike the shelf button); enabled/disabled live based on whether Painter is currently registered.
The Maya Dousen dock's Publish tab, showing the task header, PUBLISH/PERFORCE/NEW ASSET/MATERIALS/TOOLS tabs, a collected instance list with per-instance validation state, validator results with Repair and Select Invalid buttons, and a log pane.
The dockable panel's Publish tab after a validation run.

FBX export goes through MEL's FBXExport* commands with project presets from export_presets.maya applied first (file version, smoothing groups, tangents, triangulation), and FBXExportShowUI forced off so a profile with FBX autoload disabled can't hang the export on Maya's native "load plugin?" prompt. Convention tags persist as one fileInfo entry per tag — Maya's fileInfo mangles quoted strings, so a JSON blob isn't used — and are separately stamped as string attributes on mesh transforms before export. The materials picker persists as a base64-encoded JSON blob in fileInfo (base64 because the assignment is nested, not the flat shape tags get away with).

Maya has no auto-publish-on-save — export is always a deliberate action, unlike Blender or Substance Painter.

3ds Max

Like Maya, 3ds Max gets both a native menu/toolbar with lightweight dialogs and a dockable PySide6 panel (via qtmax) built on the same DousenPanelBase family — four macroscripts under the "Dousen" category, auto-registered from a script in Max's scripts/startup/ folder.

MacroscriptOpensWhat it does
DousenPanelPySide6/qtmax dockValidate, Perforce, New Asset, and Materials tabs — identical mechanics to Maya's dock.
DousenValidate"Validate && Export" WinForms dialogStandalone dotNet dialog (pymxs's dotNet bridge): Run Validation, a results list box, Export && Notify, and Check Out Source / Sync & Reload / Revert Checkout / Refresh Lock Status buttons.
DousenSetupAsset"New Asset" WinForms dialogConventions-driven asset setup, saving a correctly-named .max and adding it to Perforce.
DousenSendToPainterExports the selection as FBX and publishes it targeted at Substance Painter.
The 3ds Max Dousen dock's Publish tab, laid out the same way as Maya's dock with the same tabs and validator results.
Same PySide6/qtmax dock mechanics as Maya's Publish tab.

Convention tags are stored as a custom file property (rt.fileProperties), and separately appended to every exported node's user-property buffer as dousen_<key>=<value> lines — 3ds Max collapses all of a node's user-defined properties into a single FBX tag (UDP3DSMAX), so the addon writes one block of lines rather than discrete FBX properties the way Blender/Maya do. The dock's Materials tab persists its catalog assignment as JSON in its own file property, same shared picker as the other DCCs.

The Dousen menu only appears under the Help menu's neighbor on 3ds Max 2025 and later (registered via cuiRegisterMenus); 2024 and earlier get a floating toolbar instead (legacy toolbar API) — both expose the same four macroscripts. Auto-publish-on-save is opt-in via the Publish mesh.export on save checkbox on the panel's Tools tab (a filePostSave callback checks appData key 1001 on the root node, which the checkbox sets/clears; the setting persists with the scene).

Substance Painter

The Substance Painter addon is a DousenPanelBase PySide6 dock, auto-loaded from a thin shim in SUBSTANCE_PAINTER_PLUGINS_PATH/startup that bootstraps sys.path and delegates to the real addon package. It shares Validate and Perforce tabs with Maya/3ds Max/Designer, plus its own Export and Tools tabs.

WhereButtonWhat it does
Validate tabRun Validation / Validated ExportSame shared gate; the export button is labeled "Validated Export" here rather than "Export & Notify."
Export tabExport TexturesRuns Painter's own texture export. On ExportTexturesEnded, one texture.export event is published per output file; the console warns if an exported format isn't in the project's texture.allowed_formats setting.
Export tabSend to UnrealTwo paths depending on state: if no texture set has a catalog material picked, exports every texture set plus the source mesh as the legacy bundle; otherwise (send_to_unreal_pipeline) publishes a single texture.export carrying the full UE import contract with the picked material_assignment.
Export tabLoad Materials / Texture Set Materials / Material DetailsThe materials picker, embedded here rather than a separate tab — see Materials & Nanite gating.
Tools tabPublish scene.export on saveCheckbox. When checked, saving the project publishes scene.export carrying the source mesh's path (not the .spp project file, since Painter has no mesh of its own to export).
The Substance Painter Dousen dock's Publish tab, listing texture-set instances with validator results including a Resolution power of two failure and a Texture set naming warning.
Each texture set is validated and published as its own instance.

A mesh.export event targeted at Painter (target_app == "substance_painter") either rebakes the currently open project's mesh or creates a new project from it, so a Maya/3ds Max/Houdini artist can hand geometry straight to texturing over the bridge. Convention tags and the materials assignment both live in Painter's own project metadata store (substance_painter.project.Metadata("Dousen")) — tags for validation scoping only, since Painter never produces an FBX to stamp them into.

Substance Designer

The Substance Designer addon is also a DousenPanelBase PySide6 dock, auto-loaded via SD_PLUGINS_PATH's initializeSDPlugin()/uninitializeSDPlugin() hooks. It has Validate, Perforce, Materials, and Export tabs.

WhereButtonWhat it does
Export tabExport Baked TexturesWalks every comp graph's output nodes specifically (not graph-level output properties), bakes each via resource.compute(), and exports — TGA by default, or whatever export_presets.substance_designer.format specifies.
Export tabExport .sbsarA separate whole-package export via SDSBSARExporter, independent of the baked-texture export.
Export tabSend to Unreal (TGA + FBX) / Send .sbsar to UnrealSame two-path shape as Painter — a bundled multi-event send, and a single-event pipeline variant carrying the full UE import contract.
Materials tab(catalog picker)Shared MaterialPickerWidget — see Materials & Nanite gating.
The Substance Designer Dousen dock's Publish tab, listing comp-graph instances with the same validator results layout as Painter's dock.
Each comp graph is validated and published as its own instance.

A mesh.export event targeted at Designer is stashed (the received path is stored for the artist to reference from the current baking graph) rather than automatically wired into any node. Designer has no native scene metadata store, so both convention tags and the materials assignment are persisted as JSON sidecar files next to the .sbs package — <package>.dousen-tags.json and <package>.dousen-material.json — rather than embedded in the package itself.

Unlike Painter, Designer has no auto-publish-on-save — the flag exists as a module-level variable but nothing in the addon ever sets or checks it again. Publishing is always a manual Export action.

Houdini

The Houdini addon is shelf-tool based, with no dock at all — auto-loaded from a 456.py script on HOUDINI_PATH, which Houdini runs on every .hip load; the addon's own initialize() is idempotent (an internal flag skips re-init on repeat loads). All eleven tools live on one Dousen shelf tab.

Shelf toolWhat it does
Dousen: Export HDASaves the selected node's HDA definition and publishes it as mesh.export.
Dousen: Export VATRenders a Vertex Animation Texture ROP network and publishes the resulting position/normal/rotation maps and mesh as a bundle.
Dousen: Export AlembicBuilds a temporary /out ROP with export_presets.houdini.* settings, exports the selected node as .abc, and publishes mesh.export.
Dousen: ValidateRuns the shared validator engine against the current scene and prints results to the console — there's no results tree here, unlike the panel DCCs.
Dousen: Material SetupOpens a PySide2 dialog (Houdini's Qt binding) for the catalog picker, persisted on the /obj node's user data. Single-slot only (mesh_slot="") — unlike the multi-slot pickers in the other five DCCs, Houdini assigns one material for the whole asset.
Dousen: Send to PainterOnly added to the shelf if Painter is already registered on the bridge at load time.
Dousen: Send to UnrealLiterally the same function as Export VAT — there's no separate "send" step for Houdini beyond exporting the VAT bundle.
Dousen: File Status (P4) / Check Out / Sync & Reload / Revert CheckoutSame shared Perforce ops as the other DCCs, with hou.ui.displayMessage confirmation dialogs — see Perforce operations.

Houdini has no reliable FBX user-property embedding path, so convention tags are stored on the /obj node's user data (dousen_convention_tags) purely for validation scoping. There's no Set Up Asset UI for Houdini yet, so an untagged scene falls back to inferring its asset type from the saved file path.

An auto-publish-on-save hook exists (fires on hou.hipFile.AfterSave), but there's no shelf tool or dialog to turn it on — treat Houdini as manual-publish-only unless a studio startup script sets the internal flag directly.

Materials & Nanite gating

All six addons expose the same catalog-driven materials picker, backed by one shared, UI-toolkit-agnostic module (dousen.addons._material_picker) that turns the project's material catalog into combo-box choices, declared texture slots/params, and a guessed texture-slot auto-fill. Maya, 3ds Max, and Substance Designer share a literal Qt widget (MaterialPickerWidget) for the UI; Blender, Substance Painter, and Houdini build their own widget around the same primitives. Whichever material a mesh slot / texture set resolves to, its allow Nanite flag is what the Nanite/NonNanite validator category split reads from — see the Nanite / NonNanite gate and how Unreal applies the same flag on import.

The Maya Dousen dock's Materials tab, showing the shared material-catalog picker used to assign a catalog material to a mesh material slot.
Maya, 3ds Max, and Substance Designer share this exact Qt widget.
DCCMulti-slot?Persisted where
BlenderYesJSON scene ID property (dousen_material_assignment).
MayaYesBase64-encoded JSON in a fileInfo key (nested structure, so plain fileInfo quote-mangling is avoided).
3ds MaxYesJSON in a custom file property.
Substance PainterYes (one per texture set)Painter's own project metadata store, namespace Dousen.
Substance DesignerYesJSON sidecar file, <package>.dousen-material.json.
HoudiniNo — single assignment for the whole asset/obj node user data.

Perforce operations inside each DCC

Every addon runs the same shared _p4_ops module underneath — async lock polling, a pre-export lock check, and checkout/sync/revert/add wrappers around p4 (P4Python with a CLI fallback). Button wording differs slightly between the native dialogs (Maya's shelf window, 3ds Max's WinForms dialog) and the shared DousenPanelBase Perforce tab, but they call the exact same functions:

OperationDousenPanelBase tab labelNative-dialog label (Maya/3ds Max)
Open for editCheck OutCheck Out Source (p4 edit)
Sync + reload the sceneSync && ReloadSync & Reload (not at latest)
Discard local checkoutRevertRevert Checkout (p4 revert)
Re-poll lock statusRefreshRefresh Lock Status

A pre-export lock check also runs automatically as part of every validated export — if a file the export needs to write is locked by someone else, the export is refused before anything happens. Full command reference, stream detection, and changelist association live on the Perforce page.

Validation before export

Blender, Maya, 3ds Max, Substance Painter, and Substance Designer all run the exact same gated flow — one shared engine underneath, not five reimplementations:

Once the checks pass, the asset is published to the bridge and tagged with your active task.

Houdini is the exception: Dousen: Validate runs the same validator engine and prints results to the console, but it isn't wired into Export HDA, Export VAT, or Export Alembic — those three export unconditionally. Run Validate yourself before exporting if you want the same safety net the other five DCCs enforce automatically.

For the full rule reference, how admins configure it, and a worked troubleshooting example, see the Asset validation page.