1#[cfg(feature = "rerun")]
2use std::borrow::Borrow;
3
4#[cfg(any(test, feature = "rerun"))]
5use glam::Vec3;
6#[cfg(feature = "rerun")]
7use glam::{Quat, Vec2};
8
9#[cfg(feature = "rerun")]
10pub fn vec3_array(v: impl Borrow<Vec3>) -> [f32; 3] {
11 [v.borrow().x, v.borrow().y, v.borrow().z]
12}
13
14#[cfg(feature = "rerun")]
15pub fn vec2_array(v: impl Borrow<Vec2>) -> [f32; 3] {
16 [v.borrow().x, v.borrow().y, 0.0]
17}
18
19#[cfg(feature = "rerun")]
20pub fn quat_array(q: impl Borrow<Quat>) -> [f32; 4] {
21 [q.borrow().x, q.borrow().y, q.borrow().z, q.borrow().w]
22}
23
24#[macro_export]
25macro_rules! error_none {
26 ($msg:literal $(, $args:expr)*) => {
27 || {
28 tracing::error!($msg $(, $args)*);
29 None
30 }
31 };
32}
33
34macro_rules! unwrap_or_return {
35 ($code:expr, $error:expr, $ret:expr) => {
36 match $code {
37 Some(value) => value,
38 None => {
39 tracing::error!($error);
40 return $ret;
41 }
42 }
43 };
44 ($code:expr, $error:expr) => {
45 match $code {
46 Some(value) => value,
47 None => {
48 tracing::error!($error);
49 return;
50 }
51 }
52 };
53}
54
55#[cfg(test)]
56pub(crate) fn get_tracing_subscriber() {
57 if let Err(e) = tracing_subscriber::fmt()
58 .with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
59 .with_line_number(true)
60 .pretty()
61 .try_init()
62 {
63 tracing::warn!("Tracing subscriber already initialized: {}", e);
64 }
65}
66
67pub(crate) use unwrap_or_return;
68
69#[cfg(test)]
70fn extend_outer_corners(
71 meshgraph: &mut crate::MeshGraph,
72 new_vertex_ids: &mut Vec<crate::VertexId>,
73 outer_vertex_ids: &[crate::VertexId],
74 scalar: f32,
75 steps: usize,
76) {
77 if steps == 0 {
78 return;
79 }
80
81 let mut corner_vertex_ids = Vec::with_capacity(outer_vertex_ids.len());
82
83 for i in 0..outer_vertex_ids.len() {
85 let point_1 = meshgraph.positions.get(outer_vertex_ids[i]).unwrap();
86 let point_2 = meshgraph
87 .positions
88 .get(outer_vertex_ids[(i + 1) % outer_vertex_ids.len()])
89 .unwrap();
90
91 let mut point_3 = point_1
92 + ((point_2 - point_1) * 0.5)
93 + (point_1 + point_2).normalize() * scalar / steps as f32;
94
95 point_3.z = 0.0; let vertex_id = meshgraph.add_vertex(point_3);
98 corner_vertex_ids.push(vertex_id);
99 }
100
101 for cv_i in 0..corner_vertex_ids.len() {
102 let corner_vertex_id = corner_vertex_ids[cv_i];
103 let vertex_id = outer_vertex_ids[cv_i];
104 let next_vertext_id = outer_vertex_ids[(cv_i + 1) % outer_vertex_ids.len()];
105 let halfedge_vertex_to_corner_id = meshgraph
106 .add_or_get_edge(vertex_id, corner_vertex_id)
107 .start_to_end_he_id;
108 let halfedge_vertex_to_next_vertex_id = meshgraph
109 .add_or_get_edge(vertex_id, next_vertext_id)
110 .start_to_end_he_id;
111
112 meshgraph
113 .add_face_from_halfedges(
114 halfedge_vertex_to_corner_id,
115 halfedge_vertex_to_next_vertex_id,
116 )
117 .unwrap();
118
119 let halfedge_corner_to_next_vertex_id = meshgraph
120 .add_or_get_edge(corner_vertex_id, next_vertext_id)
121 .start_to_end_he_id;
122
123 let halfedge_next_vertex_to_next_corner_vertex_id = meshgraph
124 .add_or_get_edge(
125 next_vertext_id,
126 corner_vertex_ids[(cv_i + 1) % corner_vertex_ids.len()],
127 )
128 .start_to_end_he_id;
129
130 meshgraph
131 .add_face_from_halfedges(
132 halfedge_corner_to_next_vertex_id,
133 halfedge_next_vertex_to_next_corner_vertex_id,
134 )
135 .unwrap();
136 }
137
138 extend_outer_corners(
139 meshgraph,
140 new_vertex_ids,
141 &corner_vertex_ids,
142 scalar,
143 steps - 1,
144 );
145
146 new_vertex_ids.extend(corner_vertex_ids);
147}
148
149#[cfg(test)]
153pub(crate) fn extend_with(
154 meshgraph: &mut crate::MeshGraph,
155 center_and_points: &[Vec3],
156 matrix: glam::Mat4,
157 scalar: f32,
158 steps: usize,
159) -> Vec<crate::VertexId> {
160 let (center, points) = center_and_points.split_first().unwrap();
161 let center_id = meshgraph.add_vertex(*center);
162
163 let mut vertex_ids = Vec::new();
164 let mut halfedge_ids = Vec::new();
165
166 for point in points {
167 let vertex_id = meshgraph.add_vertex(*point);
168 let halfedge_id = meshgraph
169 .add_or_get_edge(center_id, vertex_id)
170 .start_to_end_he_id;
171
172 vertex_ids.push(vertex_id);
173 halfedge_ids.push(halfedge_id);
174 }
175
176 for i in 0..points.len() {
177 meshgraph
178 .add_face_from_halfedges(halfedge_ids[i], halfedge_ids[(i + 1) % points.len()])
179 .unwrap();
180 }
181
182 let mut new_vertex_ids = vec![center_id];
183 new_vertex_ids.extend(vertex_ids.clone());
184 extend_outer_corners(meshgraph, &mut new_vertex_ids, &vertex_ids, scalar, steps);
185
186 for new_vertex_id in new_vertex_ids.iter() {
187 if let Some(pos) = meshgraph.positions.get_mut(*new_vertex_id) {
188 *pos = matrix.transform_point3(*pos);
189 };
190 }
191
192 new_vertex_ids
193}