1use super::{color::Color, position::Position};
2
3#[derive(Copy, Clone, PartialEq, Debug, Default)]
6pub struct Vertex {
7 pub position: Position,
9 pub color: Option<Color>,
11}
12
13impl Vertex {
14 #[must_use]
16 pub fn new(position: Position, color: Option<Color>) -> Self {
17 Self { position, color }
18 }
19}
20
21#[derive(Clone, PartialEq, Debug, Default)]
24pub struct Face {
25 pub vertices: Vec<usize>,
27 pub color: Option<Color>,
29}
30
31impl Face {
32 #[must_use]
34 pub fn new(vertices: Vec<usize>, color: Option<Color>) -> Self {
35 Self { vertices, color }
36 }
37}
38
39impl From<Face> for Vec<usize> {
40 fn from(value: Face) -> Vec<usize> {
42 value.vertices
43 }
44}
45
46#[derive(Default, Clone, PartialEq, Debug)]
49pub struct Mesh {
50 pub vertices: Vec<Vertex>,
52 pub faces: Vec<Face>,
54}
55
56impl Mesh {
57 #[must_use]
59 pub(crate) fn new() -> Self {
60 Self::default()
61 }
62
63 #[must_use]
65 pub fn vertex_count(&self) -> usize {
66 self.vertices.len()
67 }
68
69 #[must_use]
71 pub fn face_count(&self) -> usize {
72 self.faces.len()
73 }
74
75 #[must_use]
77 pub fn edge_count(&self) -> usize {
78 self.faces.iter().map(|face| face.vertices.len() - 1).sum()
79 }
80}