1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//! UsdSkel schema reader and skinning toolkit.
//!
//! Decodes Pixar's `UsdSkel` schema family from a composed
//! [`crate::usd::Stage`], plus the time-independent half of Pixar's
//! UsdSkel object model: topology, animation-to-skeleton mappers,
//! per-mesh skinning resolvers, and pure-math helpers for linear
//! blend skinning and blend-shape application.
//!
//! Time-sampled SkelAnimation evaluation is handled by
//! [`SkelAnimQuery`], which delegates to [`crate::usd::Stage::value_at`]
//! and inherits the stage's interpolation mode (AOUSD §12.5 — linear
//! by default, with per-joint slerp for `rotations`). The static
//! resolvers below take pre-evaluated joint poses, so callers
//! typically wire `SkelAnimQuery` into them at each frame.
//!
//! # Schemas
//!
//! Concrete prim types:
//! - [`tokens::T_SKEL_ROOT`] — encapsulating scope for skeletal
//! processing; carries an authored `extent`.
//! - [`tokens::T_SKELETON`] — joint topology + bind / rest poses.
//! - [`tokens::T_SKEL_ANIMATION`] — time-sampled joint transforms and
//! blend-shape weights.
//! - [`tokens::T_BLEND_SHAPE`] — per-vertex position / normal offsets
//! with optional inbetween shapes.
//!
//! API schemas:
//! - [`tokens::API_SKEL_BINDING`] — applied to skinnable prims
//! (typically Meshes) to wire joint influences, blend shapes,
//! `skel:skeleton`, and `skel:animationSource`.
//!
//! # Conventions
//!
//! Reader functions return values in the scene's authored units:
//! - Matrices are row-major flattened 4×4 (`[f64; 16]`).
//! - Quaternions stay in USD's textual `(w, x, y, z)` order.
//! - Half-precision storage (`half3[] scales`, `quath[] rotations`) is
//! widened to `f32` so callers don't need to depend on the `half`
//! crate transitively.
//! - `bindTransforms` are world-space; `restTransforms` are joint-local
//! space (parent-relative).
//!
//! # Inheritance
//!
//! `skel:skeleton` and `skel:animationSource` are inheritable down
//! namespace. [`read_skel_binding`] reports only the values authored
//! directly on the queried prim; use [`read_inherited_skeleton`] /
//! [`read_inherited_animation_source`] to resolve the nearest-ancestor
//! binding. [`discover_bindings`] does that walk for every skinnable
//! prim under a SkelRoot in one pass.
//!
//! # Example
//!
//! ```ignore
//! use openusd::{sdf, skel, usd};
//!
//! let stage = usd::Stage::open("character.usda")?;
//! for root in skel::find_skel_roots(&stage)? {
//! let root = sdf::path(&root)?;
//! for b in skel::discover_bindings(&stage, &root)? {
//! println!("{} bound to {:?}", b.prim, b.skeleton);
//! }
//! }
//! # anyhow::Ok(())
//! ```
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use SkeletonResolver;
pub use SkinningResolver;
pub use ;
pub use ;