ncollide3d/utils/
cleanup.rs

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