emesh_core/
mesh.rs

1use crate::polygon::{IndexedPolygon, Polygon};
2use nalgebra::Point3;
3use rayon::iter::*;
4
5#[derive(Debug, Clone, PartialEq)]
6pub struct Mesh {
7    vertices: Vec<Point3<f64>>,
8    polygons: Vec<IndexedPolygon>,
9}
10
11impl Mesh {
12    pub fn new(vertices: Vec<Point3<f64>>, polygons: Vec<IndexedPolygon>) -> Self {
13        Self { vertices, polygons }
14    }
15
16    pub fn add_vertex(&mut self, vertex: Point3<f64>) -> usize {
17        self.vertices.push(vertex);
18        self.vertices.len() - 1
19    }
20
21    pub fn add_indexed_polygon(&mut self, polygon: IndexedPolygon) {
22        self.polygons.push(polygon);
23    }
24
25    pub fn add_polygon(&mut self, polygon: &Polygon, tolerance: Option<f64>) {
26        if tolerance.is_some() {
27            todo!("not supported yet");
28        }
29        let start_index = self.vertices.len();
30        let indext_range: Vec<_> =
31            (start_index..(start_index + polygon.vertices().len())).collect();
32        let mut vertices = polygon.vertices().clone();
33        self.vertices.append(&mut vertices);
34
35        let indexed_polygon = IndexedPolygon::new(indext_range).unwrap();
36        self.polygons.push(indexed_polygon);
37    }
38
39    pub fn get_polygon(&self, index: usize) -> Option<Polygon> {
40        let indexed_polygon = self.polygons.get(index)?;
41
42        let polygon = resolve_indexed_polygon(indexed_polygon, &self.vertices);
43        Some(polygon)
44    }
45
46    pub fn get_polygons(&self) -> Vec<Polygon> {
47        self.polygons
48            .par_iter()
49            .map(|p| resolve_indexed_polygon(p, &self.vertices))
50            .collect()
51    }
52}
53
54fn resolve_indexed_polygon(
55    indexed_polygon: &IndexedPolygon,
56    vertices: &Vec<Point3<f64>>,
57) -> Polygon {
58    let vertices: Vec<Point3<f64>> = indexed_polygon
59        .vertices()
60        .iter()
61        .map(|i| *vertices.get(*i).expect("indices must be sane"))
62        .collect();
63
64    Polygon::new(vertices).expect("must be sane")
65}