#![cfg_attr(not(doctest), doc = include_str!("../README.md"))]
mod cxx_ffi;
mod layouts;
mod ray;
mod traversal;
use std::u32;
pub(crate) use cxx_ffi::ffi;
pub use layouts::*;
pub use ray::*;
pub use traversal::*;
pub const INFINITE: f32 = 1e30;
pub type Positions<'a> = pas::Slice<'a, [f32; 4]>;
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum Error {
PrimitiveTriangulated(usize),
BindInvalidPositionsLen(u32, u32),
InvalidLeafCount(u32, u32),
}
impl Error {
pub(crate) fn validate_triangulated(prim_len: usize) -> Result<(), Error> {
if prim_len % 3 != 0 {
Err(Error::PrimitiveTriangulated(prim_len as usize))
} else {
Ok(())
}
}
pub(crate) fn validate_primitives_len(expected: u32, prim_count: u32) -> Result<(), Error> {
if expected != prim_count {
Err(Error::BindInvalidPositionsLen(expected, prim_count))
} else {
Ok(())
}
}
pub(crate) fn validate_leaf_count(expected: u32, count: Option<u32>) -> Result<(), Error> {
if Some(expected) != count {
Err(Error::InvalidLeafCount(expected, count.unwrap_or(u32::MAX)))
} else {
Ok(())
}
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::PrimitiveTriangulated(size) => {
write!(
f,
"primitives slice must triangulated (size multiple of 3), got {}",
size
)
}
Error::BindInvalidPositionsLen(expected, size) => {
write!(
f,
"binding positions expected size {}, got {}",
expected, size
)
}
Error::InvalidLeafCount(expected, size) => {
write!(f, "expected at most {} per leaf, got {}", expected, size)
}
}
}
}