From c083d18b21afaa69ba4f751266628c46c0904716 Mon Sep 17 00:00:00 2001 From: Buncys Date: Sat, 24 Jan 2026 12:57:34 +0100 Subject: [PATCH] feat: add From trait implementations between Pose2/Pose3 and tuples --- src/pose2.rs | 27 +++++++++++++++++++++++++++ src/pose3.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/pose2.rs b/src/pose2.rs index 4f3d131..4adac00 100644 --- a/src/pose2.rs +++ b/src/pose2.rs @@ -312,6 +312,23 @@ macro_rules! impl_pose2 { } } + impl From<($Vec2, $Real)> for $Pose2 { + #[inline] + fn from((translation, rotation): ($Vec2, $Real)) -> Self { + Self { + translation, + rotation: $Rot2::new(rotation), + } + } + } + + impl From<$Pose2> for ($Vec2, $Real) { + #[inline] + fn from(pose: $Pose2) -> ($Vec2, $Real) { + (pose.translation, pose.rotation.angle()) + } + } + #[cfg(feature = "approx")] impl approx::AbsDiffEq for $Pose2 { type Epsilon = $Real; @@ -509,4 +526,14 @@ mod tests { assert_relative_eq!(p.translation.x, 1.0, epsilon = 1e-10); assert_relative_eq!(p.translation.y, 2.0, epsilon = 1e-10); } + + #[test] + fn test_convert_back_to_equal_pose2() { + let (t1, r1) = (glam::Vec2::new(1.0, 2.0), PI / 4.0); + let p: Pose2 = (t1, r1).into(); + let (t2, r2) = p.into(); + + assert_relative_eq!(t1, t2, epsilon = 1e-6); + assert_relative_eq!(r1, r2, epsilon = 1e-6); + } } diff --git a/src/pose3.rs b/src/pose3.rs index 49cb222..b088eaf 100644 --- a/src/pose3.rs +++ b/src/pose3.rs @@ -354,6 +354,23 @@ macro_rules! impl_pose3 { } } + impl From<($Vec3, $Rot3)> for $Pose3 { + #[inline] + fn from((translation, rotation): ($Vec3, $Rot3)) -> Self { + Self { + translation, + rotation, + } + } + } + + impl From<$Pose3> for ($Vec3, $Rot3) { + #[inline] + fn from(pose: $Pose3) -> ($Vec3, $Rot3) { + (pose.translation, pose.rotation) + } + } + #[cfg(feature = "approx")] impl approx::AbsDiffEq for $Pose3 { type Epsilon = $Real; @@ -598,4 +615,17 @@ mod tests { assert_relative_eq!(p.translation.y, 2.0, epsilon = 1e-10); assert_relative_eq!(p.translation.z, 3.0, epsilon = 1e-10); } + + #[test] + fn test_convert_back_to_equal_pose3() { + let (t1, r1) = ( + glam::Vec3::new(1.0, 2.0, 3.0), + glam::Quat::from_rotation_x(PI / 4.0), + ); + let p: Pose3 = (t1, r1).into(); + let (t2, r2) = p.into(); + + assert_relative_eq!(t1, t2, epsilon = 1e-6); + assert!(r1.dot(r2).abs() > 1.0 - 1e-5); + } }