From 61f246213fd3df76277601d9e705cfc6a8a2f9bd Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Wed, 27 Mar 2024 13:30:27 +0100 Subject: [PATCH] Provide surface to `Cycle::winding` --- crates/fj-core/src/operations/sweep/sketch.rs | 2 +- crates/fj-core/src/topology/objects/cycle.rs | 4 +++- crates/fj-core/src/topology/objects/face.rs | 2 +- crates/fj-core/src/validate/sketch.rs | 6 ++++-- crates/fj-core/src/validation/checks/face_winding.rs | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/crates/fj-core/src/operations/sweep/sketch.rs b/crates/fj-core/src/operations/sweep/sketch.rs index 446fa1a90..e2888db5a 100644 --- a/crates/fj-core/src/operations/sweep/sketch.rs +++ b/crates/fj-core/src/operations/sweep/sketch.rs @@ -42,7 +42,7 @@ impl SweepSketch for Sketch { // clockwise. Let's check that real quick. assert!(region .exterior() - .winding(&core.layers.geometry) + .winding(&core.layers.geometry, self.surface()) .is_ccw()); let is_negative_sweep = { diff --git a/crates/fj-core/src/topology/objects/cycle.rs b/crates/fj-core/src/topology/objects/cycle.rs index ea55d8f8f..032a3e4b8 100644 --- a/crates/fj-core/src/topology/objects/cycle.rs +++ b/crates/fj-core/src/topology/objects/cycle.rs @@ -6,6 +6,8 @@ use crate::{ topology::{HalfEdge, ObjectSet}, }; +use super::surface::Surface; + /// A cycle of connected edges #[derive(Clone, Debug)] pub struct Cycle { @@ -29,7 +31,7 @@ impl Cycle { /// Please note that this is not *the* winding of the cycle, only one of the /// two possible windings, depending on the direction you look at the /// surface that the cycle is defined on from. - pub fn winding(&self, geometry: &Geometry) -> Winding { + pub fn winding(&self, geometry: &Geometry, _: &Handle) -> Winding { // The cycle could be made up of one or two circles. If that is the // case, the winding of the cycle is determined by the winding of the // first circle. diff --git a/crates/fj-core/src/topology/objects/face.rs b/crates/fj-core/src/topology/objects/face.rs index 919d635bf..e1e6ab883 100644 --- a/crates/fj-core/src/topology/objects/face.rs +++ b/crates/fj-core/src/topology/objects/face.rs @@ -63,7 +63,7 @@ impl Face { /// back sides. The front side is the side, where the face's exterior cycle /// is wound counter-clockwise. pub fn coord_handedness(&self, geometry: &Geometry) -> Handedness { - match self.region.exterior().winding(geometry) { + match self.region.exterior().winding(geometry, self.surface()) { Winding::Ccw => Handedness::RightHanded, Winding::Cw => Handedness::LeftHanded, } diff --git a/crates/fj-core/src/validate/sketch.rs b/crates/fj-core/src/validate/sketch.rs index 5e536c5f7..150a66833 100644 --- a/crates/fj-core/src/validate/sketch.rs +++ b/crates/fj-core/src/validate/sketch.rs @@ -77,7 +77,7 @@ impl SketchValidationError { ) { sketch.regions().iter().for_each(|region| { let cycle = region.exterior(); - if cycle.winding(geometry) == Winding::Cw { + if cycle.winding(geometry, sketch.surface()) == Winding::Cw { errors.push(ValidationError::Sketch( SketchValidationError::ClockwiseExteriorCycle { cycle: cycle.clone(), @@ -97,7 +97,9 @@ impl SketchValidationError { region .interiors() .iter() - .filter(|interior| interior.winding(geometry) == Winding::Ccw) + .filter(|interior| { + interior.winding(geometry, sketch.surface()) == Winding::Ccw + }) .for_each(|cycle| { errors.push(ValidationError::Sketch( SketchValidationError::CounterClockwiseInteriorCycle { diff --git a/crates/fj-core/src/validation/checks/face_winding.rs b/crates/fj-core/src/validation/checks/face_winding.rs index d60f4cbc6..ee049d1fe 100644 --- a/crates/fj-core/src/validation/checks/face_winding.rs +++ b/crates/fj-core/src/validation/checks/face_winding.rs @@ -53,8 +53,8 @@ impl ValidationCheck for InteriorCycleHasInvalidWinding { return None; } - let exterior_winding = exterior.winding(geometry); - let interior_winding = interior.winding(geometry); + let exterior_winding = exterior.winding(geometry, object.surface()); + let interior_winding = interior.winding(geometry, object.surface()); if exterior_winding == interior_winding { return Some(InteriorCycleHasInvalidWinding {