2 unstable releases
|0.2.0||Feb 21, 2023|
|0.1.0||Apr 13, 2021|
#85 in Graphics APIs
28 downloads per month
A selective Rust wrapper for Pixar’s OpenSubdiv library.
For now crate versions reflect code maturity on the Rust side. They are not in any way related to the OpenSubdiv version that is wrapped.
There are several features to gate the resp. build flags when OpenSubdiv is built.
Almost all of them are not yet implemented.
clew– TBD. Adds support for CLEW.
cuda– Adds support for the Nvidia CUDA backend. Only valid on Linux/Windows. CUDA support is almost done (Rust API wrappers are there). It just require some more work in
build.rs. Ideally, if the
cudafeature flag is present,
build.rswould detect a CUDA installation on Linux/Windows and configure the OpenSubdiv build resp. panic if no installation can be found.
metal– Adds support for the Apple Metal backend. Only valid on macOS.
opencl– TBD. Adds support for the OpenCL backend.
ptex– TBD. Adds support for PTex.
topology_validation– Do (expensive) validation of topology. This checks index bounds on the Rust side and activates a bunch of topology checks on the FFI side. This is on by default! Set
default-features = falsein
Cargo.tomlto switch this off – suggested for
OpenMP Support on macOS
OpenMP detection is broken on the CMake side on macOS. There are a bunch of issues open in the CMake tracker. I added some comments here.
A workaround is likely possible. PRs welcome. If you need to make a fix on the OpenSubdiv side, Pixar will probably also welcome a PR.
The original library does make use of C++ templates in quite a few places. The wrapper has specializations that cover the most common use cases.
C++ factory classes have been collapsed into the
new() method of the resp.
struct that mirrors the class the C++ factory was building.
API Changes From C++
Many methods have slightly different names on the Rust side.
Renaming was done considering these constraints:
- Be verbose consistently (the original API is quite verbose but does make use of abbreviations in some suprising places).
- Use canonical Rust naming – (
- Use canonical Rust constructs. Most option/configuraion structs use the init struct pattern. In places where it’s not possible to easily map to a Rust struct, the builder pattern (or anti-pattern, depending whom you ask) is used.
- Be brief when possible. Example:
StencilTable::numStencils()in C++ becomes
- Use unsigned integer types, specifically
u32, instead of signed ones (
i32) for anything that can only contain positive values (indices, sizes/lengths/counts, valences, arities, etc.). Types should express intent. See also here.