Rust bindings for USD.
Usd Version | API Documentation | CI Status |
---|---|---|
23.02 | Docs |
- You can create and open/save/export a stage.
- You can define a prim and get/set attributes on it. All 30 basic types are supported + arrays of those types.
- You can create references under prims or as layers.
- You can traverse the prims in a stage.
- Relationships
- Schemas
- Edit Targets
- Variant Sets
- Get/Set default root prim
- usd-cpp is a crate to build the cpp shared library and its dependencies (tbb, boost ..).
- usd-rs is the actual bindings crate.
- usd-examples will be examples.
Before you do anything in terms of development it's worth noting that there is a docker image.
git clone git@github.com:luke-titley/usd-rs.git && cd usd-rs git submodule update --init --recursive cargo build
Same as above only instead of cargo build do:
env USD_ROOT= cargo build
One you've got the project building you can run the tests with
cargo test or env USD_ROOT= LD_LIBRARY_PATH=/lib cargo test
- g++/clang with c++14 support
- cmake
- python
- and of course cargo
At the moment we use the handy 'build_usd.py' script that is bundled with USD to download all the thirdparty libraries USD depends on. That's why we need python. The USD library uses cmake, and obviously we are going to need a c++ compiler.
Perhaps in the future, it might be possible to port a subset of build_usd.py to our build.rs and so remove the python dependency.
I'm using cpp crate for these bindings in the mid term. This makes it easy to hand write the wrappers and work the api. Work on automatically generated bindings is going on in the background. Ultimately this crate will move over to using usd-sys, when that work is complete.
The attribute types supported by USD are finite and rarely change. However there are a lot of them, so we employ code generation to implement them. This is handled by the usd-basic-types crate, which is an executable for generating all of the variants. We have to run this manually. All the types are listed in the BASIC_TYPES constant a the top of usd-basic-types/src/main.rs
Add a new type to the constant BASIC_TYPES then run the below command.
cargo run --bin usd-basic-types > usd-rs/src/pxr/vt/basic_types.rs
We rely on the cpp! macro from rust-cpp, we cannot use this macro inside of another macro. While developing usd-rs its important to be able to see the types inside of the module, it make it much easier.
There is a pre-built docker image for those who have docker installed. This image is intended for the ci to test usd-rs. It contains the environment for building usd-rs in centos:7 which is the oldest supported linux distribution across the vfx industry.
The image is called luketitley/vfxrs_env_usd.