From cb2f8091d12825ab2ec2af57f9d159db07ab0d5c Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Fri, 14 Jun 2024 20:41:15 +0200 Subject: [PATCH 1/4] Update variable name --- crates/fj-core/src/operations/transform/cycle.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/fj-core/src/operations/transform/cycle.rs b/crates/fj-core/src/operations/transform/cycle.rs index 118f779a4..4fe17a69c 100644 --- a/crates/fj-core/src/operations/transform/cycle.rs +++ b/crates/fj-core/src/operations/transform/cycle.rs @@ -11,10 +11,10 @@ impl TransformObject for Cycle { core: &mut Core, cache: &mut TransformCache, ) -> Self { - let edges = self.half_edges().iter().map(|edge| { + let half_edges = self.half_edges().iter().map(|edge| { edge.clone().transform_with_cache(transform, core, cache) }); - Self::new(edges) + Self::new(half_edges) } } From f3432b1f5e52c8f7e032528fe5647a7f0916897b Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Fri, 14 Jun 2024 20:41:30 +0200 Subject: [PATCH 2/4] Update argument name --- crates/fj-core/src/operations/transform/cycle.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/fj-core/src/operations/transform/cycle.rs b/crates/fj-core/src/operations/transform/cycle.rs index 4fe17a69c..f767cc347 100644 --- a/crates/fj-core/src/operations/transform/cycle.rs +++ b/crates/fj-core/src/operations/transform/cycle.rs @@ -11,8 +11,10 @@ impl TransformObject for Cycle { core: &mut Core, cache: &mut TransformCache, ) -> Self { - let half_edges = self.half_edges().iter().map(|edge| { - edge.clone().transform_with_cache(transform, core, cache) + let half_edges = self.half_edges().iter().map(|half_edge| { + half_edge + .clone() + .transform_with_cache(transform, core, cache) }); Self::new(half_edges) From 1c356747d90215307f25e7bb04f76e3530482046 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Fri, 14 Jun 2024 20:54:21 +0200 Subject: [PATCH 3/4] Add `TransformObject::Transformed` This makes the trait more flexible. I'm going to need this additional flexibility for an upcoming change. --- .../fj-core/src/operations/transform/curve.rs | 4 ++- .../fj-core/src/operations/transform/cycle.rs | 4 ++- .../fj-core/src/operations/transform/edge.rs | 4 ++- .../fj-core/src/operations/transform/face.rs | 4 ++- .../fj-core/src/operations/transform/mod.rs | 28 +++++++++++++++---- .../src/operations/transform/region.rs | 4 ++- .../fj-core/src/operations/transform/shell.rs | 4 ++- .../fj-core/src/operations/transform/solid.rs | 4 ++- .../src/operations/transform/surface.rs | 4 ++- .../src/operations/transform/vertex.rs | 4 ++- 10 files changed, 49 insertions(+), 15 deletions(-) diff --git a/crates/fj-core/src/operations/transform/curve.rs b/crates/fj-core/src/operations/transform/curve.rs index fa6a686b6..7b99253b1 100644 --- a/crates/fj-core/src/operations/transform/curve.rs +++ b/crates/fj-core/src/operations/transform/curve.rs @@ -10,12 +10,14 @@ use crate::{ use super::{TransformCache, TransformObject}; impl TransformObject for Handle { + type Transformed = Self; + fn transform_with_cache( &self, _: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { cache .entry(self) .or_insert_with(|| { diff --git a/crates/fj-core/src/operations/transform/cycle.rs b/crates/fj-core/src/operations/transform/cycle.rs index f767cc347..071f155ed 100644 --- a/crates/fj-core/src/operations/transform/cycle.rs +++ b/crates/fj-core/src/operations/transform/cycle.rs @@ -5,12 +5,14 @@ use crate::{topology::Cycle, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Cycle { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let half_edges = self.half_edges().iter().map(|half_edge| { half_edge .clone() diff --git a/crates/fj-core/src/operations/transform/edge.rs b/crates/fj-core/src/operations/transform/edge.rs index ba3fa4370..cd175c0df 100644 --- a/crates/fj-core/src/operations/transform/edge.rs +++ b/crates/fj-core/src/operations/transform/edge.rs @@ -7,12 +7,14 @@ use crate::{ use super::{TransformCache, TransformObject}; impl TransformObject for Handle { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let curve = self .curve() .clone() diff --git a/crates/fj-core/src/operations/transform/face.rs b/crates/fj-core/src/operations/transform/face.rs index ae8911dcb..a632027c1 100644 --- a/crates/fj-core/src/operations/transform/face.rs +++ b/crates/fj-core/src/operations/transform/face.rs @@ -5,12 +5,14 @@ use crate::{topology::Face, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Face { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let surface = self .surface() .clone() diff --git a/crates/fj-core/src/operations/transform/mod.rs b/crates/fj-core/src/operations/transform/mod.rs index 9916b7442..0597c05fc 100644 --- a/crates/fj-core/src/operations/transform/mod.rs +++ b/crates/fj-core/src/operations/transform/mod.rs @@ -34,8 +34,15 @@ use super::derive::DeriveFrom; /// More convenience methods can be added as required. The only reason this /// hasn't been done so far, is that no one has put in the work yet. pub trait TransformObject: Sized { + /// The result of the transformation + type Transformed; + /// Transform the object - fn transform(&self, transform: &Transform, core: &mut Core) -> Self { + fn transform( + &self, + transform: &Transform, + core: &mut Core, + ) -> Self::Transformed { let mut cache = TransformCache::default(); self.transform_with_cache(transform, core, &mut cache) } @@ -46,12 +53,16 @@ pub trait TransformObject: Sized { transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self; + ) -> Self::Transformed; /// Translate the object /// /// Convenience wrapper around [`TransformObject::transform`]. - fn translate(&self, offset: impl Into>, core: &mut Core) -> Self { + fn translate( + &self, + offset: impl Into>, + core: &mut Core, + ) -> Self::Transformed { self.transform(&Transform::translation(offset), core) } @@ -62,22 +73,27 @@ pub trait TransformObject: Sized { &self, axis_angle: impl Into>, core: &mut Core, - ) -> Self { + ) -> Self::Transformed { self.transform(&Transform::rotation(axis_angle), core) } } impl TransformObject for Handle where - T: Clone + Insert> + TransformObject + 'static, + T: Clone + + Insert> + + TransformObject + + 'static, Handle: Into>, { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { if let Some(object) = cache.get(self) { return object.clone(); } diff --git a/crates/fj-core/src/operations/transform/region.rs b/crates/fj-core/src/operations/transform/region.rs index 5896da254..f4e4e7612 100644 --- a/crates/fj-core/src/operations/transform/region.rs +++ b/crates/fj-core/src/operations/transform/region.rs @@ -3,12 +3,14 @@ use crate::{topology::Region, Core}; use super::TransformObject; impl TransformObject for Region { + type Transformed = Self; + fn transform_with_cache( &self, transform: &fj_math::Transform, core: &mut Core, cache: &mut super::TransformCache, - ) -> Self { + ) -> Self::Transformed { let exterior = self .exterior() .clone() diff --git a/crates/fj-core/src/operations/transform/shell.rs b/crates/fj-core/src/operations/transform/shell.rs index 09c1fe6ba..b8e78287d 100644 --- a/crates/fj-core/src/operations/transform/shell.rs +++ b/crates/fj-core/src/operations/transform/shell.rs @@ -5,12 +5,14 @@ use crate::{topology::Shell, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Shell { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let faces = self .faces() .iter() diff --git a/crates/fj-core/src/operations/transform/solid.rs b/crates/fj-core/src/operations/transform/solid.rs index 6b8a1cdca..346e143a9 100644 --- a/crates/fj-core/src/operations/transform/solid.rs +++ b/crates/fj-core/src/operations/transform/solid.rs @@ -5,12 +5,14 @@ use crate::{topology::Solid, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Solid { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { let shells = self.shells().iter().cloned().map(|shell| { shell.transform_with_cache(transform, core, cache) diff --git a/crates/fj-core/src/operations/transform/surface.rs b/crates/fj-core/src/operations/transform/surface.rs index 0a61532e5..60b83ac08 100644 --- a/crates/fj-core/src/operations/transform/surface.rs +++ b/crates/fj-core/src/operations/transform/surface.rs @@ -7,12 +7,14 @@ use crate::{ use super::{TransformCache, TransformObject}; impl TransformObject for Handle { + type Transformed = Self; + fn transform_with_cache( &self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { cache .entry(self) .or_insert_with(|| { diff --git a/crates/fj-core/src/operations/transform/vertex.rs b/crates/fj-core/src/operations/transform/vertex.rs index 9e0f761bb..d3e762e6b 100644 --- a/crates/fj-core/src/operations/transform/vertex.rs +++ b/crates/fj-core/src/operations/transform/vertex.rs @@ -5,12 +5,14 @@ use crate::{topology::Vertex, Core}; use super::{TransformCache, TransformObject}; impl TransformObject for Vertex { + type Transformed = Self; + fn transform_with_cache( &self, _: &Transform, _: &mut Core, _: &mut TransformCache, - ) -> Self { + ) -> Self::Transformed { // There's nothing to actually transform here, as `Vertex` holds no // data. We still need this implementation though, as a new `Vertex` // object must be created to represent the new and transformed vertex. From 5716bb7ca14ecd65887eeefa143f8e49c37bcf59 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Fri, 14 Jun 2024 20:58:45 +0200 Subject: [PATCH 4/4] Take `self` by value in `TransformObject` This is another measure to provide more flexibility that I'm going to need going forward. It also has surprisingly little effect on the rest of the code. --- crates/fj-core/src/operations/sweep/region.rs | 3 ++- crates/fj-core/src/operations/transform/curve.rs | 6 +++--- crates/fj-core/src/operations/transform/cycle.rs | 2 +- crates/fj-core/src/operations/transform/edge.rs | 4 ++-- crates/fj-core/src/operations/transform/face.rs | 2 +- crates/fj-core/src/operations/transform/mod.rs | 14 +++++++------- crates/fj-core/src/operations/transform/region.rs | 2 +- crates/fj-core/src/operations/transform/shell.rs | 2 +- crates/fj-core/src/operations/transform/solid.rs | 2 +- crates/fj-core/src/operations/transform/surface.rs | 6 +++--- crates/fj-core/src/operations/transform/vertex.rs | 2 +- 11 files changed, 23 insertions(+), 22 deletions(-) diff --git a/crates/fj-core/src/operations/sweep/region.rs b/crates/fj-core/src/operations/sweep/region.rs index bbdc3fda3..34d6ef14d 100644 --- a/crates/fj-core/src/operations/sweep/region.rs +++ b/crates/fj-core/src/operations/sweep/region.rs @@ -52,7 +52,8 @@ impl SweepRegion for Region { let mut faces = Vec::new(); - let top_surface = bottom_surface.translate(path, core).insert(core); + let top_surface = + bottom_surface.clone().translate(path, core).insert(core); let top_exterior = sweep_cycle( self.exterior(), diff --git a/crates/fj-core/src/operations/transform/curve.rs b/crates/fj-core/src/operations/transform/curve.rs index 7b99253b1..7f6bfbd52 100644 --- a/crates/fj-core/src/operations/transform/curve.rs +++ b/crates/fj-core/src/operations/transform/curve.rs @@ -13,13 +13,13 @@ impl TransformObject for Handle { type Transformed = Self; fn transform_with_cache( - &self, + self, _: &Transform, core: &mut Core, cache: &mut TransformCache, ) -> Self::Transformed { cache - .entry(self) + .entry(&self) .or_insert_with(|| { // We don't actually need to transform the curve, as its // geometry is locally defined on a surface. We need to set that @@ -27,7 +27,7 @@ impl TransformObject for Handle { // represent the transformed curve. Curve::new() .insert(core) - .copy_geometry_from(self, &mut core.layers.geometry) + .copy_geometry_from(&self, &mut core.layers.geometry) }) .clone() } diff --git a/crates/fj-core/src/operations/transform/cycle.rs b/crates/fj-core/src/operations/transform/cycle.rs index 071f155ed..c4c1c93dd 100644 --- a/crates/fj-core/src/operations/transform/cycle.rs +++ b/crates/fj-core/src/operations/transform/cycle.rs @@ -8,7 +8,7 @@ impl TransformObject for Cycle { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, diff --git a/crates/fj-core/src/operations/transform/edge.rs b/crates/fj-core/src/operations/transform/edge.rs index cd175c0df..e4875df87 100644 --- a/crates/fj-core/src/operations/transform/edge.rs +++ b/crates/fj-core/src/operations/transform/edge.rs @@ -10,7 +10,7 @@ impl TransformObject for Handle { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, @@ -28,7 +28,7 @@ impl TransformObject for Handle { core.layers.geometry.define_half_edge( half_edge.clone(), - *core.layers.geometry.of_half_edge(self), + *core.layers.geometry.of_half_edge(&self), ); half_edge diff --git a/crates/fj-core/src/operations/transform/face.rs b/crates/fj-core/src/operations/transform/face.rs index a632027c1..3aa982844 100644 --- a/crates/fj-core/src/operations/transform/face.rs +++ b/crates/fj-core/src/operations/transform/face.rs @@ -8,7 +8,7 @@ impl TransformObject for Face { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, diff --git a/crates/fj-core/src/operations/transform/mod.rs b/crates/fj-core/src/operations/transform/mod.rs index 0597c05fc..507a598c9 100644 --- a/crates/fj-core/src/operations/transform/mod.rs +++ b/crates/fj-core/src/operations/transform/mod.rs @@ -39,7 +39,7 @@ pub trait TransformObject: Sized { /// Transform the object fn transform( - &self, + self, transform: &Transform, core: &mut Core, ) -> Self::Transformed { @@ -49,7 +49,7 @@ pub trait TransformObject: Sized { /// Transform the object using the provided cache fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, @@ -59,7 +59,7 @@ pub trait TransformObject: Sized { /// /// Convenience wrapper around [`TransformObject::transform`]. fn translate( - &self, + self, offset: impl Into>, core: &mut Core, ) -> Self::Transformed { @@ -70,7 +70,7 @@ pub trait TransformObject: Sized { /// /// Convenience wrapper around [`TransformObject::transform`]. fn rotate( - &self, + self, axis_angle: impl Into>, core: &mut Core, ) -> Self::Transformed { @@ -89,12 +89,12 @@ where type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, ) -> Self::Transformed { - if let Some(object) = cache.get(self) { + if let Some(object) = cache.get(&self) { return object.clone(); } @@ -102,7 +102,7 @@ where .clone_object() .transform_with_cache(transform, core, cache) .insert(core) - .derive_from(self, core); + .derive_from(&self, core); cache.insert(self.clone(), transformed.clone()); diff --git a/crates/fj-core/src/operations/transform/region.rs b/crates/fj-core/src/operations/transform/region.rs index f4e4e7612..0615b4259 100644 --- a/crates/fj-core/src/operations/transform/region.rs +++ b/crates/fj-core/src/operations/transform/region.rs @@ -6,7 +6,7 @@ impl TransformObject for Region { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &fj_math::Transform, core: &mut Core, cache: &mut super::TransformCache, diff --git a/crates/fj-core/src/operations/transform/shell.rs b/crates/fj-core/src/operations/transform/shell.rs index b8e78287d..0e624e4a9 100644 --- a/crates/fj-core/src/operations/transform/shell.rs +++ b/crates/fj-core/src/operations/transform/shell.rs @@ -8,7 +8,7 @@ impl TransformObject for Shell { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, diff --git a/crates/fj-core/src/operations/transform/solid.rs b/crates/fj-core/src/operations/transform/solid.rs index 346e143a9..9ca8ed284 100644 --- a/crates/fj-core/src/operations/transform/solid.rs +++ b/crates/fj-core/src/operations/transform/solid.rs @@ -8,7 +8,7 @@ impl TransformObject for Solid { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, diff --git a/crates/fj-core/src/operations/transform/surface.rs b/crates/fj-core/src/operations/transform/surface.rs index 60b83ac08..74c8a4049 100644 --- a/crates/fj-core/src/operations/transform/surface.rs +++ b/crates/fj-core/src/operations/transform/surface.rs @@ -10,18 +10,18 @@ impl TransformObject for Handle { type Transformed = Self; fn transform_with_cache( - &self, + self, transform: &Transform, core: &mut Core, cache: &mut TransformCache, ) -> Self::Transformed { cache - .entry(self) + .entry(&self) .or_insert_with(|| { let surface = Surface::new().insert(core); let geometry = - core.layers.geometry.of_surface(self).transform(transform); + core.layers.geometry.of_surface(&self).transform(transform); core.layers .geometry .define_surface(surface.clone(), geometry); diff --git a/crates/fj-core/src/operations/transform/vertex.rs b/crates/fj-core/src/operations/transform/vertex.rs index d3e762e6b..9a971a1ba 100644 --- a/crates/fj-core/src/operations/transform/vertex.rs +++ b/crates/fj-core/src/operations/transform/vertex.rs @@ -8,7 +8,7 @@ impl TransformObject for Vertex { type Transformed = Self; fn transform_with_cache( - &self, + self, _: &Transform, _: &mut Core, _: &mut TransformCache,