1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use std::{collections::HashMap, hash::Hash};
use fj_math::Point;
pub struct Mesh<V> {
vertices: Vec<V>,
indices: Vec<Index>,
indices_by_vertex: HashMap<V, Index>,
triangles: Vec<Triangle>,
}
impl<V> Mesh<V>
where
V: Copy + Eq + Hash,
{
pub fn new() -> Self {
Self::default()
}
pub fn push_vertex(&mut self, vertex: V) {
let index =
*self.indices_by_vertex.entry(vertex).or_insert_with(|| {
let index = self.vertices.len();
self.vertices.push(vertex);
index as u32
});
self.indices.push(index);
}
pub fn contains_triangle(&self, points: [impl Into<Point<3>>; 3]) -> bool {
let triangle = fj_math::Triangle::from_points(points).normalize();
for t in &self.triangles {
let t = fj_math::Triangle::from_points(t.points).normalize();
if triangle == t {
return true;
}
}
false
}
pub fn vertices(&self) -> impl Iterator<Item = V> + '_ {
self.vertices.iter().copied()
}
pub fn indices(&self) -> impl Iterator<Item = Index> + '_ {
self.indices.iter().copied()
}
pub fn triangles(&self) -> impl Iterator<Item = Triangle> + '_ {
self.triangles.iter().copied()
}
}
impl Mesh<Point<3>> {
pub fn push_triangle(&mut self, points: [Point<3>; 3], color: Color) {
for point in points {
self.push_vertex(point);
}
self.triangles.push(Triangle { points, color });
}
}
impl<V> Default for Mesh<V> {
fn default() -> Self {
Self {
vertices: Default::default(),
indices: Default::default(),
indices_by_vertex: Default::default(),
triangles: Default::default(),
}
}
}
pub type Index = u32;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd)]
pub struct Triangle {
pub points: [Point<3>; 3],
pub color: Color,
}
pub type Color = [u8; 4];