diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs index de42b5e60..92677c73e 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_face.rs @@ -184,10 +184,9 @@ mod tests { let face = { let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior .write() .update_as_polygon_from_points(exterior); diff --git a/crates/fj-kernel/src/algorithms/intersect/face_face.rs b/crates/fj-kernel/src/algorithms/intersect/face_face.rs index 904f62630..30b9b2460 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_face.rs @@ -94,10 +94,9 @@ mod tests { ] .map(|surface| { let mut face = PartialFace { - surface: Partial::from(surface.clone()), + surface: Partial::from(surface), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface); face.exterior.write().update_as_polygon_from_points(points); face.build(&mut services.objects) @@ -126,10 +125,9 @@ mod tests { ]; let [a, b] = surfaces.clone().map(|surface| { let mut face = PartialFace { - surface: Partial::from(surface.clone()), + surface: Partial::from(surface), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface); face.exterior.write().update_as_polygon_from_points(points); 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 a44ca8c07..f5c94620e 100644 --- a/crates/fj-kernel/src/algorithms/intersect/face_point.rs +++ b/crates/fj-kernel/src/algorithms/intersect/face_point.rs @@ -151,10 +151,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [1., 1.], @@ -176,10 +175,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [2., 1.], @@ -204,10 +202,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [4., 2.], [0., 4.], @@ -232,10 +229,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [2., 1.], @@ -261,10 +257,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [2., 1.], @@ -290,10 +285,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [2., 1.], @@ -320,10 +314,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [2., 0.], @@ -357,10 +350,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [0., 0.], [1., 0.], diff --git a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs index 44269fbdf..2cfc93d03 100644 --- a/crates/fj-kernel/src/algorithms/intersect/ray_face.rs +++ b/crates/fj-kernel/src/algorithms/intersect/ray_face.rs @@ -166,10 +166,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.yz_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], @@ -193,10 +192,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.yz_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], @@ -223,10 +221,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.yz_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], @@ -250,10 +247,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.yz_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], @@ -288,10 +284,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.yz_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], @@ -326,10 +321,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], @@ -355,10 +349,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior.write().update_as_polygon_from_points([ [-1., -1.], [1., -1.], diff --git a/crates/fj-kernel/src/algorithms/reverse/cycle.rs b/crates/fj-kernel/src/algorithms/reverse/cycle.rs index fd08da75a..23f517430 100644 --- a/crates/fj-kernel/src/algorithms/reverse/cycle.rs +++ b/crates/fj-kernel/src/algorithms/reverse/cycle.rs @@ -17,6 +17,6 @@ impl Reverse for Handle { edges.reverse(); - Cycle::new(self.surface().clone(), edges).insert(objects) + Cycle::new(edges).insert(objects) } } diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index ca25066c7..a82c1a4f3 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -38,8 +38,7 @@ impl Sweep for (Handle, &Surface, Color) { (edge.curve().clone(), surface) .sweep_with_cache(path, cache, objects), ); - face.surface = surface.clone(); - face.exterior.write().surface = surface; + face.surface = surface; } // Now we're ready to create the edges. @@ -270,7 +269,6 @@ mod tests { }; let mut cycle = PartialCycle { - surface: Partial::from(surface.clone()), ..Default::default() }; cycle.half_edges.extend( diff --git a/crates/fj-kernel/src/algorithms/sweep/face.rs b/crates/fj-kernel/src/algorithms/sweep/face.rs index 51731cbc5..d55d0337a 100644 --- a/crates/fj-kernel/src/algorithms/sweep/face.rs +++ b/crates/fj-kernel/src/algorithms/sweep/face.rs @@ -83,8 +83,6 @@ impl Sweep for Handle { top_edges.push(Partial::from(top_edge)); } - top_cycle.write().surface = Partial::from(top_surface.clone()); - top_cycle .write() .connect_to_closed_edges(top_edges, &top_surface.geometry()); @@ -165,8 +163,6 @@ mod tests { let mut face = sketch.add_face(); face.write().surface = Partial::from(surface.clone()); - face.write().exterior.write().surface = - Partial::from(surface.clone()); face.write() .exterior .write() @@ -185,7 +181,6 @@ mod tests { ..Default::default() }; - bottom.exterior.write().surface = Partial::from(surface.clone()); bottom .exterior .write() @@ -200,11 +195,10 @@ mod tests { let surface = surface.clone().translate(UP, &mut services.objects); let mut top = PartialFace { - surface: Partial::from(surface.clone()), + surface: Partial::from(surface), ..Default::default() }; - top.exterior.write().surface = Partial::from(surface); top.exterior.write().update_as_polygon_from_points(TRIANGLE); top.build(&mut services.objects) @@ -246,8 +240,6 @@ mod tests { let mut face = sketch.add_face(); face.write().surface = Partial::from(surface.clone()); - face.write().exterior.write().surface = - Partial::from(surface.clone()); face.write() .exterior .write() @@ -265,11 +257,10 @@ mod tests { surface.clone().translate(DOWN, &mut services.objects); let mut bottom = PartialFace { - surface: Partial::from(surface.clone()), + surface: Partial::from(surface), ..Default::default() }; - bottom.exterior.write().surface = Partial::from(surface); bottom .exterior .write() @@ -286,7 +277,6 @@ mod tests { ..Default::default() }; - top.exterior.write().surface = Partial::from(surface.clone()); top.exterior.write().update_as_polygon_from_points(TRIANGLE); top.build(&mut services.objects) diff --git a/crates/fj-kernel/src/algorithms/transform/cycle.rs b/crates/fj-kernel/src/algorithms/transform/cycle.rs index e56793752..5fbc6eb32 100644 --- a/crates/fj-kernel/src/algorithms/transform/cycle.rs +++ b/crates/fj-kernel/src/algorithms/transform/cycle.rs @@ -14,16 +14,12 @@ impl TransformObject for Cycle { objects: &mut Service, cache: &mut TransformCache, ) -> Self { - let surface = self - .surface() - .clone() - .transform_with_cache(transform, objects, cache); let half_edges = self.half_edges().map(|half_edge| { half_edge .clone() .transform_with_cache(transform, objects, cache) }); - Self::new(surface, half_edges) + Self::new(half_edges) } } diff --git a/crates/fj-kernel/src/algorithms/triangulate/mod.rs b/crates/fj-kernel/src/algorithms/triangulate/mod.rs index 87d29de38..41b17b606 100644 --- a/crates/fj-kernel/src/algorithms/triangulate/mod.rs +++ b/crates/fj-kernel/src/algorithms/triangulate/mod.rs @@ -99,10 +99,9 @@ mod tests { let surface = Partial::from(services.objects.surfaces.xy_plane()); let mut face = PartialFace { - surface: surface.clone(), + surface, ..Default::default() }; - face.exterior.write().surface = surface; face.exterior .write() .update_as_polygon_from_points([a, b, c, d]); @@ -144,7 +143,6 @@ mod tests { surface: Partial::from(surface.clone()), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface.clone()); face.exterior .write() .update_as_polygon_from_points([a, b, c, d]); @@ -211,7 +209,6 @@ mod tests { surface: Partial::from(surface.clone()), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface.clone()); face.exterior .write() .update_as_polygon_from_points([a, b, c, d, e]); diff --git a/crates/fj-kernel/src/builder/face.rs b/crates/fj-kernel/src/builder/face.rs index 173a45986..9514b6984 100644 --- a/crates/fj-kernel/src/builder/face.rs +++ b/crates/fj-kernel/src/builder/face.rs @@ -34,7 +34,6 @@ pub trait FaceBuilder { impl FaceBuilder for PartialFace { fn add_interior(&mut self) -> Partial { let cycle = Partial::from_partial(PartialCycle { - surface: self.exterior.read().surface.clone(), ..Default::default() }); self.interiors.push(cycle.clone()); diff --git a/crates/fj-kernel/src/objects/full/cycle.rs b/crates/fj-kernel/src/objects/full/cycle.rs index 5fdfb4a4a..a8f429553 100644 --- a/crates/fj-kernel/src/objects/full/cycle.rs +++ b/crates/fj-kernel/src/objects/full/cycle.rs @@ -3,16 +3,11 @@ use std::slice; use fj_interop::ext::SliceExt; use fj_math::{Scalar, Winding}; -use crate::{ - geometry::path::SurfacePath, - objects::{HalfEdge, Surface}, - storage::Handle, -}; +use crate::{geometry::path::SurfacePath, objects::HalfEdge, storage::Handle}; /// A cycle of connected half-edges #[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)] pub struct Cycle { - surface: Handle, half_edges: Vec>, } @@ -22,10 +17,7 @@ impl Cycle { /// # Panics /// /// Panics, if `half_edges` does not yield at least one half-edge. - pub fn new( - surface: Handle, - half_edges: impl IntoIterator>, - ) -> Self { + pub fn new(half_edges: impl IntoIterator>) -> Self { let half_edges = half_edges.into_iter().collect::>(); // This is not a validation check, and thus not part of the validation @@ -37,15 +29,7 @@ impl Cycle { "Cycle must contain at least one half-edge" ); - Self { - surface, - half_edges, - } - } - - /// Access the surface that the cycle is in - pub fn surface(&self) -> &Handle { - &self.surface + Self { half_edges } } /// Access the half-edges that make up the cycle diff --git a/crates/fj-kernel/src/partial/objects/cycle.rs b/crates/fj-kernel/src/partial/objects/cycle.rs index b7ee51cf6..7718f52ad 100644 --- a/crates/fj-kernel/src/partial/objects/cycle.rs +++ b/crates/fj-kernel/src/partial/objects/cycle.rs @@ -1,5 +1,5 @@ use crate::{ - objects::{Cycle, HalfEdge, Objects, Surface}, + objects::{Cycle, HalfEdge, Objects}, partial::{FullToPartialCache, Partial, PartialObject}, services::Service, }; @@ -7,9 +7,6 @@ use crate::{ /// A partial [`Cycle`] #[derive(Clone, Debug, Default)] pub struct PartialCycle { - /// The surface that the cycle is defined in - pub surface: Partial, - /// The half-edges that make up the cycle pub half_edges: Vec>, } @@ -19,7 +16,6 @@ impl PartialObject for PartialCycle { fn from_full(cycle: &Self::Full, cache: &mut FullToPartialCache) -> Self { Self { - surface: Partial::from_full(cycle.surface().clone(), cache), half_edges: cycle .half_edges() .cloned() @@ -29,12 +25,11 @@ impl PartialObject for PartialCycle { } fn build(self, objects: &mut Service) -> Self::Full { - let surface = self.surface.build(objects); let half_edges = self .half_edges .into_iter() .map(|half_edge| half_edge.build(objects)); - Cycle::new(surface, half_edges) + Cycle::new(half_edges) } } diff --git a/crates/fj-kernel/src/validate/cycle.rs b/crates/fj-kernel/src/validate/cycle.rs index 48b36bb37..5d7c3c76d 100644 --- a/crates/fj-kernel/src/validate/cycle.rs +++ b/crates/fj-kernel/src/validate/cycle.rs @@ -148,7 +148,6 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let mut cycle = PartialCycle { - surface: Partial::from(surface.clone()), ..Default::default() }; cycle.update_as_polygon_from_points([[0., 0.], [1., 0.], [0., 1.]]); @@ -175,7 +174,7 @@ mod tests { .into_iter() .map(|half_edge| half_edge.build(&mut services.objects)); - Cycle::new(valid.surface().clone(), half_edges) + Cycle::new(half_edges) }; valid.validate_and_return_first_error()?; @@ -192,7 +191,6 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let mut cycle = PartialCycle { - surface: Partial::from(surface.clone()), ..Default::default() }; cycle.update_as_polygon_from_points([[0., 0.], [1., 0.], [0., 1.]]); @@ -214,7 +212,7 @@ mod tests { .into_iter() .map(|half_edge| half_edge.build(&mut services.objects)); - Cycle::new(valid.surface().clone(), half_edges) + Cycle::new(half_edges) }; valid.validate_and_return_first_error()?; diff --git a/crates/fj-kernel/src/validate/face.rs b/crates/fj-kernel/src/validate/face.rs index 24f193338..883d9d6c5 100644 --- a/crates/fj-kernel/src/validate/face.rs +++ b/crates/fj-kernel/src/validate/face.rs @@ -13,7 +13,6 @@ impl Validate for Face { config: &ValidationConfig, errors: &mut Vec, ) { - FaceValidationError::check_surface_identity(self, errors); FaceValidationError::check_interior_winding(self, errors); FaceValidationError::check_vertex_positions(self, config, errors); } @@ -87,23 +86,6 @@ pub enum FaceValidationError { } impl FaceValidationError { - fn check_surface_identity(face: &Face, errors: &mut Vec) { - let surface = face.surface(); - - for interior in face.interiors() { - if surface.id() != interior.surface().id() { - errors.push( - Box::new(Self::SurfaceMismatch { - surface: surface.clone(), - interior: interior.clone(), - face: face.clone(), - }) - .into(), - ); - } - } - } - fn check_interior_winding(face: &Face, errors: &mut Vec) { let exterior_winding = face.exterior().winding(); @@ -182,10 +164,9 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let mut face = PartialFace { - surface: Partial::from(surface.clone()), + surface: Partial::from(surface), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface); face.exterior.write().update_as_polygon_from_points([ [0., 0.], [3., 0.], @@ -203,7 +184,6 @@ mod tests { let surface = services.objects.surfaces.xz_plane(); let mut cycle = PartialCycle { - surface: Partial::from(surface.clone()), ..Default::default() }; cycle.update_as_polygon_from_points([[1., 1.], [1., 2.], [2., 1.]]); @@ -235,10 +215,9 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let mut face = PartialFace { - surface: Partial::from(surface.clone()), + surface: Partial::from(surface), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface); face.exterior.write().update_as_polygon_from_points([ [0., 0.], [3., 0.], @@ -283,7 +262,6 @@ mod tests { surface: Partial::from(surface.clone()), ..Default::default() }; - face.exterior.write().surface = Partial::from(surface.clone()); let mut half_edge = face.exterior.write().add_half_edge(); half_edge.write().update_as_circle_from_radius(1.); @@ -326,8 +304,8 @@ mod tests { .insert(&mut services.objects) }; - let exterior = Cycle::new(valid.surface().clone(), [half_edge]) - .insert(&mut services.objects); + let exterior = + Cycle::new([half_edge]).insert(&mut services.objects); Face::new( valid.surface().clone(), diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 83dec0e28..1e223a917 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -37,7 +37,6 @@ impl Shape for fj::Sketch { }; let exterior = { let mut cycle = PartialCycle { - surface: surface.clone(), ..Default::default() }; cycle.half_edges.push(half_edge); @@ -60,7 +59,6 @@ impl Shape for fj::Sketch { let exterior = { let mut cycle = PartialCycle { - surface: Partial::from(surface.clone()), ..Default::default() }; let mut line_segments = vec![];