1 // Generated from affine.rs.tera template. Edit the template, not the generated file.
2 
3 use crate::{Mat2, Mat3, Mat3A, Vec2, Vec3A};
4 use core::ops::{Deref, DerefMut, Mul, MulAssign};
5 
6 /// A 2D affine transform, which can represent translation, rotation, scaling and shear.
7 #[derive(Copy, Clone)]
8 #[repr(C)]
9 pub struct Affine2 {
10     pub matrix2: Mat2,
11     pub translation: Vec2,
12 }
13 
14 impl Affine2 {
15     /// The degenerate zero transform.
16     ///
17     /// This transforms any finite vector and point to zero.
18     /// The zero transform is non-invertible.
19     pub const ZERO: Self = Self {
20         matrix2: Mat2::ZERO,
21         translation: Vec2::ZERO,
22     };
23 
24     /// The identity transform.
25     ///
26     /// Multiplying a vector with this returns the same vector.
27     pub const IDENTITY: Self = Self {
28         matrix2: Mat2::IDENTITY,
29         translation: Vec2::ZERO,
30     };
31 
32     /// All NAN:s.
33     pub const NAN: Self = Self {
34         matrix2: Mat2::NAN,
35         translation: Vec2::NAN,
36     };
37 
38     /// Creates an affine transform from three column vectors.
39     #[inline(always)]
40     #[must_use]
from_cols(x_axis: Vec2, y_axis: Vec2, z_axis: Vec2) -> Self41     pub const fn from_cols(x_axis: Vec2, y_axis: Vec2, z_axis: Vec2) -> Self {
42         Self {
43             matrix2: Mat2::from_cols(x_axis, y_axis),
44             translation: z_axis,
45         }
46     }
47 
48     /// Creates an affine transform from a `[f32; 6]` array stored in column major order.
49     #[inline]
50     #[must_use]
from_cols_array(m: &[f32; 6]) -> Self51     pub fn from_cols_array(m: &[f32; 6]) -> Self {
52         Self {
53             matrix2: Mat2::from_cols_slice(&m[0..4]),
54             translation: Vec2::from_slice(&m[4..6]),
55         }
56     }
57 
58     /// Creates a `[f32; 6]` array storing data in column major order.
59     #[inline]
60     #[must_use]
to_cols_array(&self) -> [f32; 6]61     pub fn to_cols_array(&self) -> [f32; 6] {
62         let x = &self.matrix2.x_axis;
63         let y = &self.matrix2.y_axis;
64         let z = &self.translation;
65         [x.x, x.y, y.x, y.y, z.x, z.y]
66     }
67 
68     /// Creates an affine transform from a `[[f32; 2]; 3]`
69     /// 2D array stored in column major order.
70     /// If your data is in row major order you will need to `transpose` the returned
71     /// matrix.
72     #[inline]
73     #[must_use]
from_cols_array_2d(m: &[[f32; 2]; 3]) -> Self74     pub fn from_cols_array_2d(m: &[[f32; 2]; 3]) -> Self {
75         Self {
76             matrix2: Mat2::from_cols(m[0].into(), m[1].into()),
77             translation: m[2].into(),
78         }
79     }
80 
81     /// Creates a `[[f32; 2]; 3]` 2D array storing data in
82     /// column major order.
83     /// If you require data in row major order `transpose` the matrix first.
84     #[inline]
85     #[must_use]
to_cols_array_2d(&self) -> [[f32; 2]; 3]86     pub fn to_cols_array_2d(&self) -> [[f32; 2]; 3] {
87         [
88             self.matrix2.x_axis.into(),
89             self.matrix2.y_axis.into(),
90             self.translation.into(),
91         ]
92     }
93 
94     /// Creates an affine transform from the first 6 values in `slice`.
95     ///
96     /// # Panics
97     ///
98     /// Panics if `slice` is less than 6 elements long.
99     #[inline]
100     #[must_use]
from_cols_slice(slice: &[f32]) -> Self101     pub fn from_cols_slice(slice: &[f32]) -> Self {
102         Self {
103             matrix2: Mat2::from_cols_slice(&slice[0..4]),
104             translation: Vec2::from_slice(&slice[4..6]),
105         }
106     }
107 
108     /// Writes the columns of `self` to the first 6 elements in `slice`.
109     ///
110     /// # Panics
111     ///
112     /// Panics if `slice` is less than 6 elements long.
113     #[inline]
write_cols_to_slice(self, slice: &mut [f32])114     pub fn write_cols_to_slice(self, slice: &mut [f32]) {
115         self.matrix2.write_cols_to_slice(&mut slice[0..4]);
116         self.translation.write_to_slice(&mut slice[4..6]);
117     }
118 
119     /// Creates an affine transform that changes scale.
120     /// Note that if any scale is zero the transform will be non-invertible.
121     #[inline]
122     #[must_use]
from_scale(scale: Vec2) -> Self123     pub fn from_scale(scale: Vec2) -> Self {
124         Self {
125             matrix2: Mat2::from_diagonal(scale),
126             translation: Vec2::ZERO,
127         }
128     }
129 
130     /// Creates an affine transform from the given rotation `angle`.
131     #[inline]
132     #[must_use]
from_angle(angle: f32) -> Self133     pub fn from_angle(angle: f32) -> Self {
134         Self {
135             matrix2: Mat2::from_angle(angle),
136             translation: Vec2::ZERO,
137         }
138     }
139 
140     /// Creates an affine transformation from the given 2D `translation`.
141     #[inline]
142     #[must_use]
from_translation(translation: Vec2) -> Self143     pub fn from_translation(translation: Vec2) -> Self {
144         Self {
145             matrix2: Mat2::IDENTITY,
146             translation,
147         }
148     }
149 
150     /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation)
151     #[inline]
152     #[must_use]
from_mat2(matrix2: Mat2) -> Self153     pub fn from_mat2(matrix2: Mat2) -> Self {
154         Self {
155             matrix2,
156             translation: Vec2::ZERO,
157         }
158     }
159 
160     /// Creates an affine transform from a 2x2 matrix (expressing scale, shear and rotation) and a
161     /// translation vector.
162     ///
163     /// Equivalent to
164     /// `Affine2::from_translation(translation) * Affine2::from_mat2(mat2)`
165     #[inline]
166     #[must_use]
from_mat2_translation(matrix2: Mat2, translation: Vec2) -> Self167     pub fn from_mat2_translation(matrix2: Mat2, translation: Vec2) -> Self {
168         Self {
169             matrix2,
170             translation,
171         }
172     }
173 
174     /// Creates an affine transform from the given 2D `scale`, rotation `angle` (in radians) and
175     /// `translation`.
176     ///
177     /// Equivalent to `Affine2::from_translation(translation) *
178     /// Affine2::from_angle(angle) * Affine2::from_scale(scale)`
179     #[inline]
180     #[must_use]
from_scale_angle_translation(scale: Vec2, angle: f32, translation: Vec2) -> Self181     pub fn from_scale_angle_translation(scale: Vec2, angle: f32, translation: Vec2) -> Self {
182         let rotation = Mat2::from_angle(angle);
183         Self {
184             matrix2: Mat2::from_cols(rotation.x_axis * scale.x, rotation.y_axis * scale.y),
185             translation,
186         }
187     }
188 
189     /// Creates an affine transform from the given 2D rotation `angle` (in radians) and
190     /// `translation`.
191     ///
192     /// Equivalent to `Affine2::from_translation(translation) * Affine2::from_angle(angle)`
193     #[inline]
194     #[must_use]
from_angle_translation(angle: f32, translation: Vec2) -> Self195     pub fn from_angle_translation(angle: f32, translation: Vec2) -> Self {
196         Self {
197             matrix2: Mat2::from_angle(angle),
198             translation,
199         }
200     }
201 
202     /// The given `Mat3` must be an affine transform,
203     #[inline]
204     #[must_use]
from_mat3(m: Mat3) -> Self205     pub fn from_mat3(m: Mat3) -> Self {
206         use crate::swizzles::Vec3Swizzles;
207         Self {
208             matrix2: Mat2::from_cols(m.x_axis.xy(), m.y_axis.xy()),
209             translation: m.z_axis.xy(),
210         }
211     }
212 
213     /// The given [`Mat3A`] must be an affine transform,
214     #[inline]
215     #[must_use]
from_mat3a(m: Mat3A) -> Self216     pub fn from_mat3a(m: Mat3A) -> Self {
217         use crate::swizzles::Vec3Swizzles;
218         Self {
219             matrix2: Mat2::from_cols(m.x_axis.xy(), m.y_axis.xy()),
220             translation: m.z_axis.xy(),
221         }
222     }
223 
224     /// Extracts `scale`, `angle` and `translation` from `self`.
225     ///
226     /// The transform is expected to be non-degenerate and without shearing, or the output
227     /// will be invalid.
228     ///
229     /// # Panics
230     ///
231     /// Will panic if the determinant `self.matrix2` is zero or if the resulting scale
232     /// vector contains any zero elements when `glam_assert` is enabled.
233     #[inline]
234     #[must_use]
to_scale_angle_translation(self) -> (Vec2, f32, Vec2)235     pub fn to_scale_angle_translation(self) -> (Vec2, f32, Vec2) {
236         use crate::f32::math;
237         let det = self.matrix2.determinant();
238         glam_assert!(det != 0.0);
239 
240         let scale = Vec2::new(
241             self.matrix2.x_axis.length() * math::signum(det),
242             self.matrix2.y_axis.length(),
243         );
244 
245         glam_assert!(scale.cmpne(Vec2::ZERO).all());
246 
247         let angle = math::atan2(-self.matrix2.y_axis.x, self.matrix2.y_axis.y);
248 
249         (scale, angle, self.translation)
250     }
251 
252     /// Transforms the given 2D point, applying shear, scale, rotation and translation.
253     #[inline]
254     #[must_use]
transform_point2(&self, rhs: Vec2) -> Vec2255     pub fn transform_point2(&self, rhs: Vec2) -> Vec2 {
256         self.matrix2 * rhs + self.translation
257     }
258 
259     /// Transforms the given 2D vector, applying shear, scale and rotation (but NOT
260     /// translation).
261     ///
262     /// To also apply translation, use [`Self::transform_point2()`] instead.
263     #[inline]
transform_vector2(&self, rhs: Vec2) -> Vec2264     pub fn transform_vector2(&self, rhs: Vec2) -> Vec2 {
265         self.matrix2 * rhs
266     }
267 
268     /// Returns `true` if, and only if, all elements are finite.
269     ///
270     /// If any element is either `NaN`, positive or negative infinity, this will return
271     /// `false`.
272     #[inline]
273     #[must_use]
is_finite(&self) -> bool274     pub fn is_finite(&self) -> bool {
275         self.matrix2.is_finite() && self.translation.is_finite()
276     }
277 
278     /// Returns `true` if any elements are `NaN`.
279     #[inline]
280     #[must_use]
is_nan(&self) -> bool281     pub fn is_nan(&self) -> bool {
282         self.matrix2.is_nan() || self.translation.is_nan()
283     }
284 
285     /// Returns true if the absolute difference of all elements between `self` and `rhs`
286     /// is less than or equal to `max_abs_diff`.
287     ///
288     /// This can be used to compare if two 3x4 matrices contain similar elements. It works
289     /// best when comparing with a known value. The `max_abs_diff` that should be used used
290     /// depends on the values being compared against.
291     ///
292     /// For more see
293     /// [comparing floating point numbers](https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/).
294     #[inline]
295     #[must_use]
abs_diff_eq(&self, rhs: Self, max_abs_diff: f32) -> bool296     pub fn abs_diff_eq(&self, rhs: Self, max_abs_diff: f32) -> bool {
297         self.matrix2.abs_diff_eq(rhs.matrix2, max_abs_diff)
298             && self.translation.abs_diff_eq(rhs.translation, max_abs_diff)
299     }
300 
301     /// Return the inverse of this transform.
302     ///
303     /// Note that if the transform is not invertible the result will be invalid.
304     #[inline]
305     #[must_use]
inverse(&self) -> Self306     pub fn inverse(&self) -> Self {
307         let matrix2 = self.matrix2.inverse();
308         // transform negative translation by the matrix inverse:
309         let translation = -(matrix2 * self.translation);
310 
311         Self {
312             matrix2,
313             translation,
314         }
315     }
316 }
317 
318 impl Default for Affine2 {
319     #[inline(always)]
default() -> Self320     fn default() -> Self {
321         Self::IDENTITY
322     }
323 }
324 
325 impl Deref for Affine2 {
326     type Target = crate::deref::Cols3<Vec2>;
327     #[inline(always)]
deref(&self) -> &Self::Target328     fn deref(&self) -> &Self::Target {
329         unsafe { &*(self as *const Self as *const Self::Target) }
330     }
331 }
332 
333 impl DerefMut for Affine2 {
334     #[inline(always)]
deref_mut(&mut self) -> &mut Self::Target335     fn deref_mut(&mut self) -> &mut Self::Target {
336         unsafe { &mut *(self as *mut Self as *mut Self::Target) }
337     }
338 }
339 
340 impl PartialEq for Affine2 {
341     #[inline]
eq(&self, rhs: &Self) -> bool342     fn eq(&self, rhs: &Self) -> bool {
343         self.matrix2.eq(&rhs.matrix2) && self.translation.eq(&rhs.translation)
344     }
345 }
346 
347 #[cfg(not(target_arch = "spirv"))]
348 impl core::fmt::Debug for Affine2 {
fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result349     fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
350         fmt.debug_struct(stringify!(Affine2))
351             .field("matrix2", &self.matrix2)
352             .field("translation", &self.translation)
353             .finish()
354     }
355 }
356 
357 #[cfg(not(target_arch = "spirv"))]
358 impl core::fmt::Display for Affine2 {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result359     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
360         write!(
361             f,
362             "[{}, {}, {}]",
363             self.matrix2.x_axis, self.matrix2.y_axis, self.translation
364         )
365     }
366 }
367 
368 impl<'a> core::iter::Product<&'a Self> for Affine2 {
product<I>(iter: I) -> Self where I: Iterator<Item = &'a Self>,369     fn product<I>(iter: I) -> Self
370     where
371         I: Iterator<Item = &'a Self>,
372     {
373         iter.fold(Self::IDENTITY, |a, &b| a * b)
374     }
375 }
376 
377 impl Mul for Affine2 {
378     type Output = Affine2;
379 
380     #[inline]
mul(self, rhs: Affine2) -> Self::Output381     fn mul(self, rhs: Affine2) -> Self::Output {
382         Self {
383             matrix2: self.matrix2 * rhs.matrix2,
384             translation: self.matrix2 * rhs.translation + self.translation,
385         }
386     }
387 }
388 
389 impl MulAssign for Affine2 {
390     #[inline]
mul_assign(&mut self, rhs: Affine2)391     fn mul_assign(&mut self, rhs: Affine2) {
392         *self = self.mul(rhs);
393     }
394 }
395 
396 impl From<Affine2> for Mat3 {
397     #[inline]
from(m: Affine2) -> Mat3398     fn from(m: Affine2) -> Mat3 {
399         Self::from_cols(
400             m.matrix2.x_axis.extend(0.0),
401             m.matrix2.y_axis.extend(0.0),
402             m.translation.extend(1.0),
403         )
404     }
405 }
406 
407 impl Mul<Mat3> for Affine2 {
408     type Output = Mat3;
409 
410     #[inline]
mul(self, rhs: Mat3) -> Self::Output411     fn mul(self, rhs: Mat3) -> Self::Output {
412         Mat3::from(self) * rhs
413     }
414 }
415 
416 impl Mul<Affine2> for Mat3 {
417     type Output = Mat3;
418 
419     #[inline]
mul(self, rhs: Affine2) -> Self::Output420     fn mul(self, rhs: Affine2) -> Self::Output {
421         self * Mat3::from(rhs)
422     }
423 }
424 
425 impl From<Affine2> for Mat3A {
426     #[inline]
from(m: Affine2) -> Mat3A427     fn from(m: Affine2) -> Mat3A {
428         Self::from_cols(
429             Vec3A::from((m.matrix2.x_axis, 0.0)),
430             Vec3A::from((m.matrix2.y_axis, 0.0)),
431             Vec3A::from((m.translation, 1.0)),
432         )
433     }
434 }
435 
436 impl Mul<Mat3A> for Affine2 {
437     type Output = Mat3A;
438 
439     #[inline]
mul(self, rhs: Mat3A) -> Self::Output440     fn mul(self, rhs: Mat3A) -> Self::Output {
441         Mat3A::from(self) * rhs
442     }
443 }
444 
445 impl Mul<Affine2> for Mat3A {
446     type Output = Mat3A;
447 
448     #[inline]
mul(self, rhs: Affine2) -> Self::Output449     fn mul(self, rhs: Affine2) -> Self::Output {
450         self * Mat3A::from(rhs)
451     }
452 }
453