ComfyUI Node

Save USD

Get your stage off the canvas and onto disk

By cjhosken·Created 3 months ago·Updated 2 months ago· 9
Save USD
  • USD
  • USD
output_pathpath/to/file.usda
make_paths_relativetrue
package_assetsfalse
flatten_stagefalse

Every other node in the ComfyUI-OpenUSD pack edits a stage in memory. Save USD is the one that gets your work off the canvas and onto disk. You feed it a USD stage and a filename, and it writes the file - which is also why it's the pack's terminal node in the sense ComfyUI means: it's marked an output node, so it always runs and the graph doesn't consider the job done until it has.

Why you'd reach for it

The whole pack is pure Python - there's no DCC, no Blender, no viewport rendering pipeline underneath. So the deliverable of any USD workflow in ComfyUI is a file. Whether you've been assembling a scene with Create USD Stage, editing prims with TransformUSDPrim and SetUSDAttribute, or loading something and cleaning it up, Save USD is how the finished stage leaves. It's the USD answer to SaveImage.

How it works

The node takes your stage, exports its root layer to output_path, and then re-opens the saved file so the USD output is a live stage you can keep piping. The extension you choose in output_path decides the format: .usda for human-readable ASCII, .usdc for compact binary, .usd for the generic format, .usdz for the zipped, packaged form used by Apple's AR Quick Look. Directories are created for you; existing files are overwritten without ceremony.

The three toggles are where the real behavior lives:

  • flatten_stage - bakes the whole composition (references, sublayers, everything) into a single self-contained layer. Leave it off and your saved file keeps its composition arcs pointing at other files; turn it on for a one-file deliverable.
  • make_paths_relative (default on) - rewrites external references so they're relative to the saved file instead of absolute. This is what keeps the output portable. Turn it off if you specifically want absolute paths.
  • package_assets - copies any referenced external files (textures, referenced USD) into an assets/ folder next to your output and rewrites the references to point at them. It's the "collect files" checkbox, the closest thing here to USDZ packaging without zipping.

Inputs and outputs

The inputs that matter are USD (the stage), output_path (a path widget - this is a raw filesystem path, not ComfyUI's auto-numbered output folder), and the three booleans above. The output is a single USD - the saved stage, re-opened - so you can chain Save into more edits.

Install

Comes with the cjhosken/ComfyUI-OpenUSD pack. Through ComfyUI Manager, search "ComfyUI-OpenUSD"; or:

cd ComfyUI/custom_nodes
git clone https://github.com/cjhosken/ComfyUI-OpenUSD

Then restart. The dependency to budget for is usd-core==26.5, Pixar's USD Python bindings - a heavy one-time install. Nothing else to download; there are no model files in this pack.

Troubleshooting

  • Saved .usda is full of @./../absolute/path@ references - that's make_paths_relative doing its job. If you wanted a single file, flip flatten_stage on.
  • The file shows up "empty" - check that you actually connected a USD stage and that it isn't a stage with only composition arcs pointing at files you didn't copy. package_assets or flatten_stage fixes the portable case.
  • It overwrote a file you cared about - it will, without asking. Path discipline is on you.

One honest caveat, same as every node in this pack: it's version 0.1.1, brand new, no community track record yet. The mechanisms above are straight from the source, but don't be shy about backing up outputs while the pack matures.

Category3d/usd/io

Inputs (5)

NameTypeDefaultDescription
USDUSD
output_pathSTRINGpath/to/file.usda
make_paths_relativeBOOLEANtrue
package_assetsBOOLEANfalse
flatten_stageBOOLEANfalse

Outputs (1)

NameTypeDescription
USDUSD