threecrate_core/
mesh.rs

1//! Mesh data structures and functionality
2
3use crate::point::*;
4// use nalgebra::{Point3, Vector3};
5use serde::{Deserialize, Serialize};
6
7/// A triangle mesh with vertices and faces
8#[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/// A mesh with colored vertices
17#[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    /// Create a new empty mesh
26    pub fn new() -> Self {
27        Self {
28            vertices: Vec::new(),
29            faces: Vec::new(),
30            normals: None,
31            colors: None,
32        }
33    }
34
35    /// Create a mesh from vertices and faces
36    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    /// Get the number of vertices
46    pub fn vertex_count(&self) -> usize {
47        self.vertices.len()
48    }
49
50    /// Get the number of faces
51    pub fn face_count(&self) -> usize {
52        self.faces.len()
53    }
54
55    /// Check if the mesh is empty
56    pub fn is_empty(&self) -> bool {
57        self.vertices.is_empty() || self.faces.is_empty()
58    }
59
60    /// Add a vertex to the mesh
61    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    /// Add a face to the mesh
68    pub fn add_face(&mut self, face: [usize; 3]) {
69        self.faces.push(face);
70    }
71
72    /// Calculate face normals
73    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    /// Set vertex normals
90    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    /// Set vertex colors
97    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    /// Clear the mesh
104    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    /// Create a new empty colored mesh
120    pub fn new() -> Self {
121        Self {
122            vertices: Vec::new(),
123            faces: Vec::new(),
124            normals: None,
125        }
126    }
127
128    /// Get the number of vertices
129    pub fn vertex_count(&self) -> usize {
130        self.vertices.len()
131    }
132
133    /// Get the number of faces
134    pub fn face_count(&self) -> usize {
135        self.faces.len()
136    }
137
138    /// Check if the mesh is empty
139    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}