1use crate::point::*;
4use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct TriangleMesh {
10 pub vertices: Vec<Point3f>,
11 pub faces: Vec<[usize; 3]>,
12 pub normals: Option<Vec<Vector3f>>,
13 pub colors: Option<Vec<[u8; 3]>>,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct ColoredTriangleMesh {
19 pub vertices: Vec<ColoredPoint3f>,
20 pub faces: Vec<[usize; 3]>,
21 pub normals: Option<Vec<Vector3f>>,
22}
23
24impl TriangleMesh {
25 pub fn new() -> Self {
27 Self {
28 vertices: Vec::new(),
29 faces: Vec::new(),
30 normals: None,
31 colors: None,
32 }
33 }
34
35 pub fn from_vertices_and_faces(vertices: Vec<Point3f>, faces: Vec<[usize; 3]>) -> Self {
37 Self {
38 vertices,
39 faces,
40 normals: None,
41 colors: None,
42 }
43 }
44
45 pub fn vertex_count(&self) -> usize {
47 self.vertices.len()
48 }
49
50 pub fn face_count(&self) -> usize {
52 self.faces.len()
53 }
54
55 pub fn is_empty(&self) -> bool {
57 self.vertices.is_empty() || self.faces.is_empty()
58 }
59
60 pub fn add_vertex(&mut self, vertex: Point3f) -> usize {
62 let index = self.vertices.len();
63 self.vertices.push(vertex);
64 index
65 }
66
67 pub fn add_face(&mut self, face: [usize; 3]) {
69 self.faces.push(face);
70 }
71
72 pub fn calculate_face_normals(&self) -> Vec<Vector3f> {
74 self.faces
75 .iter()
76 .map(|face| {
77 let v0 = self.vertices[face[0]];
78 let v1 = self.vertices[face[1]];
79 let v2 = self.vertices[face[2]];
80
81 let edge1 = v1 - v0;
82 let edge2 = v2 - v0;
83
84 edge1.cross(&edge2).normalize()
85 })
86 .collect()
87 }
88
89 pub fn set_normals(&mut self, normals: Vec<Vector3f>) {
91 if normals.len() == self.vertices.len() {
92 self.normals = Some(normals);
93 }
94 }
95
96 pub fn set_colors(&mut self, colors: Vec<[u8; 3]>) {
98 if colors.len() == self.vertices.len() {
99 self.colors = Some(colors);
100 }
101 }
102
103 pub fn clear(&mut self) {
105 self.vertices.clear();
106 self.faces.clear();
107 self.normals = None;
108 self.colors = None;
109 }
110}
111
112impl Default for TriangleMesh {
113 fn default() -> Self {
114 Self::new()
115 }
116}
117
118impl ColoredTriangleMesh {
119 pub fn new() -> Self {
121 Self {
122 vertices: Vec::new(),
123 faces: Vec::new(),
124 normals: None,
125 }
126 }
127
128 pub fn vertex_count(&self) -> usize {
130 self.vertices.len()
131 }
132
133 pub fn face_count(&self) -> usize {
135 self.faces.len()
136 }
137
138 pub fn is_empty(&self) -> bool {
140 self.vertices.is_empty() || self.faces.is_empty()
141 }
142}
143
144impl Default for ColoredTriangleMesh {
145 fn default() -> Self {
146 Self::new()
147 }
148}