openusd 0.7.0

Rust native USD library
Documentation
//! Build a minimal USD scene programmatically and write it as `.usdc`.
//!
//! Usage: `cargo run -p openusd --example write_usdc -- out.usdc`

use openusd::sdf::{self, ChildrenKey, FieldKey, SpecType, Specifier, Value};
use openusd::usdc::CrateWriter;

fn main() -> openusd::Result<()> {
    let out = std::env::args().nth(1).unwrap_or_else(|| "out.usdc".to_string());

    let mut data = sdf::Data::new();

    let root_spec = data.create_spec(sdf::Path::abs_root(), SpecType::PseudoRoot);
    root_spec.add(ChildrenKey::PrimChildren, Value::TokenVec(vec!["World".into()]));
    root_spec.add(FieldKey::DefaultPrim, Value::Token("World".into()));

    let world_spec = data.create_spec(sdf::Path::new("/World").unwrap(), SpecType::Prim);
    world_spec.add(FieldKey::Specifier, Value::Specifier(Specifier::Def));
    world_spec.add(FieldKey::TypeName, Value::Token("Xform".into()));
    world_spec.add(ChildrenKey::PrimChildren, Value::TokenVec(vec!["Cube".into()]));

    let cube_spec = data.create_spec(sdf::Path::new("/World/Cube").unwrap(), SpecType::Prim);
    cube_spec.add(FieldKey::Specifier, Value::Specifier(Specifier::Def));
    cube_spec.add(FieldKey::TypeName, Value::Token("Cube".into()));
    cube_spec.add(ChildrenKey::PropertyChildren, Value::TokenVec(vec!["size".into()]));

    let attr_spec = data.create_spec(sdf::Path::new("/World/Cube.size").unwrap(), SpecType::Attribute);
    attr_spec.add(FieldKey::TypeName, Value::Token("double".into()));
    attr_spec.add(FieldKey::Default, Value::Double(1.0));

    CrateWriter::write_to_file(&data, &out)?;
    println!("Wrote {} spec(s) to {out}", data.len());
    Ok(())
}