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
use crate::mesh::*;
impl Mesh {
pub fn merge_with(&mut self, other: &Self) {
self.append(other);
self.merge_overlapping_primitives();
}
}
#[cfg(test)]
mod tests {
use super::*;
use three_d_asset::{Positions, TriMesh};
#[test]
fn test_face_face_merging_at_edge() {
let mut mesh1: Mesh = TriMesh {
positions: Positions::F64(vec![
vec3(-2.0, 0.0, -2.0),
vec3(-2.0, 0.0, 2.0),
vec3(2.0, 0.0, 0.0),
]),
..Default::default()
}
.into();
let mesh2: Mesh = TriMesh {
positions: Positions::F64(vec![
vec3(-2.0, 0.0, 2.0),
vec3(-2.0, 0.0, -2.0),
vec3(-2.0, 0.5, 0.0),
]),
..Default::default()
}
.into();
mesh1.merge_with(&mesh2);
assert_eq!(mesh1.no_faces(), 2);
assert_eq!(mesh1.no_vertices(), 4);
mesh1.is_valid().unwrap();
mesh2.is_valid().unwrap();
}
#[test]
fn test_box_box_merge() {
let mut mesh1 = crate::test_utility::cube();
let mut mesh2 = crate::test_utility::cube();
mesh2.translate(vec3(0.5, 0.5, 0.5));
let (meshes1, meshes2) = mesh1.split_at_intersection(&mut mesh2);
let mut result = meshes1.first().unwrap().clone();
result.merge_with(meshes2.first().unwrap());
mesh1.is_valid().unwrap();
mesh2.is_valid().unwrap();
result.is_valid().unwrap();
}
}