use crate::{ffi, DecodePosition, VertexDataAdapter};
use std::mem;
pub fn optimize_vertex_cache(indices: &[u32], vertex_count: usize) -> Vec<u32> {
let mut optimized: Vec<u32> = vec![0; indices.len()];
unsafe {
ffi::meshopt_optimizeVertexCache(
optimized.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
vertex_count,
);
}
optimized
}
pub fn optimize_vertex_cache_in_place(indices: &mut [u32], vertex_count: usize) {
unsafe {
ffi::meshopt_optimizeVertexCache(
indices.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
vertex_count,
);
}
}
pub fn optimize_vertex_cache_fifo(
indices: &[u32],
vertex_count: usize,
cache_size: u32,
) -> Vec<u32> {
let mut optimized: Vec<u32> = vec![0; indices.len()];
unsafe {
ffi::meshopt_optimizeVertexCacheFifo(
optimized.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
vertex_count,
cache_size,
);
}
optimized
}
pub fn optimize_vertex_cache_fifo_in_place(
indices: &mut [u32],
vertex_count: usize,
cache_size: u32,
) {
unsafe {
ffi::meshopt_optimizeVertexCacheFifo(
indices.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
vertex_count,
cache_size,
);
}
}
pub fn optimize_vertex_fetch<T: Clone + Default>(indices: &mut [u32], vertices: &[T]) -> Vec<T> {
let mut result: Vec<T> = vec![T::default(); vertices.len()];
let next_vertex = unsafe {
ffi::meshopt_optimizeVertexFetch(
result.as_mut_ptr().cast(),
indices.as_mut_ptr(),
indices.len(),
vertices.as_ptr().cast(),
vertices.len(),
mem::size_of::<T>(),
)
};
result.resize(next_vertex, T::default());
result
}
pub fn optimize_vertex_fetch_in_place<T>(indices: &mut [u32], vertices: &mut [T]) -> usize {
unsafe {
ffi::meshopt_optimizeVertexFetch(
vertices.as_mut_ptr().cast(),
indices.as_mut_ptr(),
indices.len(),
vertices.as_ptr().cast(),
vertices.len(),
mem::size_of::<T>(),
)
}
}
pub fn optimize_vertex_fetch_remap(indices: &[u32], vertex_count: usize) -> Vec<u32> {
let mut result: Vec<u32> = vec![0; vertex_count];
let next_vertex = unsafe {
ffi::meshopt_optimizeVertexFetchRemap(
result.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
vertex_count,
)
};
result.resize(next_vertex, 0u32);
result
}
pub fn optimize_overdraw_in_place(
indices: &mut [u32],
vertices: &VertexDataAdapter<'_>,
threshold: f32,
) {
unsafe {
ffi::meshopt_optimizeOverdraw(
indices.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
vertices.pos_ptr(),
vertices.vertex_count,
vertices.vertex_stride,
threshold,
);
}
}
pub fn optimize_overdraw_in_place_decoder<T: DecodePosition>(
indices: &mut [u32],
vertices: &[T],
threshold: f32,
) {
let positions = vertices
.iter()
.map(|vertex| vertex.decode_position())
.collect::<Vec<[f32; 3]>>();
unsafe {
ffi::meshopt_optimizeOverdraw(
indices.as_mut_ptr(),
indices.as_ptr(),
indices.len(),
positions.as_ptr().cast(),
positions.len(),
mem::size_of::<f32>() * 3,
threshold,
);
}
}