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}