diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d7a3e4..b38659c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v0.1.3 + +- Add `From`/`Into` conversions between f32 and f64 type variants. + # v0.1.2 - Add optional `rkyv 0.8` support. \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 5fc0df5..2eedb52 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "glamx" -version = "0.1.2" +version = "0.1.3" authors = ["Sébastien Crozet "] description = "Extensions for glam: Pose2, Pose3, Rot2, and matrix utilities." diff --git a/src/eigen2.rs b/src/eigen2.rs index 76a33f9..ef119cf 100644 --- a/src/eigen2.rs +++ b/src/eigen2.rs @@ -77,6 +77,27 @@ macro_rules! impl_symmetric_eigen2 { impl_symmetric_eigen2!(SymmetricEigen2, glam::Mat2, glam::Vec2, f32); impl_symmetric_eigen2!(DSymmetricEigen2, glam::DMat2, glam::DVec2, f64); +// f32 <-> f64 conversions +impl From for DSymmetricEigen2 { + #[inline] + fn from(e: SymmetricEigen2) -> Self { + Self { + eigenvalues: e.eigenvalues.as_dvec2(), + eigenvectors: e.eigenvectors.as_dmat2(), + } + } +} + +impl From for SymmetricEigen2 { + #[inline] + fn from(e: DSymmetricEigen2) -> Self { + Self { + eigenvalues: e.eigenvalues.as_vec2(), + eigenvectors: e.eigenvectors.as_mat2(), + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/eigen3.rs b/src/eigen3.rs index b26a1cb..8dfb535 100644 --- a/src/eigen3.rs +++ b/src/eigen3.rs @@ -230,6 +230,68 @@ impl_symmetric_eigen3!(SymmetricEigen3, glam::Mat3, glam::Vec3, f32); impl_symmetric_eigen3!(SymmetricEigen3A, glam::Mat3A, glam::Vec3A, f32); impl_symmetric_eigen3!(DSymmetricEigen3, glam::DMat3, glam::DVec3, f64); +// f32 <-> f64 conversions +impl From for DSymmetricEigen3 { + #[inline] + fn from(e: SymmetricEigen3) -> Self { + Self { + eigenvalues: e.eigenvalues.as_dvec3(), + eigenvectors: e.eigenvectors.as_dmat3(), + } + } +} + +impl From for SymmetricEigen3 { + #[inline] + fn from(e: DSymmetricEigen3) -> Self { + Self { + eigenvalues: e.eigenvalues.as_vec3(), + eigenvectors: e.eigenvectors.as_mat3(), + } + } +} + +impl From for DSymmetricEigen3 { + #[inline] + fn from(e: SymmetricEigen3A) -> Self { + Self { + eigenvalues: e.eigenvalues.as_dvec3(), + eigenvectors: e.eigenvectors.as_dmat3(), + } + } +} + +impl From for SymmetricEigen3A { + #[inline] + fn from(e: DSymmetricEigen3) -> Self { + Self { + eigenvalues: e.eigenvalues.as_vec3a(), + eigenvectors: e.eigenvectors.as_mat3().into(), + } + } +} + +// SymmetricEigen3 <-> SymmetricEigen3A conversions +impl From for SymmetricEigen3A { + #[inline] + fn from(e: SymmetricEigen3) -> Self { + Self { + eigenvalues: e.eigenvalues.into(), + eigenvectors: glam::Mat3A::from(e.eigenvectors), + } + } +} + +impl From for SymmetricEigen3 { + #[inline] + fn from(e: SymmetricEigen3A) -> Self { + Self { + eigenvalues: e.eigenvalues.into(), + eigenvectors: glam::Mat3::from(e.eigenvectors), + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/pose2.rs b/src/pose2.rs index 2e17f5a..4f3d131 100644 --- a/src/pose2.rs +++ b/src/pose2.rs @@ -364,6 +364,27 @@ impl_pose2!( glam::DMat3 ); +// f32 <-> f64 conversions +impl From for DPose2 { + #[inline] + fn from(p: Pose2) -> Self { + Self { + rotation: p.rotation.into(), + translation: p.translation.into(), + } + } +} + +impl From for Pose2 { + #[inline] + fn from(p: DPose2) -> Self { + Self { + rotation: p.rotation.into(), + translation: p.translation.as_vec2(), + } + } +} + // Nalgebra conversions #[cfg(feature = "nalgebra")] mod nalgebra_conv { diff --git a/src/pose3.rs b/src/pose3.rs index 26edf41..49cb222 100644 --- a/src/pose3.rs +++ b/src/pose3.rs @@ -391,6 +391,68 @@ impl_pose3!(Pose3, Rot3, f32, glam::Vec3, glam::Mat4); impl_pose3!(Pose3A, Rot3, f32, glam::Vec3A, glam::Mat4); impl_pose3!(DPose3, DRot3, f64, glam::DVec3, glam::DMat4); +// f32 <-> f64 conversions +impl From for DPose3 { + #[inline] + fn from(p: Pose3) -> Self { + Self { + rotation: p.rotation.as_dquat(), + translation: p.translation.as_dvec3(), + } + } +} + +impl From for Pose3 { + #[inline] + fn from(p: DPose3) -> Self { + Self { + rotation: p.rotation.as_quat(), + translation: p.translation.as_vec3(), + } + } +} + +impl From for DPose3 { + #[inline] + fn from(p: Pose3A) -> Self { + Self { + rotation: p.rotation.as_dquat(), + translation: p.translation.as_dvec3(), + } + } +} + +impl From for Pose3A { + #[inline] + fn from(p: DPose3) -> Self { + Self { + rotation: p.rotation.as_quat(), + translation: p.translation.as_vec3a(), + } + } +} + +// Pose3 <-> Pose3A conversions +impl From for Pose3A { + #[inline] + fn from(p: Pose3) -> Self { + Self { + rotation: p.rotation, + translation: p.translation.into(), + } + } +} + +impl From for Pose3 { + #[inline] + fn from(p: Pose3A) -> Self { + Self { + rotation: p.rotation, + translation: p.translation.into(), + } + } +} + // Nalgebra conversions #[cfg(feature = "nalgebra")] mod nalgebra_conv { @@ -435,17 +497,8 @@ mod nalgebra_conv { impl From> for DPose3 { fn from(iso: nalgebra::Isometry3) -> Self { Self { - rotation: glam::DQuat::from_xyzw( - iso.rotation.i, - iso.rotation.j, - iso.rotation.k, - iso.rotation.w, - ), - translation: glam::DVec3::new( - iso.translation.x, - iso.translation.y, - iso.translation.z, - ), + rotation: iso.rotation.into(), + translation: iso.translation.into(), } } } diff --git a/src/rot2.rs b/src/rot2.rs index 4ec543f..2923722 100644 --- a/src/rot2.rs +++ b/src/rot2.rs @@ -365,6 +365,27 @@ macro_rules! impl_rot2 { impl_rot2!(Rot2, f32, glam::Vec2, glam::Mat2); impl_rot2!(DRot2, f64, glam::DVec2, glam::DMat2); +// f32 <-> f64 conversions +impl From for DRot2 { + #[inline] + fn from(r: Rot2) -> Self { + Self { + re: r.re as f64, + im: r.im as f64, + } + } +} + +impl From for Rot2 { + #[inline] + fn from(r: DRot2) -> Self { + Self { + re: r.re as f32, + im: r.im as f32, + } + } +} + // Nalgebra conversions #[cfg(feature = "nalgebra")] mod nalgebra_conv { diff --git a/src/svd2.rs b/src/svd2.rs index 31e755d..21924cd 100644 --- a/src/svd2.rs +++ b/src/svd2.rs @@ -90,6 +90,29 @@ macro_rules! impl_svd2 { impl_svd2!(Svd2, glam::Mat2, glam::Vec2, f32); impl_svd2!(DSvd2, glam::DMat2, glam::DVec2, f64); +// f32 <-> f64 conversions +impl From for DSvd2 { + #[inline] + fn from(svd: Svd2) -> Self { + Self { + u: svd.u.as_dmat2(), + s: svd.s.as_dvec2(), + vt: svd.vt.as_dmat2(), + } + } +} + +impl From for Svd2 { + #[inline] + fn from(svd: DSvd2) -> Self { + Self { + u: svd.u.as_mat2(), + s: svd.s.as_vec2(), + vt: svd.vt.as_mat2(), + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/svd3.rs b/src/svd3.rs index 26a255f..6c74e02 100644 --- a/src/svd3.rs +++ b/src/svd3.rs @@ -132,6 +132,74 @@ impl_svd3!(Svd3, glam::Mat3, glam::Vec3, SymmetricEigen3, f32); impl_svd3!(Svd3A, glam::Mat3A, glam::Vec3A, SymmetricEigen3A, f32); impl_svd3!(DSvd3, glam::DMat3, glam::DVec3, DSymmetricEigen3, f64); +// f32 <-> f64 conversions +impl From for DSvd3 { + #[inline] + fn from(svd: Svd3) -> Self { + Self { + u: svd.u.as_dmat3(), + s: svd.s.as_dvec3(), + vt: svd.vt.as_dmat3(), + } + } +} + +impl From for Svd3 { + #[inline] + fn from(svd: DSvd3) -> Self { + Self { + u: svd.u.as_mat3(), + s: svd.s.as_vec3(), + vt: svd.vt.as_mat3(), + } + } +} + +impl From for DSvd3 { + #[inline] + fn from(svd: Svd3A) -> Self { + Self { + u: svd.u.as_dmat3(), + s: svd.s.as_dvec3(), + vt: svd.vt.as_dmat3(), + } + } +} + +impl From for Svd3A { + #[inline] + fn from(svd: DSvd3) -> Self { + Self { + u: svd.u.as_mat3().into(), + s: svd.s.as_vec3a(), + vt: svd.vt.as_mat3().into(), + } + } +} + +// Svd3 <-> Svd3A conversions +impl From for Svd3A { + #[inline] + fn from(svd: Svd3) -> Self { + Self { + u: glam::Mat3A::from(svd.u), + s: svd.s.into(), + vt: glam::Mat3A::from(svd.vt), + } + } +} + +impl From for Svd3 { + #[inline] + fn from(svd: Svd3A) -> Self { + Self { + u: glam::Mat3::from(svd.u), + s: svd.s.into(), + vt: glam::Mat3::from(svd.vt), + } + } +} + #[cfg(test)] mod tests { use super::*;