hapi-rs 0.9.0

Rust bindings to Houdini Engine API
Documentation
use once_cell::sync::Lazy;

use hapi_rs::{
    geometry::Materials,
    session::{quick_session, Session, SessionOptions},
};

static SESSION: Lazy<Session> = Lazy::new(|| {
    env_logger::init();
    let opt = SessionOptions::builder().threaded(true).build();
    let session = quick_session(Some(&opt)).expect("Could not create test session");
    session
        .load_asset_file("otls/sesi/SideFX_spaceship.hda")
        .expect("load asset");
    session
});

#[test]
fn image_file_formats() {
    let formats = SESSION.get_supported_image_formats().unwrap();
    assert!(formats.iter().any(|f| f.name().unwrap() == "JPEG"));
    assert!(formats.iter().any(|f| f.extension().unwrap() == "jpg"));
}

#[test]
fn image_extract_api() {
    let node = SESSION.create_node("Object/spaceship").unwrap();
    node.cook_blocking().unwrap();
    let geo = node.geometry().expect("geometry").unwrap();
    let mats = geo.get_materials(None).unwrap().expect("materials");
    if let Materials::Single(mat) = mats {
        let mut info = mat.get_image_info().unwrap();
        info.set_x_res(512);
        info.set_y_res(512);
        mat.render_texture("baseColorMap").unwrap();
        mat.set_image_info(&info).unwrap();
        let ip = mat.get_image_planes().unwrap();
        assert!(ip.iter().any(|ip| *ip == "C"));
        let file = std::env::temp_dir().join("hapi.jpeg");
        mat.extract_image_to_file("C", file).expect("extract_image");
        mat.render_texture("baseColorMap").unwrap();
        let mut bytes = vec![];
        mat.extract_image_to_memory(&mut bytes, "C", "JPEG")
            .expect("extract_image");
        assert!(!bytes.is_empty());
    } else {
        panic!("Failed to extract material data")
    }
}