openusd 0.4.0

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

use openusd::sdf::{self, ChildrenKey, FieldKey, SpecType, Specifier, Value};
use openusd::usda::TextWriter;

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

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

    // Layer metadata on the pseudo-root.
    let root = sdf::Path::abs_root();
    let root_spec = data.create_spec(root.clone(), SpecType::PseudoRoot);
    root_spec.add(ChildrenKey::PrimChildren, Value::TokenVec(vec!["World".into()]));
    root_spec.add(FieldKey::DefaultPrim, Value::Token("World".into()));
    root_spec.add(FieldKey::Documentation, Value::String("Generated by openusd".into()));

    // /World prim with an Xform type and a child mesh.
    let world = sdf::path("/World")?;
    let world_spec = data.create_spec(world.clone(), 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!["Sphere".into()]));

    // /World/Sphere with a radius attribute.
    let sphere = sdf::path("/World/Sphere")?;
    let sphere_spec = data.create_spec(sphere.clone(), SpecType::Prim);
    sphere_spec.add(FieldKey::Specifier, Value::Specifier(Specifier::Def));
    sphere_spec.add(FieldKey::TypeName, Value::Token("Sphere".into()));
    sphere_spec.add(ChildrenKey::PropertyChildren, Value::TokenVec(vec!["radius".into()]));

    let radius = sphere.append_property("radius")?;
    let attr_spec = data.create_spec(radius, SpecType::Attribute);
    attr_spec.add(FieldKey::TypeName, Value::Token("double".into()));
    attr_spec.add(FieldKey::Default, Value::Double(2.5));

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