use anyhow::Result;
use crate::sdf::Path;
use crate::usd::{Prim, Stage};
use crate::schemas::geom::tokens::{A_EXTENT, A_PURPOSE, A_VISIBILITY};
use crate::schemas::geom::types::{Purpose, Visibility};
use super::common::{author_uniform_token, author_vec3f_pair_array};
pub fn set_visibility(stage: &Stage, prim: &Path, visibility: Visibility) -> Result<()> {
author_uniform_token(stage, prim, A_VISIBILITY, visibility.as_token())
}
pub fn set_purpose(stage: &Stage, prim: &Path, purpose: Purpose) -> Result<()> {
author_uniform_token(stage, prim, A_PURPOSE, purpose.as_token())
}
pub fn set_extent(stage: &Stage, prim: &Path, extent: [[f32; 3]; 2]) -> Result<()> {
author_vec3f_pair_array(stage, prim, A_EXTENT, extent)
}
pub struct ImageableAuthor<'s> {
prim: Prim<'s>,
}
impl<'s> ImageableAuthor<'s> {
pub fn into_prim(self) -> Prim<'s> {
self.prim
}
pub fn set_visibility(self, visibility: Visibility) -> Result<Self> {
set_visibility(self.prim.stage(), self.prim.path(), visibility)?;
Ok(self)
}
pub fn set_purpose(self, purpose: Purpose) -> Result<Self> {
set_purpose(self.prim.stage(), self.prim.path(), purpose)?;
Ok(self)
}
pub fn set_extent(self, extent: [[f32; 3]; 2]) -> Result<Self> {
set_extent(self.prim.stage(), self.prim.path(), extent)?;
Ok(self)
}
}
pub fn apply_imageable_overrides<'s>(stage: &'s Stage, path: impl Into<Path>) -> Result<ImageableAuthor<'s>> {
let prim = stage.override_prim(path)?;
Ok(ImageableAuthor { prim })
}
#[cfg(test)]
mod tests {
use super::*;
use crate::sdf;
#[test]
fn visibility_roundtrip() -> Result<()> {
let stage = Stage::builder().in_memory("anon.usda")?;
stage.define_prim("/Mesh")?.set_type_name("Mesh")?;
set_visibility(&stage, &sdf::path("/Mesh")?, Visibility::Invisible)?;
assert_eq!(
crate::schemas::geom::read_visibility(&stage, &sdf::path("/Mesh")?)?,
Visibility::Invisible,
);
Ok(())
}
#[test]
fn purpose_and_extent_roundtrip() -> Result<()> {
let stage = Stage::builder().in_memory("anon.usda")?;
stage.define_prim("/Cube")?.set_type_name("Cube")?;
set_purpose(&stage, &sdf::path("/Cube")?, Purpose::Guide)?;
set_extent(&stage, &sdf::path("/Cube")?, [[-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]])?;
assert_eq!(
crate::schemas::geom::read_purpose(&stage, &sdf::path("/Cube")?)?,
Purpose::Guide,
);
let extent = crate::schemas::geom::read_extent(&stage, &sdf::path("/Cube")?)?.expect("extent");
assert_eq!(extent, [[-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]]);
Ok(())
}
#[test]
fn imageable_overrides_chain() -> Result<()> {
let stage = Stage::builder().in_memory("anon.usda")?;
stage.define_prim("/Mesh")?.set_type_name("Mesh")?;
apply_imageable_overrides(&stage, sdf::path("/Mesh")?)?
.set_visibility(Visibility::Inherited)?
.set_purpose(Purpose::Render)?;
assert_eq!(
crate::schemas::geom::read_purpose(&stage, &sdf::path("/Mesh")?)?,
Purpose::Render,
);
Ok(())
}
}