parry3d/utils/
cleanup.rs

1use crate::math::{Point, Real};
2use alloc::vec::Vec;
3use core::iter;
4
5/// Given an index buffer, remove from `points` every point that is not indexed.
6pub fn remove_unused_points(points: &mut Vec<Point<Real>>, idx: &mut [[u32; 3]]) {
7    let mut used: Vec<bool> = iter::repeat_n(false, points.len()).collect();
8    let mut remap: Vec<usize> = (0..points.len()).collect();
9    let used = &mut used[..];
10    let remap = &mut remap[..];
11
12    for i in idx.iter() {
13        used[i[0] as usize] = true;
14        used[i[1] as usize] = true;
15        used[i[2] as usize] = true;
16    }
17
18    let mut i = 0;
19    while i != points.len() {
20        if !used[i] {
21            let _ = points.swap_remove(i);
22            remap[points.len()] = i;
23            used[i] = used[points.len()];
24        } else {
25            i += 1;
26        }
27    }
28
29    for id in idx.iter_mut() {
30        id[0] = remap[id[0] as usize] as u32;
31        id[1] = remap[id[1] as usize] as u32;
32        id[2] = remap[id[2] as usize] as u32;
33    }
34}