openusd 0.3.0

Rust native USD library
Documentation

openusd

Crates.io Version docs.rs CI codecov dependency status

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
  • 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_error callback.

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
git clone --recurse-submodules https://github.com/mxpv/openusd.git
cd openusd

# Run examples
cargo run --example dump_usdc -- ~/caldera/layers/cameras.usd

Example

use openusd::{ar, sdf::FieldKey, Stage};

// Open a stage with default settings (DefaultResolver, strict errors).
let stage = Stage::open("scene.usda")?;

// Or configure via the builder:
let stage = Stage::builder()
    // Use a custom asset resolver (default: DefaultResolver).
    .resolver(ar::DefaultResolver::new())
    // Handle composition errors instead of failing (default: hard error).
    .on_error(|err| {
        eprintln!("warning: {err}");
        Ok(()) // skip missing dependency and continue
    })
    .open("scene.usda")?;

// Traverse all prims in the composed scene graph.
stage.traverse(|path| {
    println!("{path}");
})?;

// Read a typed field value (generic over TryFrom<Value>).
let active: Option<bool> = stage.field("/World/Cube", FieldKey::Active)?;

// Access children composed across layers, references, and payloads.
let children = stage.prim_children("/World/Cube")?;
let properties = stage.prim_properties("/World/Cube")?;

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.