use anyhow::Result;
use crate::sdf::Path;
use crate::usd::{PrimPredicate, Stage};
use super::schema::SkelBindingAPI;
#[derive(Clone)]
pub struct SkelBinding {
pub prim: String,
pub skeleton: Option<Path>,
pub animation_source: Option<Path>,
pub binding: SkelBindingAPI,
}
pub fn discover_bindings(stage: &Stage, skel_root: &Path) -> Result<Vec<SkelBinding>> {
let mut out = Vec::new();
let mut first_err: Result<()> = Ok(());
stage.traverse(PrimPredicate::DEFAULT_PROXIES, |path| {
if first_err.is_err() || !path.has_prefix(skel_root) {
return;
}
let mut visit = || -> Result<()> {
let Some(binding) = SkelBindingAPI::get(stage, path.clone())? else {
return Ok(());
};
out.push(SkelBinding {
prim: path.as_str().to_string(),
skeleton: binding.inherited_skeleton()?,
animation_source: binding.inherited_animation_source()?,
binding,
});
Ok(())
};
if let Err(e) = visit() {
first_err = Err(e);
}
})?;
first_err?;
Ok(out)
}