#[cfg(feature = "experimental")]
pub mod cluster;
pub mod index;
pub mod overdraw;
pub mod quantize;
#[cfg(feature = "experimental")]
pub mod simplify;
#[cfg(feature = "experimental")]
pub mod spatial_order;
pub mod stripify;
pub mod util;
pub mod vertex;
use std::ops::Range;
pub const INVALID_INDEX: u32 = u32::MAX;
pub struct Stream<'a> {
data: &'a [u8],
stride: usize,
subset: Range<usize>,
}
impl<'a> Stream<'a> {
pub fn from_slice<T>(slice: &'a [T]) -> Self {
let value_size = std::mem::size_of::<T>();
let data = util::as_bytes(slice);
Self::from_bytes(data, value_size, 0..value_size)
}
pub fn from_slice_with_subset<T>(slice: &'a [T], subset: Range<usize>) -> Self {
let value_size = std::mem::size_of::<T>();
let data = util::as_bytes(slice);
Self::from_bytes(data, value_size, subset)
}
pub fn from_bytes<T>(slice: &'a [T], stride: usize, subset: Range<usize>) -> Self {
assert!(subset.end <= stride);
let value_size = std::mem::size_of::<T>();
let stride = stride * value_size;
let subset = subset.start * value_size..subset.end * value_size;
let data = util::as_bytes(slice);
Self { data, stride, subset }
}
fn get(&self, index: usize) -> &'a [u8] {
let i = index * self.stride;
&self.data[i + self.subset.start..i + self.subset.end]
}
pub fn len(&self) -> usize {
self.data.len() / self.stride
}
}
#[derive(Clone, Copy, Default)]
struct Vector3 {
x: f32,
y: f32,
z: f32,
}
impl Vector3 {
pub fn new(x: f32, y: f32, z: f32) -> Vector3 {
Self { x, y, z }
}
#[cfg(feature = "experimental")]
pub fn normalize(&mut self) -> f32 {
let length = (self.x * self.x + self.y * self.y + self.z * self.z).sqrt();
if length > 0.0 {
self.x /= length;
self.y /= length;
self.z /= length;
}
length
}
}