openusd
openusd is a Rust implementation of Pixar's Universal Scene Description (USD) format with no C++ dependencies.
For a detailed comparison with the C++ reference implementation and current progress, see the Roadmap.
Features
- File formats — reads
.usda(text),.usdc(binary), and.usdz(archive) with format auto-detection. - Fully featured composition engine
- LIVRPS strength ordering with sublayers, inherits, variants, references, payloads, and specializes.
- List-edit composition across layers.
- Per-prim node graph with namespace mapping across composition arcs.
- Non-destructive namespace remapping via relocates.
- Variable expressions with string interpolation and built-in functions.
- Passes AOUSD compliance tests.
- Composed
Stage- Recursive layer collection with cycle detection and pluggable asset resolution.
- Lazy per-prim composition with caching, depth-first traversal, and typed field access.
- Session layer and variant fallback selections via
StageBuilder. - Recoverable error handling via
StageBuilder::on_errorcallback.
If you encounter a file that can't be read, please open an issue and attach the USD file for investigation.
Compliance
The AOUSD Core Specification 1.0 has been officially ratified. As part of the specification, sample implementations for compliance testing are provided as Python scripts with JSON baselines. Where JSON baselines are available, the crate parses them and verifies that its output matches.
| Area | Status | Notes |
|---|---|---|
| Text format parsing | :white_check_mark: Passes | 10 tests against JSON baselines |
| Binary format parsing | :construction: Planned | Baselines are generated by a Python script. Needs a JSON export step or a bridge layer to produce comparable output |
| Composition | :white_check_mark: Passes | All 276 tests covering text and binary formats, including 20 relocation tests |
| Value resolution | :construction: Planned | Requires time-sample support in the core |
| Combine chains | :white_check_mark: Passes | ListOp::combined_with and ListOp::reduced against JSON baselines |
Getting started
[!WARNING] This crate is under active development. No API stability is guaranteed until version 1.0.
To begin, simply clone the repository including its submodules.
Make sure you have Rust installed on your system, rustup will do the rest.
# Clone the project
# Run examples
Example
use ;
// Open a stage with default settings (DefaultResolver, strict errors).
let stage = open?;
// Or configure via the builder:
let stage = builder
// Use a custom asset resolver (default: DefaultResolver).
.resolver
// Handle composition errors instead of failing (default: hard error).
.on_error
.open?;
// Traverse all prims in the composed scene graph.
stage.traverse?;
// Read a typed field value (generic over TryFrom<Value>).
let active: = stage.field?;
// Access children composed across layers, references, and payloads.
let children = stage.prim_children?;
let properties = stage.prim_properties?;
Minimum supported Rust version (MSRV)
The project typically targets the latest stable Rust version. Please refer to rust-toolchain.toml for exact version currently used by our CIs.