From 05e22bc04f7e224a70abd186adfe1608e962496e Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:00:27 +0100 Subject: [PATCH 01/36] Refactor test code to simplify it --- .../src/algorithms/intersect/curve_face.rs | 4 +- .../src/algorithms/intersect/face_face.rs | 9 ++- .../src/algorithms/intersect/face_point.rs | 73 +++++++++---------- .../src/algorithms/intersect/ray_face.rs | 64 ++++++++-------- .../src/algorithms/triangulate/mod.rs | 27 +++---- crates/fj-kernel/src/validate/face.rs | 4 +- 6 files changed, 83 insertions(+), 98 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index 524124d4c..34736b00e 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -186,8 +186,8 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( exterior_points, &mut services.objects, ); diff --git a/crates/fj-kernel/src/algorithms/intersect/face_face.rs b/crates/fj-kernel/src/algorithms/intersect/face_face.rs index 7c7f9b567..513a8e81a 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_face.rs @@ -65,6 +65,7 @@ mod tests { builder::CycleBuilder, geometry::curve::Curve, insert::Insert, + objects::Cycle, partial::{PartialFace, PartialObject}, services::Services, }; @@ -91,8 +92,8 @@ mod tests { face.surface = Some(surface); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( points, &mut services.objects, ); @@ -127,8 +128,8 @@ mod tests { face.surface = Some(surface); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( points, &mut services.objects, ); diff --git a/crates/fj-kernel/src/algorithms/intersect/face_point.rs b/crates/fj-kernel/src/algorithms/intersect/face_point.rs index c05eeaced..182ceeffb 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_point.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_point.rs @@ -140,6 +140,7 @@ mod tests { algorithms::intersect::{face_point::FacePointIntersection, Intersect}, builder::CycleBuilder, insert::Insert, + objects::Cycle, partial::{PartialFace, PartialObject}, services::Services, }; @@ -152,11 +153,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [1., 1.], [0., 2.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [1., 1.], [0., 2.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -176,11 +176,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [2., 1.], [0., 2.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [2., 1.], [0., 2.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -203,11 +202,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[4., 2.], [0., 4.], [0., 0.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[4., 2.], [0., 4.], [0., 0.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -230,11 +228,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [2., 1.], [3., 0.], [3., 4.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [2., 1.], [3., 0.], [3., 4.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -257,11 +254,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [2., 1.], [3., 1.], [0., 2.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [2., 1.], [3., 1.], [0., 2.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -284,11 +280,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [2., 1.], [3., 1.], [4., 0.], [4., 5.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [2., 1.], [3., 1.], [4., 0.], [4., 5.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -311,11 +306,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [2., 0.], [0., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [2., 0.], [0., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -344,11 +338,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[0., 0.], [1., 0.], [0., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[0., 0.], [1., 0.], [0., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index 486e3f4a7..26cc909f3 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -153,6 +153,7 @@ mod tests { }, builder::CycleBuilder, insert::Insert, + objects::Cycle, partial::{PartialFace, PartialObject}, services::Services, }; @@ -167,11 +168,10 @@ mod tests { face.surface = Some(services.objects.surfaces.yz_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -192,11 +192,10 @@ mod tests { face.surface = Some(services.objects.surfaces.yz_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -220,11 +219,10 @@ mod tests { face.surface = Some(services.objects.surfaces.yz_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -245,11 +243,10 @@ mod tests { face.surface = Some(services.objects.surfaces.yz_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -278,11 +275,10 @@ mod tests { face.surface = Some(services.objects.surfaces.yz_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -314,11 +310,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -341,11 +336,10 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index a65acf51e..03cbbedd0 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -99,11 +99,10 @@ mod tests { let mut face = PartialFace::new(&mut services.objects); face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [a, b, c, d], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [a, b, c, d], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face @@ -144,11 +143,10 @@ mod tests { let mut face = PartialFace::new(&mut services.objects); face.surface = Some(surface.clone()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [a, b, c, d], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [a, b, c, d], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } { @@ -218,11 +216,10 @@ mod tests { let mut face = PartialFace::new(&mut services.objects); face.surface = Some(surface.clone()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( - [a, b, c, d, e], - &mut services.objects, - ); + let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( + [a, b, c, d, e], + &mut services.objects, + ); face.exterior = exterior.insert(&mut services.objects); } let face = face diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index 903dfa0fc..7ff2f6c36 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -89,8 +89,8 @@ mod tests { face.surface = Some(services.objects.surfaces.xy_plane()); { - let (exterior, _) = - face.exterior.clone_object().update_as_polygon_from_points( + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( [[0., 0.], [3., 0.], [0., 3.]], &mut services.objects, ); From 3f3e04a83222cca8b1ab133b2975b98a50a29d46 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:02:06 +0100 Subject: [PATCH 02/36] Avoid using `PartialFace::new` in test code --- .../src/algorithms/intersect/curve_face.rs | 24 +-- .../src/algorithms/intersect/face_face.rs | 48 ++--- .../src/algorithms/intersect/face_point.rs | 184 ++++++++++-------- .../src/algorithms/intersect/ray_face.rs | 161 ++++++++------- .../src/algorithms/triangulate/mod.rs | 66 ++++--- crates/fj-kernel/src/validate/face.rs | 24 +-- 6 files changed, 287 insertions(+), 220 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index 34736b00e..822d26c23 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -182,17 +182,19 @@ mod tests { ]; let face = { - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]) - .update_as_polygon_from_points( - exterior_points, - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let mut face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + exterior_points, + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; { let (interior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-kernel/src/algorithms/intersect/face_face.rs b/crates/fj-kernel/src/algorithms/intersect/face_face.rs index 513a8e81a..d3d56ec10 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_face.rs @@ -88,17 +88,19 @@ mod tests { services.objects.surfaces.xz_plane(), ] .map(|surface| { - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(surface); - { - let (exterior, _) = Cycle::new([]) - .update_as_polygon_from_points( - points, - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(surface), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + points, + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; face.build(&mut services.objects) }); @@ -124,17 +126,19 @@ mod tests { services.objects.surfaces.xz_plane(), ]; let [a, b] = surfaces.clone().map(|surface| { - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(surface); - { - let (exterior, _) = Cycle::new([]) - .update_as_polygon_from_points( - points, - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(surface), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + points, + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; face.build(&mut services.objects) }); diff --git a/crates/fj-kernel/src/algorithms/intersect/face_point.rs b/crates/fj-kernel/src/algorithms/intersect/face_point.rs index 182ceeffb..5497df96d 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_point.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_point.rs @@ -149,16 +149,20 @@ mod tests { fn point_is_outside_face() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [1., 1.], [0., 2.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [1., 1.], [0., 2.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; + let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -172,16 +176,19 @@ mod tests { fn ray_hits_vertex_while_passing_outside() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [2., 1.], [0., 2.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [2., 1.], [0., 2.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -198,16 +205,20 @@ mod tests { fn ray_hits_vertex_at_cycle_seam() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[4., 2.], [0., 4.], [0., 0.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[4., 2.], [0., 4.], [0., 0.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -224,16 +235,19 @@ mod tests { fn ray_hits_vertex_while_staying_inside() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [2., 1.], [3., 0.], [3., 4.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [2., 1.], [3., 0.], [3., 4.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -250,16 +264,19 @@ mod tests { fn ray_hits_parallel_edge_and_leaves_face_at_vertex() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [2., 1.], [3., 1.], [0., 2.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [2., 1.], [3., 1.], [0., 2.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -276,16 +293,19 @@ mod tests { fn ray_hits_parallel_edge_and_does_not_leave_face_there() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [2., 1.], [3., 1.], [4., 0.], [4., 5.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [2., 1.], [3., 1.], [4., 0.], [4., 5.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -302,16 +322,19 @@ mod tests { fn point_is_coincident_with_edge() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [2., 0.], [0., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [2., 0.], [0., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -334,16 +357,19 @@ mod tests { fn point_is_coincident_with_vertex() { let mut services = Services::new(); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[0., 0.], [1., 0.], [0., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [1., 0.], [0., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index 26cc909f3..f1e762d39 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -164,16 +164,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.yz_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.yz_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects) @@ -188,16 +191,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.yz_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.yz_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects) @@ -215,16 +221,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.yz_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.yz_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects) @@ -239,16 +248,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.yz_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.yz_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects) @@ -271,16 +283,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.yz_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.yz_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects) @@ -306,16 +321,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -332,16 +350,19 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects) diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index 03cbbedd0..7ce68a40b 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -96,15 +96,19 @@ mod tests { let c = [2., 2.]; let d = [0., 1.]; - let mut face = PartialFace::new(&mut services.objects); - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [a, b, c, d], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [a, b, c, d], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); @@ -140,15 +144,19 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); - let mut face = PartialFace::new(&mut services.objects); - face.surface = Some(surface.clone()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [a, b, c, d], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let mut face = PartialFace { + surface: Some(surface.clone()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [a, b, c, d], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; { let (interior, _) = Cycle::new([]).update_as_polygon_from_points( [e, f, g, h], @@ -213,15 +221,19 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); - let mut face = PartialFace::new(&mut services.objects); - face.surface = Some(surface.clone()); - { - let (exterior, _) = Cycle::new([]).update_as_polygon_from_points( - [a, b, c, d, e], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let face = PartialFace { + surface: Some(surface.clone()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [a, b, c, d, e], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; let face = face .build(&mut services.objects) .insert(&mut services.objects); diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index 7ff2f6c36..8c032024f 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -85,17 +85,19 @@ mod tests { let mut services = Services::new(); let valid = { - let mut face = PartialFace::new(&mut services.objects); - - face.surface = Some(services.objects.surfaces.xy_plane()); - { - let (exterior, _) = Cycle::new([]) - .update_as_polygon_from_points( - [[0., 0.], [3., 0.], [0., 3.]], - &mut services.objects, - ); - face.exterior = exterior.insert(&mut services.objects); - } + let mut face = PartialFace { + surface: Some(services.objects.surfaces.xy_plane()), + exterior: { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [3., 0.], [0., 3.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + interiors: Vec::new(), + color: None, + }; { let (interior, _) = Cycle::new([]) .update_as_polygon_from_points( From 0e96fc95c49246b97920d3bef4d6156a25393344 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:45:56 +0100 Subject: [PATCH 03/36] Refactor code to simplify it --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 408ae8d0e..49053b474 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -4,7 +4,7 @@ use fj_math::{Point, Scalar, Vector}; use crate::{ builder::{CycleBuilder, HalfEdgeBuilder}, insert::Insert, - objects::{Face, HalfEdge, Objects, Surface, Vertex}, + objects::{Cycle, Face, HalfEdge, Objects, Surface, Vertex}, partial::{PartialFace, PartialObject}, services::Service, storage::Handle, @@ -81,7 +81,7 @@ impl Sweep for (&HalfEdge, &Handle, &Surface, Color) { [[a, b], [c, d], [b, a], [d, c]] }; - let mut exterior = Some(face.exterior.clone_object()); + let mut exterior = Some(Cycle::new([])); // Armed with all of that, we're ready to create the edges. let [_edge_bottom, _edge_up, edge_top, _edge_down] = boundaries From f5a8b840d013f8576d8cce10b579c8b16ea2ba3c Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:46:59 +0100 Subject: [PATCH 04/36] Avoid using `PartialFace::new` in edge sweep code --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 49053b474..7fdf7b8af 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -24,17 +24,6 @@ impl Sweep for (&HalfEdge, &Handle, &Surface, Color) { let (edge, next_vertex, surface, color) = self; let path = path.into(); - // The result of sweeping an edge is a face. Let's create that. - let mut face = PartialFace::new(objects); - face.color = Some(color); - - // A face (and everything in it) is defined on a surface. A surface can - // be created by sweeping a curve, so let's sweep the curve of the edge - // we're sweeping. - face.surface = Some( - (edge.curve(), surface).sweep_with_cache(path, cache, objects), - ); - // Next, we need to define the boundaries of the face. Let's start with // the global vertices and edges. let (vertices, global_edges) = { @@ -113,7 +102,14 @@ impl Sweep for (&HalfEdge, &Handle, &Surface, Color) { half_edge }); - face.exterior = exterior.unwrap().insert(objects); + let face = PartialFace { + surface: Some( + (edge.curve(), surface).sweep_with_cache(path, cache, objects), + ), + exterior: exterior.unwrap().insert(objects), + interiors: Vec::new(), + color: Some(color), + }; // And we're done creating the face! All that's left to do is build our // return values. From a557e0996f59a1360c94bb3b94f4b30875714fd2 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:49:12 +0100 Subject: [PATCH 05/36] Refactor code to prepare for follow-on change --- crates/fj-kernel/src/algorithms/sweep/face.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index ff289f5d7..7a8dad3b5 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -5,7 +5,7 @@ use itertools::Itertools; use crate::{ algorithms::{reverse::Reverse, transform::TransformObject}, - builder::{CycleBuilder, FaceBuilder}, + builder::CycleBuilder, geometry::curve::GlobalPath, insert::Insert, objects::{Cycle, Face, Objects, Shell}, @@ -60,6 +60,8 @@ impl Sweep for Handle { top_face.surface = Some(top_surface); top_face.color = Some(self.color()); + let mut interiors = Vec::new(); + for (i, cycle) in bottom_face.all_cycles().cloned().enumerate() { let cycle = cycle.reverse(objects); @@ -90,10 +92,12 @@ impl Sweep for Handle { if i == 0 { top_face.exterior = top_cycle.insert(objects); } else { - top_face.add_interior(top_cycle, objects); + interiors.push(top_cycle.insert(objects)); }; } + top_face.interiors = interiors; + let top_face = top_face.build(objects).insert(objects); faces.push(top_face); From b394eba6b77c3d0f2ca8d7bef868f72b24dde980 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:50:57 +0100 Subject: [PATCH 06/36] Refactor code to prepare for follow-on change --- crates/fj-kernel/src/algorithms/sweep/face.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index 7a8dad3b5..67e17be29 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -60,6 +60,7 @@ impl Sweep for Handle { top_face.surface = Some(top_surface); top_face.color = Some(self.color()); + let mut exterior = None; let mut interiors = Vec::new(); for (i, cycle) in bottom_face.all_cycles().cloned().enumerate() { @@ -90,12 +91,13 @@ impl Sweep for Handle { Cycle::new([]).connect_to_edges(top_edges, objects); if i == 0 { - top_face.exterior = top_cycle.insert(objects); + exterior = Some(top_cycle.insert(objects)); } else { interiors.push(top_cycle.insert(objects)); }; } + top_face.exterior = exterior.unwrap(); top_face.interiors = interiors; let top_face = top_face.build(objects).insert(objects); From 952829ae9b6d4aed7900af10e248184bd2a0fdce Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:52:16 +0100 Subject: [PATCH 07/36] Avoid using `PartialFace::new` in face sweep code --- crates/fj-kernel/src/algorithms/sweep/face.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index 67e17be29..c03db6762 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -56,10 +56,6 @@ impl Sweep for Handle { let top_surface = bottom_face.surface().clone().translate(path, objects); - let mut top_face = PartialFace::new(objects); - top_face.surface = Some(top_surface); - top_face.color = Some(self.color()); - let mut exterior = None; let mut interiors = Vec::new(); @@ -97,8 +93,12 @@ impl Sweep for Handle { }; } - top_face.exterior = exterior.unwrap(); - top_face.interiors = interiors; + let top_face = PartialFace { + surface: Some(top_surface), + exterior: exterior.unwrap(), + interiors, + color: Some(self.color()), + }; let top_face = top_face.build(objects).insert(objects); faces.push(top_face); From 33cf3f3bb7178fb6b804e2210319a5c2dfcf5995 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:54:30 +0100 Subject: [PATCH 08/36] Avoid using `PartialFace::new` --- crates/fj-operations/src/sketch.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 9f76437a2..88c593189 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -30,12 +30,12 @@ impl Shape for fj::Sketch { .insert(objects); let exterior = Cycle::new([half_edge]).insert(objects); - let mut face = PartialFace::new(objects); - face.surface = Some(surface); - face.exterior = exterior; - face.color = Some(Color(self.color())); - - face + PartialFace { + surface: Some(surface), + exterior, + interiors: Vec::new(), + color: Some(Color(self.color())), + } } fj::Chain::PolyChain(poly_chain) => { let segments = poly_chain.to_segments(); From 3fdafbc694da12acb7a13ad428651c1eacf5577b Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:55:28 +0100 Subject: [PATCH 09/36] Avoid using `PartialFace::new` --- crates/fj-operations/src/sketch.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 88c593189..3fc1d1210 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -76,12 +76,12 @@ impl Shape for fj::Sketch { cycle.insert(objects) }; - let mut face = PartialFace::new(objects); - face.surface = Some(surface); - face.exterior = exterior; - face.color = Some(Color(self.color())); - - face + PartialFace { + surface: Some(surface), + exterior, + interiors: Vec::new(), + color: Some(Color(self.color())), + } } }; From c4928cf498f52de57f5f1768e858853142441e8f Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:56:08 +0100 Subject: [PATCH 10/36] Remove unused code --- crates/fj-kernel/src/partial/objects/face.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/crates/fj-kernel/src/partial/objects/face.rs b/crates/fj-kernel/src/partial/objects/face.rs index 4c072b616..78cd70948 100644 --- a/crates/fj-kernel/src/partial/objects/face.rs +++ b/crates/fj-kernel/src/partial/objects/face.rs @@ -1,7 +1,6 @@ use fj_interop::mesh::Color; use crate::{ - insert::Insert, objects::{Cycle, Face, Objects, Surface}, partial::{FullToPartialCache, PartialObject}, services::Service, @@ -29,13 +28,9 @@ pub struct PartialFace { impl PartialObject for PartialFace { type Full = Face; - fn new(objects: &mut Service) -> Self { - Self { - surface: None, - exterior: Cycle::new([]).insert(objects), - interiors: Vec::new(), - color: None, - } + fn new(_: &mut Service) -> Self { + // `PartialFace` is being phased out, and this method is no longer used. + unreachable!() } fn from_full(face: &Self::Full, _: &mut FullToPartialCache) -> Self { From 9326af17234c031811d72e7ffcb10899589967d1 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 12:59:52 +0100 Subject: [PATCH 11/36] Make surface in `PartialFace` mandatory --- .../src/algorithms/intersect/curve_face.rs | 2 +- .../src/algorithms/intersect/face_face.rs | 4 ++-- .../src/algorithms/intersect/face_point.rs | 16 ++++++++-------- .../src/algorithms/intersect/ray_face.rs | 14 +++++++------- crates/fj-kernel/src/algorithms/sweep/edge.rs | 5 ++--- crates/fj-kernel/src/algorithms/sweep/face.rs | 2 +- .../fj-kernel/src/algorithms/triangulate/mod.rs | 6 +++--- crates/fj-kernel/src/partial/objects/face.rs | 6 +++--- crates/fj-kernel/src/validate/face.rs | 2 +- crates/fj-operations/src/difference_2d.rs | 2 +- crates/fj-operations/src/sketch.rs | 4 ++-- 11 files changed, 31 insertions(+), 32 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index 822d26c23..e66dffaae 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -183,7 +183,7 @@ mod tests { let face = { let mut face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-kernel/src/algorithms/intersect/face_face.rs b/crates/fj-kernel/src/algorithms/intersect/face_face.rs index d3d56ec10..d74e114e5 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_face.rs @@ -89,7 +89,7 @@ mod tests { ] .map(|surface| { let face = PartialFace { - surface: Some(surface), + surface, exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -127,7 +127,7 @@ mod tests { ]; let [a, b] = surfaces.clone().map(|surface| { let face = PartialFace { - surface: Some(surface), + surface, exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-kernel/src/algorithms/intersect/face_point.rs b/crates/fj-kernel/src/algorithms/intersect/face_point.rs index 5497df96d..8b5b43f27 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_point.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_point.rs @@ -150,7 +150,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -177,7 +177,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -206,7 +206,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -236,7 +236,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -265,7 +265,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -294,7 +294,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -323,7 +323,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -358,7 +358,7 @@ mod tests { let mut services = Services::new(); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index f1e762d39..ba44e9dd6 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -165,7 +165,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.yz_plane()), + surface: services.objects.surfaces.yz_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -192,7 +192,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.yz_plane()), + surface: services.objects.surfaces.yz_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -222,7 +222,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.yz_plane()), + surface: services.objects.surfaces.yz_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -249,7 +249,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.yz_plane()), + surface: services.objects.surfaces.yz_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -284,7 +284,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.yz_plane()), + surface: services.objects.surfaces.yz_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -322,7 +322,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -351,7 +351,7 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index 7fdf7b8af..f7187be66 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -103,9 +103,8 @@ impl Sweep for (&HalfEdge, &Handle, &Surface, Color) { }); let face = PartialFace { - surface: Some( - (edge.curve(), surface).sweep_with_cache(path, cache, objects), - ), + surface: (edge.curve(), surface) + .sweep_with_cache(path, cache, objects), exterior: exterior.unwrap().insert(objects), interiors: Vec::new(), color: Some(color), diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index c03db6762..b49f91fc9 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -94,7 +94,7 @@ impl Sweep for Handle { } let top_face = PartialFace { - surface: Some(top_surface), + surface: top_surface, exterior: exterior.unwrap(), interiors, color: Some(self.color()), diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index 7ce68a40b..08cdef01d 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -97,7 +97,7 @@ mod tests { let d = [0., 1.]; let face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -145,7 +145,7 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let mut face = PartialFace { - surface: Some(surface.clone()), + surface: surface.clone(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( @@ -222,7 +222,7 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let face = PartialFace { - surface: Some(surface.clone()), + surface: surface.clone(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-kernel/src/partial/objects/face.rs b/crates/fj-kernel/src/partial/objects/face.rs index 78cd70948..d6098c050 100644 --- a/crates/fj-kernel/src/partial/objects/face.rs +++ b/crates/fj-kernel/src/partial/objects/face.rs @@ -11,7 +11,7 @@ use crate::{ #[derive(Clone, Debug)] pub struct PartialFace { /// The surface that the face is defined in - pub surface: Option>, + pub surface: Handle, /// The cycle that bounds the face on the outside pub exterior: Handle, @@ -35,7 +35,7 @@ impl PartialObject for PartialFace { fn from_full(face: &Self::Full, _: &mut FullToPartialCache) -> Self { Self { - surface: Some(face.surface().clone()), + surface: face.surface().clone(), exterior: face.exterior().clone(), interiors: face.interiors().cloned().collect(), color: Some(face.color()), @@ -43,7 +43,7 @@ impl PartialObject for PartialFace { } fn build(self, _: &mut Service) -> Self::Full { - let surface = self.surface.expect("Need `Surface` to build `Face`"); + let surface = self.surface; let color = self.color.unwrap_or_default(); Face::new(surface, self.exterior, self.interiors, color) diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index 8c032024f..cc664a6ed 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -86,7 +86,7 @@ mod tests { let valid = { let mut face = PartialFace { - surface: Some(services.objects.surfaces.xy_plane()), + surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( diff --git a/crates/fj-operations/src/difference_2d.rs b/crates/fj-operations/src/difference_2d.rs index 8e228bd5f..a4b079343 100644 --- a/crates/fj-operations/src/difference_2d.rs +++ b/crates/fj-operations/src/difference_2d.rs @@ -79,7 +79,7 @@ impl Shape for fj::Difference2d { ); let face = PartialFace { - surface: Some(surface.clone()), + surface: surface.clone(), exterior, interiors, color: Some(Color(self.color())), diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 3fc1d1210..70bd4496e 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -31,7 +31,7 @@ impl Shape for fj::Sketch { let exterior = Cycle::new([half_edge]).insert(objects); PartialFace { - surface: Some(surface), + surface, exterior, interiors: Vec::new(), color: Some(Color(self.color())), @@ -77,7 +77,7 @@ impl Shape for fj::Sketch { }; PartialFace { - surface: Some(surface), + surface, exterior, interiors: Vec::new(), color: Some(Color(self.color())), From 4532776b0c9d1447658894324e8fcdb0342b91a5 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:00:36 +0100 Subject: [PATCH 12/36] Inline redundant variable --- crates/fj-kernel/src/partial/objects/face.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/partial/objects/face.rs b/crates/fj-kernel/src/partial/objects/face.rs index d6098c050..8edb3035e 100644 --- a/crates/fj-kernel/src/partial/objects/face.rs +++ b/crates/fj-kernel/src/partial/objects/face.rs @@ -43,9 +43,8 @@ impl PartialObject for PartialFace { } fn build(self, _: &mut Service) -> Self::Full { - let surface = self.surface; let color = self.color.unwrap_or_default(); - Face::new(surface, self.exterior, self.interiors, color) + Face::new(self.surface, self.exterior, self.interiors, color) } } From 350c893af87fe861dc1b517ec809841b3f52d3ac Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:02:26 +0100 Subject: [PATCH 13/36] Refactor code to prepare for follow-on change --- crates/fj-kernel/src/algorithms/triangulate/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index 08cdef01d..c15779cae 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -63,9 +63,11 @@ impl Triangulate for FaceApprox { .contains_triangle(triangle.map(|point| point.point_surface)) }); + let color = self.color; + for triangle in triangles { let points = triangle.map(|point| point.point_global); - mesh.push_triangle(points, self.color); + mesh.push_triangle(points, color); } } } From 0c1603df1c529b39f1fa98b10f65e744bcbcf00e Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:03:09 +0100 Subject: [PATCH 14/36] Make color in `FaceApprox` optional --- crates/fj-kernel/src/algorithms/approx/face.rs | 4 ++-- crates/fj-kernel/src/algorithms/triangulate/mod.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/approx/face.rs b/crates/fj-kernel/src/algorithms/approx/face.rs index 1d8eae595..cca69476f 100644 --- a/crates/fj-kernel/src/algorithms/approx/face.rs +++ b/crates/fj-kernel/src/algorithms/approx/face.rs @@ -98,7 +98,7 @@ impl Approx for &Face { FaceApprox { exterior, interiors, - color: self.color(), + color: Some(self.color()), coord_handedness: self.coord_handedness(), } } @@ -114,7 +114,7 @@ pub struct FaceApprox { pub interiors: BTreeSet, /// The color of the approximated face - pub color: Color, + pub color: Option, /// The handedness of the approximated face's front-side coordinate system pub coord_handedness: Handedness, diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index c15779cae..ad80fdc28 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -63,7 +63,7 @@ impl Triangulate for FaceApprox { .contains_triangle(triangle.map(|point| point.point_surface)) }); - let color = self.color; + let color = self.color.unwrap_or_default(); for triangle in triangles { let points = triangle.map(|point| point.point_global); From 09958fbe960e45226d3e04ce5f0111146319cc41 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:05:07 +0100 Subject: [PATCH 15/36] Refactor code to prepare for follow-on change --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 4 ++-- crates/fj-kernel/src/algorithms/sweep/face.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index f7187be66..d79b03944 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -12,7 +12,7 @@ use crate::{ use super::{Sweep, SweepCache}; -impl Sweep for (&HalfEdge, &Handle, &Surface, Color) { +impl Sweep for (&HalfEdge, &Handle, &Surface, Option) { type Swept = (Handle, Handle); fn sweep_with_cache( @@ -107,7 +107,7 @@ impl Sweep for (&HalfEdge, &Handle, &Surface, Color) { .sweep_with_cache(path, cache, objects), exterior: exterior.unwrap().insert(objects), interiors: Vec::new(), - color: Some(color), + color, }; // And we're done creating the face! All that's left to do is build our diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index b49f91fc9..a354f1adf 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -70,7 +70,7 @@ impl Sweep for Handle { half_edge.deref(), next.start_vertex(), self.surface().deref(), - self.color(), + Some(self.color()), ) .sweep_with_cache(path, cache, objects); From 9bcebc118e8542b59cd5c89c6c521c97400adebc Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:06:32 +0100 Subject: [PATCH 16/36] Make color in `Face` optional --- crates/fj-kernel/src/algorithms/approx/face.rs | 2 +- crates/fj-kernel/src/algorithms/sweep/face.rs | 4 ++-- crates/fj-kernel/src/objects/full/face.rs | 6 +++--- crates/fj-kernel/src/partial/objects/face.rs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/approx/face.rs b/crates/fj-kernel/src/algorithms/approx/face.rs index cca69476f..56f45c752 100644 --- a/crates/fj-kernel/src/algorithms/approx/face.rs +++ b/crates/fj-kernel/src/algorithms/approx/face.rs @@ -98,7 +98,7 @@ impl Approx for &Face { FaceApprox { exterior, interiors, - color: Some(self.color()), + color: self.color(), coord_handedness: self.coord_handedness(), } } diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index a354f1adf..31cb997d0 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -70,7 +70,7 @@ impl Sweep for Handle { half_edge.deref(), next.start_vertex(), self.surface().deref(), - Some(self.color()), + self.color(), ) .sweep_with_cache(path, cache, objects); @@ -97,7 +97,7 @@ impl Sweep for Handle { surface: top_surface, exterior: exterior.unwrap(), interiors, - color: Some(self.color()), + color: self.color(), }; let top_face = top_face.build(objects).insert(objects); diff --git a/crates/fj-kernel/src/objects/full/face.rs b/crates/fj-kernel/src/objects/full/face.rs index f43c318fe..95738ca87 100644 --- a/crates/fj-kernel/src/objects/full/face.rs +++ b/crates/fj-kernel/src/objects/full/face.rs @@ -37,7 +37,7 @@ pub struct Face { surface: Handle, exterior: Handle, interiors: Vec>, - color: Color, + color: Option, } impl Face { @@ -46,7 +46,7 @@ impl Face { surface: Handle, exterior: Handle, interiors: impl IntoIterator>, - color: Color, + color: Option, ) -> Self { let interiors = interiors.into_iter().collect(); @@ -81,7 +81,7 @@ impl Face { } /// Access the color of the face - pub fn color(&self) -> Color { + pub fn color(&self) -> Option { self.color } diff --git a/crates/fj-kernel/src/partial/objects/face.rs b/crates/fj-kernel/src/partial/objects/face.rs index 8edb3035e..2de1bff7b 100644 --- a/crates/fj-kernel/src/partial/objects/face.rs +++ b/crates/fj-kernel/src/partial/objects/face.rs @@ -38,12 +38,12 @@ impl PartialObject for PartialFace { surface: face.surface().clone(), exterior: face.exterior().clone(), interiors: face.interiors().cloned().collect(), - color: Some(face.color()), + color: face.color(), } } fn build(self, _: &mut Service) -> Self::Full { - let color = self.color.unwrap_or_default(); + let color = self.color; Face::new(self.surface, self.exterior, self.interiors, color) } From 3f121977dd0c170a2446c8833cb417691edbaef4 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:07:19 +0100 Subject: [PATCH 17/36] Inline redundant variable --- crates/fj-kernel/src/partial/objects/face.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/fj-kernel/src/partial/objects/face.rs b/crates/fj-kernel/src/partial/objects/face.rs index 2de1bff7b..71e9c1185 100644 --- a/crates/fj-kernel/src/partial/objects/face.rs +++ b/crates/fj-kernel/src/partial/objects/face.rs @@ -43,8 +43,6 @@ impl PartialObject for PartialFace { } fn build(self, _: &mut Service) -> Self::Full { - let color = self.color; - - Face::new(self.surface, self.exterior, self.interiors, color) + Face::new(self.surface, self.exterior, self.interiors, self.color) } } From c840cc50033a1c6ccbfadeb52ec5544e847419c9 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:17:35 +0100 Subject: [PATCH 18/36] Avoid using `FaceBuilder` --- .../src/algorithms/intersect/curve_face.rs | 22 +++++++++---------- .../src/algorithms/triangulate/mod.rs | 20 ++++++++--------- crates/fj-kernel/src/validate/face.rs | 21 +++++++++--------- 3 files changed, 30 insertions(+), 33 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index e66dffaae..6b66a3f48 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -150,7 +150,7 @@ where #[cfg(test)] mod tests { use crate::{ - builder::{CycleBuilder, FaceBuilder}, + builder::CycleBuilder, geometry::curve::Curve, insert::Insert, objects::Cycle, @@ -182,7 +182,7 @@ mod tests { ]; let face = { - let mut face = PartialFace { + let face = PartialFace { surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) @@ -192,18 +192,16 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), + interiors: vec![{ + let (interior, _) = Cycle::new([]) + .update_as_polygon_from_points( + interior_points, + &mut services.objects, + ); + interior.insert(&mut services.objects) + }], color: None, }; - { - let (interior, _) = Cycle::new([]) - .update_as_polygon_from_points( - interior_points, - &mut services.objects, - ); - face.add_interior(interior, &mut services.objects); - } - face.build(&mut services.objects) }; diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index ad80fdc28..55e307692 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -79,7 +79,7 @@ mod tests { use crate::{ algorithms::approx::{Approx, Tolerance}, - builder::{CycleBuilder, FaceBuilder}, + builder::CycleBuilder, insert::Insert, objects::{Cycle, Face}, partial::{PartialFace, PartialObject}, @@ -146,7 +146,7 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); - let mut face = PartialFace { + let face = PartialFace { surface: surface.clone(), exterior: { let (exterior, _) = Cycle::new([]) @@ -156,16 +156,16 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), + interiors: vec![{ + let (interior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [e, f, g, h], + &mut services.objects, + ); + interior.insert(&mut services.objects) + }], color: None, }; - { - let (interior, _) = Cycle::new([]).update_as_polygon_from_points( - [e, f, g, h], - &mut services.objects, - ); - face.add_interior(interior, &mut services.objects); - } let face = face .build(&mut services.objects) .insert(&mut services.objects); diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index cc664a6ed..ab7a6dd38 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -72,7 +72,7 @@ impl FaceValidationError { mod tests { use crate::{ algorithms::reverse::Reverse, - builder::{CycleBuilder, FaceBuilder}, + builder::CycleBuilder, insert::Insert, objects::{Cycle, Face}, partial::{PartialFace, PartialObject}, @@ -85,7 +85,7 @@ mod tests { let mut services = Services::new(); let valid = { - let mut face = PartialFace { + let face = PartialFace { surface: services.objects.surfaces.xy_plane(), exterior: { let (exterior, _) = Cycle::new([]) @@ -95,17 +95,16 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), + interiors: vec![{ + let (interior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[1., 1.], [1., 2.], [2., 1.]], + &mut services.objects, + ); + interior.insert(&mut services.objects) + }], color: None, }; - { - let (interior, _) = Cycle::new([]) - .update_as_polygon_from_points( - [[1., 1.], [1., 2.], [2., 1.]], - &mut services.objects, - ); - face.add_interior(interior, &mut services.objects); - } face.build(&mut services.objects) }; let invalid = { From 525ee6555a8aac514380fafd2905d9a8b2041426 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:22:11 +0100 Subject: [PATCH 19/36] Remove unused `FaceBuilder::add_interior` --- crates/fj-kernel/src/builder/face.rs | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/crates/fj-kernel/src/builder/face.rs b/crates/fj-kernel/src/builder/face.rs index bcaf053a9..7913e2796 100644 --- a/crates/fj-kernel/src/builder/face.rs +++ b/crates/fj-kernel/src/builder/face.rs @@ -1,29 +1,9 @@ -use crate::{ - insert::Insert, - objects::{Cycle, Objects}, - partial::PartialFace, - services::Service, - storage::Handle, -}; +use crate::partial::PartialFace; /// Builder API for [`PartialFace`] pub trait FaceBuilder { - /// Add an interior cycle - fn add_interior( - &mut self, - cycle: Cycle, - objects: &mut Service, - ) -> Handle; + // No methods are currently defined. This trait serves as a placeholder, to + // make it clear where to add such methods, once necessary. } -impl FaceBuilder for PartialFace { - fn add_interior( - &mut self, - cycle: Cycle, - objects: &mut Service, - ) -> Handle { - let cycle = cycle.insert(objects); - self.interiors.push(cycle.clone()); - cycle - } -} +impl FaceBuilder for PartialFace {} From 7898820b243ac7268b3861ccab485d04c9e36f4a Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:33:03 +0100 Subject: [PATCH 20/36] Avoid using `PartialFace` in test code --- .../src/algorithms/intersect/curve_face.rs | 16 +-- .../src/algorithms/intersect/face_face.rs | 27 ++-- .../src/algorithms/intersect/face_point.rs | 131 ++++++++---------- .../src/algorithms/intersect/ray_face.rs | 97 ++++++------- .../src/algorithms/triangulate/mod.rs | 49 +++---- crates/fj-kernel/src/validate/face.rs | 14 +- 6 files changed, 146 insertions(+), 188 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index 6b66a3f48..ee8642bfa 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -153,8 +153,7 @@ mod tests { builder::CycleBuilder, geometry::curve::Curve, insert::Insert, - objects::Cycle, - partial::{PartialFace, PartialObject}, + objects::{Cycle, Face}, services::Services, }; @@ -182,9 +181,9 @@ mod tests { ]; let face = { - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( exterior_points, @@ -192,7 +191,7 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: vec![{ + vec![{ let (interior, _) = Cycle::new([]) .update_as_polygon_from_points( interior_points, @@ -200,9 +199,8 @@ mod tests { ); interior.insert(&mut services.objects) }], - color: None, - }; - face.build(&mut services.objects) + None, + ) }; let expected = diff --git a/crates/fj-kernel/src/algorithms/intersect/face_face.rs b/crates/fj-kernel/src/algorithms/intersect/face_face.rs index d74e114e5..24c426e3a 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_face.rs @@ -65,8 +65,7 @@ mod tests { builder::CycleBuilder, geometry::curve::Curve, insert::Insert, - objects::Cycle, - partial::{PartialFace, PartialObject}, + objects::{Cycle, Face}, services::Services, }; @@ -88,9 +87,9 @@ mod tests { services.objects.surfaces.xz_plane(), ] .map(|surface| { - let face = PartialFace { + Face::new( surface, - exterior: { + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( points, @@ -98,11 +97,9 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - - face.build(&mut services.objects) + Vec::new(), + None, + ) }); let intersection = FaceFaceIntersection::compute([&a, &b]); @@ -126,9 +123,9 @@ mod tests { services.objects.surfaces.xz_plane(), ]; let [a, b] = surfaces.clone().map(|surface| { - let face = PartialFace { + Face::new( surface, - exterior: { + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( points, @@ -136,11 +133,9 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - - face.build(&mut services.objects) + Vec::new(), + None, + ) }); let intersection = FaceFaceIntersection::compute([&a, &b]); diff --git a/crates/fj-kernel/src/algorithms/intersect/face_point.rs b/crates/fj-kernel/src/algorithms/intersect/face_point.rs index 8b5b43f27..fa657651c 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_point.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_point.rs @@ -140,8 +140,7 @@ mod tests { algorithms::intersect::{face_point::FacePointIntersection, Intersect}, builder::CycleBuilder, insert::Insert, - objects::Cycle, - partial::{PartialFace, PartialObject}, + objects::{Cycle, Face}, services::Services, }; @@ -149,9 +148,9 @@ mod tests { fn point_is_outside_face() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [1., 1.], [0., 2.]], @@ -159,13 +158,11 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + let face = face.insert(&mut services.objects); let point = Point::from([2., 1.]); let intersection = (&face, &point).intersect(); @@ -176,9 +173,9 @@ mod tests { fn ray_hits_vertex_while_passing_outside() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [2., 1.], [0., 2.]], @@ -186,12 +183,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -205,9 +200,9 @@ mod tests { fn ray_hits_vertex_at_cycle_seam() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[4., 2.], [0., 4.], [0., 0.]], @@ -215,13 +210,11 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + let face = face.insert(&mut services.objects); let point = Point::from([1., 2.]); let intersection = (&face, &point).intersect(); @@ -235,9 +228,9 @@ mod tests { fn ray_hits_vertex_while_staying_inside() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [2., 1.], [3., 0.], [3., 4.]], @@ -245,12 +238,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -264,9 +255,9 @@ mod tests { fn ray_hits_parallel_edge_and_leaves_face_at_vertex() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [2., 1.], [3., 1.], [0., 2.]], @@ -274,12 +265,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -293,9 +282,9 @@ mod tests { fn ray_hits_parallel_edge_and_does_not_leave_face_there() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [2., 1.], [3., 1.], [4., 0.], [4., 5.]], @@ -303,12 +292,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -322,9 +309,9 @@ mod tests { fn point_is_coincident_with_edge() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [2., 0.], [0., 1.]], @@ -332,12 +319,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let point = Point::from([1., 0.]); let intersection = (&face, &point).intersect(); @@ -357,9 +342,9 @@ mod tests { fn point_is_coincident_with_vertex() { let mut services = Services::new(); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [1., 0.], [0., 1.]], @@ -367,12 +352,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let point = Point::from([1., 0.]); let intersection = (&face, &point).intersect(); diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index ba44e9dd6..4b22f0a09 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -153,8 +153,7 @@ mod tests { }, builder::CycleBuilder, insert::Insert, - objects::Cycle, - partial::{PartialFace, PartialObject}, + objects::{Cycle, Face}, services::Services, }; @@ -164,9 +163,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.yz_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.yz_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -174,11 +173,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); let face = face - .build(&mut services.objects) .insert(&mut services.objects) .translate([-1., 0., 0.], &mut services.objects); @@ -191,9 +189,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.yz_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.yz_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -201,11 +199,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); let face = face - .build(&mut services.objects) .insert(&mut services.objects) .translate([1., 0., 0.], &mut services.objects); @@ -221,9 +218,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.yz_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.yz_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -231,11 +228,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); let face = face - .build(&mut services.objects) .insert(&mut services.objects) .translate([0., 0., 2.], &mut services.objects); @@ -248,9 +244,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.yz_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.yz_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -258,11 +254,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); let face = face - .build(&mut services.objects) .insert(&mut services.objects) .translate([1., 1., 0.], &mut services.objects); @@ -283,9 +278,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.yz_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.yz_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -293,11 +288,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); let face = face - .build(&mut services.objects) .insert(&mut services.objects) .translate([1., 1., 1.], &mut services.objects); @@ -321,9 +315,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -331,12 +325,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); assert_eq!( (&ray, &face).intersect(), @@ -350,9 +342,9 @@ mod tests { let ray = HorizontalRayToTheRight::from([0., 0., 0.]); - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[-1., -1.], [1., -1.], [1., 1.], [-1., 1.]], @@ -360,11 +352,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; + Vec::new(), + None, + ); let face = face - .build(&mut services.objects) .insert(&mut services.objects) .translate([0., 0., 1.], &mut services.objects); diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index 55e307692..9e9433bd6 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -82,7 +82,6 @@ mod tests { builder::CycleBuilder, insert::Insert, objects::{Cycle, Face}, - partial::{PartialFace, PartialObject}, services::Services, storage::Handle, }; @@ -98,9 +97,9 @@ mod tests { let c = [2., 2.]; let d = [0., 1.]; - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + let face = Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [a, b, c, d], @@ -108,12 +107,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let a = Point::from(a).to_xyz(); let b = Point::from(b).to_xyz(); @@ -146,9 +143,9 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); - let face = PartialFace { - surface: surface.clone(), - exterior: { + let face = Face::new( + surface.clone(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [a, b, c, d], @@ -156,7 +153,7 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: vec![{ + vec![{ let (interior, _) = Cycle::new([]) .update_as_polygon_from_points( [e, f, g, h], @@ -164,11 +161,9 @@ mod tests { ); interior.insert(&mut services.objects) }], - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + None, + ); + let face = face.insert(&mut services.objects); let triangles = triangulate(face)?; @@ -223,9 +218,9 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); - let face = PartialFace { - surface: surface.clone(), - exterior: { + let face = Face::new( + surface.clone(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [a, b, c, d, e], @@ -233,12 +228,10 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: Vec::new(), - color: None, - }; - let face = face - .build(&mut services.objects) - .insert(&mut services.objects); + Vec::new(), + None, + ); + let face = face.insert(&mut services.objects); let triangles = triangulate(face)?; diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index ab7a6dd38..c88611778 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -75,7 +75,6 @@ mod tests { builder::CycleBuilder, insert::Insert, objects::{Cycle, Face}, - partial::{PartialFace, PartialObject}, services::Services, validate::{FaceValidationError, Validate, ValidationError}, }; @@ -85,9 +84,9 @@ mod tests { let mut services = Services::new(); let valid = { - let face = PartialFace { - surface: services.objects.surfaces.xy_plane(), - exterior: { + Face::new( + services.objects.surfaces.xy_plane(), + { let (exterior, _) = Cycle::new([]) .update_as_polygon_from_points( [[0., 0.], [3., 0.], [0., 3.]], @@ -95,7 +94,7 @@ mod tests { ); exterior.insert(&mut services.objects) }, - interiors: vec![{ + vec![{ let (interior, _) = Cycle::new([]) .update_as_polygon_from_points( [[1., 1.], [1., 2.], [2., 1.]], @@ -103,9 +102,8 @@ mod tests { ); interior.insert(&mut services.objects) }], - color: None, - }; - face.build(&mut services.objects) + None, + ) }; let invalid = { let interiors = valid From dab6ec06aca53a4d663361d91d5af159e9d9098e Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:53:51 +0100 Subject: [PATCH 21/36] Remove redundant block --- .../src/algorithms/intersect/curve_face.rs | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index ee8642bfa..9910f6440 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -180,28 +180,26 @@ mod tests { [ 1., -1.], ]; - let face = { - Face::new( - services.objects.surfaces.xy_plane(), - { - let (exterior, _) = Cycle::new([]) - .update_as_polygon_from_points( - exterior_points, - &mut services.objects, - ); - exterior.insert(&mut services.objects) - }, - vec![{ - let (interior, _) = Cycle::new([]) - .update_as_polygon_from_points( - interior_points, - &mut services.objects, - ); - interior.insert(&mut services.objects) - }], - None, - ) - }; + let face = Face::new( + services.objects.surfaces.xy_plane(), + { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + exterior_points, + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + vec![{ + let (interior, _) = Cycle::new([]) + .update_as_polygon_from_points( + interior_points, + &mut services.objects, + ); + interior.insert(&mut services.objects) + }], + None, + ); let expected = CurveFaceIntersection::from_intervals([[[1.], [2.]], [[4.], [5.]]]); From 911376553297249c378c390e8a1dcf30153f23c8 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:56:24 +0100 Subject: [PATCH 22/36] Relax requirements of face-point intersection test --- .../fj-kernel/src/algorithms/intersect/face_point.rs | 12 +----------- .../fj-kernel/src/algorithms/intersect/ray_face.rs | 4 +++- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/face_point.rs b/crates/fj-kernel/src/algorithms/intersect/face_point.rs index fa657651c..80c669b90 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_point.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_point.rs @@ -12,7 +12,7 @@ use super::{ ray_segment::RaySegmentIntersection, HorizontalRayToTheRight, Intersect, }; -impl Intersect for (&Handle, &Point<2>) { +impl Intersect for (&Face, &Point<2>) { type Intersection = FacePointIntersection; fn intersect(self) -> Option { @@ -161,8 +161,6 @@ mod tests { Vec::new(), None, ); - - let face = face.insert(&mut services.objects); let point = Point::from([2., 1.]); let intersection = (&face, &point).intersect(); @@ -186,7 +184,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -213,8 +210,6 @@ mod tests { Vec::new(), None, ); - - let face = face.insert(&mut services.objects); let point = Point::from([1., 2.]); let intersection = (&face, &point).intersect(); @@ -241,7 +236,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -268,7 +262,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -295,7 +288,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let point = Point::from([1., 1.]); let intersection = (&face, &point).intersect(); @@ -322,7 +314,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let point = Point::from([1., 0.]); let intersection = (&face, &point).intersect(); @@ -355,7 +346,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let point = Point::from([1., 0.]); let intersection = (&face, &point).intersect(); diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index 4b22f0a09..0b5e14323 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -1,5 +1,7 @@ //! Intersection between a ray and a face, in 3D +use std::ops::Deref; + use fj_math::{Plane, Point, Scalar}; use crate::{ @@ -107,7 +109,7 @@ impl Intersect for (&HorizontalRayToTheRight<3>, &Handle) { } let point = Point::from([u, v]); - let intersection = match (face, &point).intersect()? { + let intersection = match (face.deref(), &point).intersect()? { FacePointIntersection::PointIsInsideFace => { RayFaceIntersection::RayHitsFace } From 252cc67dc83fd29bdef19ba2db5870be9752d5d0 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 13:59:38 +0100 Subject: [PATCH 23/36] Relax requirements of ray-face intersection test --- .../src/algorithms/intersect/ray_face.rs | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index 0b5e14323..67aff354d 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -13,7 +13,7 @@ use crate::{ use super::{HorizontalRayToTheRight, Intersect}; -impl Intersect for (&HorizontalRayToTheRight<3>, &Handle) { +impl Intersect for (&HorizontalRayToTheRight<3>, &Face) { type Intersection = RayFaceIntersection; fn intersect(self) -> Option { @@ -178,9 +178,7 @@ mod tests { Vec::new(), None, ); - let face = face - .insert(&mut services.objects) - .translate([-1., 0., 0.], &mut services.objects); + let face = face.translate([-1., 0., 0.], &mut services.objects); assert_eq!((&ray, &face).intersect(), None); } @@ -204,9 +202,7 @@ mod tests { Vec::new(), None, ); - let face = face - .insert(&mut services.objects) - .translate([1., 0., 0.], &mut services.objects); + let face = face.translate([1., 0., 0.], &mut services.objects); assert_eq!( (&ray, &face).intersect(), @@ -233,9 +229,7 @@ mod tests { Vec::new(), None, ); - let face = face - .insert(&mut services.objects) - .translate([0., 0., 2.], &mut services.objects); + let face = face.translate([0., 0., 2.], &mut services.objects); assert_eq!((&ray, &face).intersect(), None); } @@ -259,9 +253,7 @@ mod tests { Vec::new(), None, ); - let face = face - .insert(&mut services.objects) - .translate([1., 1., 0.], &mut services.objects); + let face = face.translate([1., 1., 0.], &mut services.objects); let edge = face .exterior() @@ -293,9 +285,7 @@ mod tests { Vec::new(), None, ); - let face = face - .insert(&mut services.objects) - .translate([1., 1., 1.], &mut services.objects); + let face = face.translate([1., 1., 1.], &mut services.objects); let vertex = face .exterior() @@ -330,7 +320,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); assert_eq!( (&ray, &face).intersect(), @@ -357,9 +346,7 @@ mod tests { Vec::new(), None, ); - let face = face - .insert(&mut services.objects) - .translate([0., 0., 1.], &mut services.objects); + let face = face.translate([0., 0., 1.], &mut services.objects); assert_eq!((&ray, &face).intersect(), None); } From dd07b8ef956339c2a7d1494983459b9e750a2e55 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:00:37 +0100 Subject: [PATCH 24/36] Remove redundant `deref` call --- crates/fj-kernel/src/algorithms/intersect/ray_face.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index 67aff354d..7cbeeb92a 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -1,7 +1,5 @@ //! Intersection between a ray and a face, in 3D -use std::ops::Deref; - use fj_math::{Plane, Point, Scalar}; use crate::{ @@ -109,7 +107,7 @@ impl Intersect for (&HorizontalRayToTheRight<3>, &Face) { } let point = Point::from([u, v]); - let intersection = match (face.deref(), &point).intersect()? { + let intersection = match (face, &point).intersect()? { FacePointIntersection::PointIsInsideFace => { RayFaceIntersection::RayHitsFace } From 6d3028e8bf2016706b96b85edcbdb8b275b9ae4b Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:02:37 +0100 Subject: [PATCH 25/36] Simplify test helper function --- crates/fj-kernel/src/algorithms/triangulate/mod.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index 9e9433bd6..bf3c67ce2 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -83,7 +83,6 @@ mod tests { insert::Insert, objects::{Cycle, Face}, services::Services, - storage::Handle, }; use super::Triangulate; @@ -110,7 +109,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let a = Point::from(a).to_xyz(); let b = Point::from(b).to_xyz(); @@ -163,7 +161,6 @@ mod tests { }], None, ); - let face = face.insert(&mut services.objects); let triangles = triangulate(face)?; @@ -231,7 +228,6 @@ mod tests { Vec::new(), None, ); - let face = face.insert(&mut services.objects); let triangles = triangulate(face)?; @@ -248,7 +244,7 @@ mod tests { Ok(()) } - fn triangulate(face: Handle) -> anyhow::Result>> { + fn triangulate(face: Face) -> anyhow::Result>> { let tolerance = Tolerance::from_scalar(Scalar::ONE)?; Ok(face.approx(tolerance).triangulate()) } From 0dc0f11ccb83f97518d6e879abd73113d90bd39a Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:03:22 +0100 Subject: [PATCH 26/36] Remove redundant block --- crates/fj-kernel/src/validate/face.rs | 42 +++++++++++++-------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index c88611778..3201e9612 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -83,28 +83,26 @@ mod tests { fn face_invalid_interior_winding() -> anyhow::Result<()> { let mut services = Services::new(); - let valid = { - Face::new( - services.objects.surfaces.xy_plane(), - { - let (exterior, _) = Cycle::new([]) - .update_as_polygon_from_points( - [[0., 0.], [3., 0.], [0., 3.]], - &mut services.objects, - ); - exterior.insert(&mut services.objects) - }, - vec![{ - let (interior, _) = Cycle::new([]) - .update_as_polygon_from_points( - [[1., 1.], [1., 2.], [2., 1.]], - &mut services.objects, - ); - interior.insert(&mut services.objects) - }], - None, - ) - }; + let valid = Face::new( + services.objects.surfaces.xy_plane(), + { + let (exterior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[0., 0.], [3., 0.], [0., 3.]], + &mut services.objects, + ); + exterior.insert(&mut services.objects) + }, + vec![{ + let (interior, _) = Cycle::new([]) + .update_as_polygon_from_points( + [[1., 1.], [1., 2.], [2., 1.]], + &mut services.objects, + ); + interior.insert(&mut services.objects) + }], + None, + ); let invalid = { let interiors = valid .interiors() From 0cb4ab402ef71a212e7cdd1d9dfce223d34d42dd Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:05:02 +0100 Subject: [PATCH 27/36] Avoid using `PartialFace` in edge sweep code --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index d79b03944..372e942f3 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -5,7 +5,6 @@ use crate::{ builder::{CycleBuilder, HalfEdgeBuilder}, insert::Insert, objects::{Cycle, Face, HalfEdge, Objects, Surface, Vertex}, - partial::{PartialFace, PartialObject}, services::Service, storage::Handle, }; @@ -102,17 +101,16 @@ impl Sweep for (&HalfEdge, &Handle, &Surface, Option) { half_edge }); - let face = PartialFace { - surface: (edge.curve(), surface) - .sweep_with_cache(path, cache, objects), - exterior: exterior.unwrap().insert(objects), - interiors: Vec::new(), + let face = Face::new( + (edge.curve(), surface).sweep_with_cache(path, cache, objects), + exterior.unwrap().insert(objects), + Vec::new(), color, - }; + ); // And we're done creating the face! All that's left to do is build our // return values. - let face = face.build(objects).insert(objects); + let face = face.insert(objects); (face, edge_top) } } From 83269f2195f262bd7a96b521f13b9615856a888b Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:06:01 +0100 Subject: [PATCH 28/36] Avoid using `PartialFace` in face sweep code --- crates/fj-kernel/src/algorithms/sweep/face.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index 31cb997d0..b910c8bdb 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -9,7 +9,7 @@ use crate::{ geometry::curve::GlobalPath, insert::Insert, objects::{Cycle, Face, Objects, Shell}, - partial::{Partial, PartialFace, PartialObject, PartialShell}, + partial::{Partial, PartialObject, PartialShell}, services::Service, storage::Handle, }; @@ -93,14 +93,10 @@ impl Sweep for Handle { }; } - let top_face = PartialFace { - surface: top_surface, - exterior: exterior.unwrap(), - interiors, - color: self.color(), - }; + let top_face = + Face::new(top_surface, exterior.unwrap(), interiors, self.color()); - let top_face = top_face.build(objects).insert(objects); + let top_face = top_face.insert(objects); faces.push(top_face); let faces = faces.into_iter().map(Partial::from).collect(); From 53ccc2918782499c52cb7772d4bf453396b970ea Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:06:57 +0100 Subject: [PATCH 29/36] Switch `FaceBuilder` implementation to `Face` --- crates/fj-kernel/src/builder/face.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/fj-kernel/src/builder/face.rs b/crates/fj-kernel/src/builder/face.rs index 7913e2796..ca70ce008 100644 --- a/crates/fj-kernel/src/builder/face.rs +++ b/crates/fj-kernel/src/builder/face.rs @@ -1,9 +1,9 @@ -use crate::partial::PartialFace; +use crate::objects::Face; -/// Builder API for [`PartialFace`] +/// Builder API for [`Face`] pub trait FaceBuilder { // No methods are currently defined. This trait serves as a placeholder, to // make it clear where to add such methods, once necessary. } -impl FaceBuilder for PartialFace {} +impl FaceBuilder for Face {} From 4a20c1f225c3dd2d5d3548fa000747464d08c98b Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:09:24 +0100 Subject: [PATCH 30/36] Use `Handle` in `PartialSketch` --- crates/fj-kernel/src/partial/objects/sketch.rs | 17 +++++++---------- crates/fj-operations/src/difference_2d.rs | 2 +- crates/fj-operations/src/sketch.rs | 4 ++-- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/crates/fj-kernel/src/partial/objects/sketch.rs b/crates/fj-kernel/src/partial/objects/sketch.rs index 74066ce33..d746654d5 100644 --- a/crates/fj-kernel/src/partial/objects/sketch.rs +++ b/crates/fj-kernel/src/partial/objects/sketch.rs @@ -1,14 +1,15 @@ use crate::{ objects::{Face, Objects, Sketch}, - partial::{FullToPartialCache, Partial, PartialObject}, + partial::{FullToPartialCache, PartialObject}, services::Service, + storage::Handle, }; /// A partial [`Sketch`] #[derive(Clone, Debug)] pub struct PartialSketch { /// The faces that make up the sketch - pub faces: Vec>, + pub faces: Vec>, } impl PartialObject for PartialSketch { @@ -18,18 +19,14 @@ impl PartialObject for PartialSketch { Self { faces: Vec::new() } } - fn from_full(sketch: &Self::Full, cache: &mut FullToPartialCache) -> Self { + fn from_full(sketch: &Self::Full, _: &mut FullToPartialCache) -> Self { Self { - faces: sketch - .faces() - .into_iter() - .map(|face| Partial::from_full(face.clone(), cache)) - .collect(), + faces: sketch.faces().into_iter().cloned().collect(), } } - fn build(self, objects: &mut Service) -> Self::Full { - let faces = self.faces.into_iter().map(|face| face.build(objects)); + fn build(self, _: &mut Service) -> Self::Full { + let faces = self.faces; Sketch::new(faces) } } diff --git a/crates/fj-operations/src/difference_2d.rs b/crates/fj-operations/src/difference_2d.rs index a4b079343..aca7319f2 100644 --- a/crates/fj-operations/src/difference_2d.rs +++ b/crates/fj-operations/src/difference_2d.rs @@ -84,7 +84,7 @@ impl Shape for fj::Difference2d { interiors, color: Some(Color(self.color())), }; - faces.push(Partial::from_partial(face)); + faces.push(Partial::from_partial(face).build(objects)); } let difference = PartialSketch { faces }.build(objects).insert(objects); diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 70bd4496e..b42e9ca4d 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -5,7 +5,7 @@ use fj_kernel::{ builder::{CycleBuilder, HalfEdgeBuilder}, insert::Insert, objects::{Cycle, Objects, Sketch}, - partial::{Partial, PartialFace, PartialObject, PartialSketch}, + partial::{PartialFace, PartialObject, PartialSketch}, services::Service, }; use fj_math::{Aabb, Point}; @@ -86,7 +86,7 @@ impl Shape for fj::Sketch { }; let sketch = PartialSketch { - faces: vec![Partial::from_partial(face)], + faces: vec![face.build(objects).insert(objects)], } .build(objects) .insert(objects); From 42426069d1b8c38267e3863c5fde281345eb866a Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:24:47 +0100 Subject: [PATCH 31/36] Inline redundant variable --- crates/fj-kernel/src/partial/objects/sketch.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/partial/objects/sketch.rs b/crates/fj-kernel/src/partial/objects/sketch.rs index d746654d5..f6e612697 100644 --- a/crates/fj-kernel/src/partial/objects/sketch.rs +++ b/crates/fj-kernel/src/partial/objects/sketch.rs @@ -26,7 +26,6 @@ impl PartialObject for PartialSketch { } fn build(self, _: &mut Service) -> Self::Full { - let faces = self.faces; - Sketch::new(faces) + Sketch::new(self.faces) } } From 830fc9c843349cb98b6f64d4c7a4e19b69a6c48f Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:10:38 +0100 Subject: [PATCH 32/36] Replace use of `PartialFace` --- crates/fj-operations/src/difference_2d.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/fj-operations/src/difference_2d.rs b/crates/fj-operations/src/difference_2d.rs index aca7319f2..45cdc37b6 100644 --- a/crates/fj-operations/src/difference_2d.rs +++ b/crates/fj-operations/src/difference_2d.rs @@ -4,8 +4,8 @@ use fj_interop::{debug::DebugInfo, ext::ArrayExt, mesh::Color}; use fj_kernel::{ algorithms::reverse::Reverse, insert::Insert, - objects::{Objects, Sketch}, - partial::{Partial, PartialFace, PartialObject, PartialSketch}, + objects::{Face, Objects, Sketch}, + partial::{PartialObject, PartialSketch}, services::Service, }; use fj_math::Aabb; @@ -78,13 +78,13 @@ impl Shape for fj::Difference2d { "Can't construct face with multiple exteriors" ); - let face = PartialFace { - surface: surface.clone(), + let face = Face::new( + surface.clone(), exterior, interiors, - color: Some(Color(self.color())), - }; - faces.push(Partial::from_partial(face).build(objects)); + Some(Color(self.color())), + ); + faces.push(face.insert(objects)); } let difference = PartialSketch { faces }.build(objects).insert(objects); From d0b0fd7559e670f8b37f489a027514ba58893417 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:18:30 +0100 Subject: [PATCH 33/36] Replace use of `PartialFace` --- crates/fj-operations/src/sketch.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index b42e9ca4d..967b0d76c 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -4,8 +4,8 @@ use fj_interop::{debug::DebugInfo, mesh::Color}; use fj_kernel::{ builder::{CycleBuilder, HalfEdgeBuilder}, insert::Insert, - objects::{Cycle, Objects, Sketch}, - partial::{PartialFace, PartialObject, PartialSketch}, + objects::{Cycle, Face, Objects, Sketch}, + partial::{PartialObject, PartialSketch}, services::Service, }; use fj_math::{Aabb, Point}; @@ -30,12 +30,12 @@ impl Shape for fj::Sketch { .insert(objects); let exterior = Cycle::new([half_edge]).insert(objects); - PartialFace { + Face::new( surface, exterior, - interiors: Vec::new(), - color: Some(Color(self.color())), - } + Vec::new(), + Some(Color(self.color())), + ) } fj::Chain::PolyChain(poly_chain) => { let segments = poly_chain.to_segments(); @@ -76,17 +76,17 @@ impl Shape for fj::Sketch { cycle.insert(objects) }; - PartialFace { + Face::new( surface, exterior, - interiors: Vec::new(), - color: Some(Color(self.color())), - } + Vec::new(), + Some(Color(self.color())), + ) } }; let sketch = PartialSketch { - faces: vec![face.build(objects).insert(objects)], + faces: vec![face.insert(objects)], } .build(objects) .insert(objects); From 2b28f6f3712bbb3146c8dd286886de7cf6255ef8 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:22:19 +0100 Subject: [PATCH 34/36] Use `Handle` in `PartialShell` --- crates/fj-kernel/src/algorithms/sweep/face.rs | 3 +-- crates/fj-kernel/src/partial/objects/shell.rs | 17 +++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index b910c8bdb..1145c410a 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -9,7 +9,7 @@ use crate::{ geometry::curve::GlobalPath, insert::Insert, objects::{Cycle, Face, Objects, Shell}, - partial::{Partial, PartialObject, PartialShell}, + partial::{PartialObject, PartialShell}, services::Service, storage::Handle, }; @@ -99,7 +99,6 @@ impl Sweep for Handle { let top_face = top_face.insert(objects); faces.push(top_face); - let faces = faces.into_iter().map(Partial::from).collect(); PartialShell { faces }.build(objects).insert(objects) } } diff --git a/crates/fj-kernel/src/partial/objects/shell.rs b/crates/fj-kernel/src/partial/objects/shell.rs index b7f3fcc1d..8d9ed0ac2 100644 --- a/crates/fj-kernel/src/partial/objects/shell.rs +++ b/crates/fj-kernel/src/partial/objects/shell.rs @@ -1,14 +1,15 @@ use crate::{ objects::{Face, Objects, Shell}, - partial::{FullToPartialCache, Partial, PartialObject}, + partial::{FullToPartialCache, PartialObject}, services::Service, + storage::Handle, }; /// A partial [`Shell`] #[derive(Clone, Debug)] pub struct PartialShell { /// The faces that make up the shell - pub faces: Vec>, + pub faces: Vec>, } impl PartialObject for PartialShell { @@ -18,18 +19,14 @@ impl PartialObject for PartialShell { Self { faces: Vec::new() } } - fn from_full(shell: &Self::Full, cache: &mut FullToPartialCache) -> Self { + fn from_full(shell: &Self::Full, _: &mut FullToPartialCache) -> Self { Self { - faces: shell - .faces() - .into_iter() - .map(|face| Partial::from_full(face.clone(), cache)) - .collect(), + faces: shell.faces().into_iter().cloned().collect(), } } - fn build(self, objects: &mut Service) -> Self::Full { - let faces = self.faces.into_iter().map(|face| face.build(objects)); + fn build(self, _: &mut Service) -> Self::Full { + let faces = self.faces; Shell::new(faces) } } From 94454df3455dffb461ba698d7c849e3e4677d584 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:23:02 +0100 Subject: [PATCH 35/36] Inline redundant variable --- crates/fj-kernel/src/partial/objects/shell.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/fj-kernel/src/partial/objects/shell.rs b/crates/fj-kernel/src/partial/objects/shell.rs index 8d9ed0ac2..385fd6206 100644 --- a/crates/fj-kernel/src/partial/objects/shell.rs +++ b/crates/fj-kernel/src/partial/objects/shell.rs @@ -26,7 +26,6 @@ impl PartialObject for PartialShell { } fn build(self, _: &mut Service) -> Self::Full { - let faces = self.faces; - Shell::new(faces) + Shell::new(self.faces) } } From 026846c6ee5f37abd3ab6963ec5f65b53dbaeb96 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 15 Mar 2023 14:23:41 +0100 Subject: [PATCH 36/36] Remove `PartialFace` --- crates/fj-kernel/src/partial/mod.rs | 3 +- crates/fj-kernel/src/partial/objects/face.rs | 48 -------------------- crates/fj-kernel/src/partial/objects/mod.rs | 1 - crates/fj-kernel/src/partial/traits.rs | 1 - 4 files changed, 1 insertion(+), 52 deletions(-) delete mode 100644 crates/fj-kernel/src/partial/objects/face.rs diff --git a/crates/fj-kernel/src/partial/mod.rs b/crates/fj-kernel/src/partial/mod.rs index 461c07594..abe19bd5f 100644 --- a/crates/fj-kernel/src/partial/mod.rs +++ b/crates/fj-kernel/src/partial/mod.rs @@ -16,8 +16,7 @@ mod wrapper; pub use self::{ objects::{ - face::PartialFace, shell::PartialShell, sketch::PartialSketch, - solid::PartialSolid, + shell::PartialShell, sketch::PartialSketch, solid::PartialSolid, }, traits::{HasPartial, PartialObject}, wrapper::{FullToPartialCache, Partial}, diff --git a/crates/fj-kernel/src/partial/objects/face.rs b/crates/fj-kernel/src/partial/objects/face.rs deleted file mode 100644 index 71e9c1185..000000000 --- a/crates/fj-kernel/src/partial/objects/face.rs +++ /dev/null @@ -1,48 +0,0 @@ -use fj_interop::mesh::Color; - -use crate::{ - objects::{Cycle, Face, Objects, Surface}, - partial::{FullToPartialCache, PartialObject}, - services::Service, - storage::Handle, -}; - -/// A partial [`Face`] -#[derive(Clone, Debug)] -pub struct PartialFace { - /// The surface that the face is defined in - pub surface: Handle, - - /// The cycle that bounds the face on the outside - pub exterior: Handle, - - /// The cycles that bound the face on the inside - /// - /// Each of these cycles defines a hole in the face. - pub interiors: Vec>, - - /// The color of the face - pub color: Option, -} - -impl PartialObject for PartialFace { - type Full = Face; - - fn new(_: &mut Service) -> Self { - // `PartialFace` is being phased out, and this method is no longer used. - unreachable!() - } - - fn from_full(face: &Self::Full, _: &mut FullToPartialCache) -> Self { - Self { - surface: face.surface().clone(), - exterior: face.exterior().clone(), - interiors: face.interiors().cloned().collect(), - color: face.color(), - } - } - - fn build(self, _: &mut Service) -> Self::Full { - Face::new(self.surface, self.exterior, self.interiors, self.color) - } -} diff --git a/crates/fj-kernel/src/partial/objects/mod.rs b/crates/fj-kernel/src/partial/objects/mod.rs index 2136df99c..24dc72ba8 100644 --- a/crates/fj-kernel/src/partial/objects/mod.rs +++ b/crates/fj-kernel/src/partial/objects/mod.rs @@ -1,4 +1,3 @@ -pub mod face; pub mod shell; pub mod sketch; pub mod solid; diff --git a/crates/fj-kernel/src/partial/traits.rs b/crates/fj-kernel/src/partial/traits.rs index 0b824b48b..61e8b4272 100644 --- a/crates/fj-kernel/src/partial/traits.rs +++ b/crates/fj-kernel/src/partial/traits.rs @@ -36,7 +36,6 @@ macro_rules! impl_trait { } impl_trait!( - Face, PartialFace; Shell, PartialShell; Sketch, PartialSketch; Solid, PartialSolid;