use glam::{vec3, Affine3, Affine3A, Mat3, Vec3Swizzles, Vec4, Vec4Swizzles};
pub trait Affine3Ext {
fn from_transpose(transposed: [Vec4; 3]) -> Self;
fn to_transpose(self) -> [Vec4; 3];
fn inverse_transpose_3x3(self) -> ([Vec4; 2], f32);
}
impl Affine3Ext for Affine3 {
fn from_transpose(transposed: [Vec4; 3]) -> Self {
let transpose_3x3 = Mat3::from_cols(
transposed[0].xyz(),
transposed[1].xyz(),
transposed[2].xyz(),
);
let translation = vec3(transposed[0].w, transposed[1].w, transposed[2].w);
Affine3::from_mat3_translation(transpose_3x3.transpose(), translation)
}
#[inline]
fn to_transpose(self) -> [Vec4; 3] {
let transpose_3x3 = self.matrix3.transpose();
[
transpose_3x3.x_axis.extend(self.translation.x),
transpose_3x3.y_axis.extend(self.translation.y),
transpose_3x3.z_axis.extend(self.translation.z),
]
}
#[inline]
fn inverse_transpose_3x3(self) -> ([Vec4; 2], f32) {
let inverse_transpose_3x3 = Affine3A::from(self).inverse().matrix3.transpose();
(
[
(inverse_transpose_3x3.x_axis, inverse_transpose_3x3.y_axis.x).into(),
(
inverse_transpose_3x3.y_axis.yz(),
inverse_transpose_3x3.z_axis.xy(),
)
.into(),
],
inverse_transpose_3x3.z_axis.z,
)
}
}