From 3897826b5c7fa0dc442cfc2ff4d6d18161a0c029 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 27 Jun 2024 21:24:21 +0200 Subject: [PATCH] Require end vertex to reverse `HalfEdge` coords This is preparation for updating the vertex geometry in that code. --- crates/fj-core/src/operations/build/shell.rs | 262 +++++++++++------- .../src/operations/reverse/half_edge.rs | 8 +- 2 files changed, 161 insertions(+), 109 deletions(-) diff --git a/crates/fj-core/src/operations/build/shell.rs b/crates/fj-core/src/operations/build/shell.rs index 1afcc3662..5b3200981 100644 --- a/crates/fj-core/src/operations/build/shell.rs +++ b/crates/fj-core/src/operations/build/shell.rs @@ -183,7 +183,14 @@ pub trait BuildShell { .update_half_edge( cycle.half_edges().nth_circular(0), |half_edge, core| { - [(half_edge, bad.face.surface()) + [( + half_edge, + cycle + .half_edges() + .nth_circular(1) + .start_vertex(), + bad.face.surface(), + ) .reverse_curve_coordinate_systems( core, )] @@ -204,111 +211,154 @@ pub trait BuildShell { core, ) }; - let dac = - { - let dac = Face::triangle([d, a, c], core); - dac.update_region( - |region, core| { - region.update_exterior( - |cycle, core| { - cycle - .update_half_edge( - cycle.half_edges().nth_circular(1), - |half_edge, core| { - [(half_edge, dac.face.surface()) - .reverse_curve_coordinate_systems(core)] - }, - core, - ) - .join_to( - abc.face.region().exterior(), - 1..=1, - 2..=2, - dac.face.surface().clone(), - core, - ) - .update_half_edge( - cycle.half_edges().nth_circular(0), - |half_edge, core| { - [(half_edge, dac.face.surface()) - .reverse_curve_coordinate_systems(core)] - }, - core, - ) - .join_to( - bad.face.region().exterior(), - 0..=0, - 1..=1, - dac.face.surface().clone(), - core, - ) - }, - core, - ) - }, - core, - ) - }; - let cbd = - { - let cbd = Face::triangle([c, b, d], core); - cbd.update_region( - |region, core| { - region.update_exterior( - |cycle, core| { - cycle - .update_half_edge( - cycle.half_edges().nth_circular(0), - |half_edge, core| { - [(half_edge, cbd.face.surface()) - .reverse_curve_coordinate_systems(core)] - }, - core, - ) - .update_half_edge( - cycle.half_edges().nth_circular(1), - |half_edge, core| { - [(half_edge, cbd.face.surface()) - .reverse_curve_coordinate_systems(core)] - }, - core, - ) - .update_half_edge( - cycle.half_edges().nth_circular(2), - |half_edge, core| { - [(half_edge, cbd.face.surface()) - .reverse_curve_coordinate_systems(core)] - }, - core, - ) - .join_to( - abc.face.region().exterior(), - 0..=0, - 1..=1, - cbd.face.surface().clone(), - core, - ) - .join_to( - bad.face.region().exterior(), - 1..=1, - 2..=2, - cbd.face.surface().clone(), - core, - ) - .join_to( - dac.face.region().exterior(), - 2..=2, - 2..=2, - cbd.face.surface().clone(), - core, - ) - }, - core, - ) - }, - core, - ) - }; + let dac = { + let dac = Face::triangle([d, a, c], core); + dac.update_region( + |region, core| { + region.update_exterior( + |cycle, core| { + cycle + .update_half_edge( + cycle.half_edges().nth_circular(1), + |half_edge, core| { + [( + half_edge, + cycle + .half_edges() + .nth_circular(2) + .start_vertex(), + dac.face.surface(), + ) + .reverse_curve_coordinate_systems( + core, + )] + }, + core, + ) + .join_to( + abc.face.region().exterior(), + 1..=1, + 2..=2, + dac.face.surface().clone(), + core, + ) + .update_half_edge( + cycle.half_edges().nth_circular(0), + |half_edge, core| { + [( + half_edge, + cycle + .half_edges() + .nth_circular(1) + .start_vertex(), + dac.face.surface(), + ) + .reverse_curve_coordinate_systems( + core, + )] + }, + core, + ) + .join_to( + bad.face.region().exterior(), + 0..=0, + 1..=1, + dac.face.surface().clone(), + core, + ) + }, + core, + ) + }, + core, + ) + }; + let cbd = { + let cbd = Face::triangle([c, b, d], core); + cbd.update_region( + |region, core| { + region.update_exterior( + |cycle, core| { + cycle + .update_half_edge( + cycle.half_edges().nth_circular(0), + |half_edge, core| { + [( + half_edge, + cycle + .half_edges() + .nth_circular(1) + .start_vertex(), + cbd.face.surface(), + ) + .reverse_curve_coordinate_systems( + core, + )] + }, + core, + ) + .update_half_edge( + cycle.half_edges().nth_circular(1), + |half_edge, core| { + [( + half_edge, + cycle + .half_edges() + .nth_circular(2) + .start_vertex(), + cbd.face.surface(), + ) + .reverse_curve_coordinate_systems( + core, + )] + }, + core, + ) + .update_half_edge( + cycle.half_edges().nth_circular(2), + |half_edge, core| { + [( + half_edge, + cycle + .half_edges() + .nth_circular(3) + .start_vertex(), + cbd.face.surface(), + ) + .reverse_curve_coordinate_systems( + core, + )] + }, + core, + ) + .join_to( + abc.face.region().exterior(), + 0..=0, + 1..=1, + cbd.face.surface().clone(), + core, + ) + .join_to( + bad.face.region().exterior(), + 1..=1, + 2..=2, + cbd.face.surface().clone(), + core, + ) + .join_to( + dac.face.region().exterior(), + 2..=2, + 2..=2, + cbd.face.surface().clone(), + core, + ) + }, + core, + ) + }, + core, + ) + }; let triangles = [abc, bad, dac, cbd].map(|triangle| triangle.insert(core)); diff --git a/crates/fj-core/src/operations/reverse/half_edge.rs b/crates/fj-core/src/operations/reverse/half_edge.rs index eb7d3c4c5..e7c75101a 100644 --- a/crates/fj-core/src/operations/reverse/half_edge.rs +++ b/crates/fj-core/src/operations/reverse/half_edge.rs @@ -1,20 +1,22 @@ use crate::{ operations::{derive::DeriveFrom, insert::Insert}, storage::Handle, - topology::{HalfEdge, Surface}, + topology::{HalfEdge, Surface, Vertex}, Core, }; use super::ReverseCurveCoordinateSystems; -impl ReverseCurveCoordinateSystems for (&Handle, &Handle) { +impl ReverseCurveCoordinateSystems + for (&Handle, &Handle, &Handle) +{ type Reversed = Handle; fn reverse_curve_coordinate_systems( self, core: &mut Core, ) -> Self::Reversed { - let (half_edge, surface) = self; + let (half_edge, _end_vertex, surface) = self; let mut half_edge_geom = *core.layers.geometry.of_half_edge(half_edge); half_edge_geom.boundary = half_edge_geom.boundary.reverse();