vec2/
transform.rs

1use core::ops::{Add, Div, Mul};
2
3use num_traits::real::Real;
4use num_traits::{One, Zero};
5
6/// # Example
7/// ```
8/// use std::f32::consts::FRAC_PI_2;
9/// let mut v = vec2::new_zero();
10/// vec2::transform_angle(&mut v, &[0_f32, 1_f32], &FRAC_PI_2);
11/// let c = FRAC_PI_2.cos();
12/// let s = FRAC_PI_2.sin();
13/// assert_eq!(v, [0_f32 * c - 1_f32 * s, 0_f32 * s + 1_f32 * c]);
14/// ```
15#[inline]
16pub fn transform_angle<'out, T>(out: &'out mut [T; 2], v: &[T; 2], a: &T) -> &'out mut [T; 2]
17where
18    T: Real,
19    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
20{
21    let c = a.cos();
22    let s = a.sin();
23
24    out[0] = &v[0] * &c - &v[1] * &s;
25    out[1] = &v[0] * &s + &v[1] * &c;
26    out
27}
28/// # Example
29/// ```
30/// use std::f32::consts::FRAC_PI_2;
31/// let mut v = [0_f32, 1_f32];
32/// vec2::transform_angle_mut(&mut v, &FRAC_PI_2);
33/// let c = FRAC_PI_2.cos();
34/// let s = FRAC_PI_2.sin();
35/// assert_eq!(v, [0_f32 * c - 1_f32 * s, 0_f32 * s + 1_f32 * c]);
36/// ```
37#[inline]
38pub fn transform_angle_mut<'out, T>(out: &'out mut [T; 2], a: &T) -> &'out mut [T; 2]
39where
40    T: Real,
41    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
42{
43    let tmp = out.clone();
44    transform_angle(out, &tmp, a)
45}
46/// # Example
47/// ```
48/// let mut v = vec2::new_zero();
49/// vec2::transform_mat2(&mut v, &vec2::new_one(), &[1_f32, 0_f32, 0_f32, 1_f32]);
50/// assert_eq!(v, vec2::new_one());
51/// ```
52#[inline]
53pub fn transform_mat2<'out, T>(out: &'out mut [T; 2], v: &[T; 2], m: &[T; 4]) -> &'out mut [T; 2]
54where
55    T: Clone + Add<T, Output = T>,
56    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
57{
58    out[0] = &v[0] * &m[0] + &v[1] * &m[2];
59    out[1] = &v[0] * &m[1] + &v[1] * &m[3];
60    out
61}
62/// # Example
63/// ```
64/// let mut v = vec2::new_one();
65/// vec2::transform_mat2_mut(&mut v, &[1_f32, 0_f32, 0_f32, 1_f32]);
66/// assert_eq!(v, vec2::new_one());
67/// ```
68#[inline]
69pub fn transform_mat2_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 4]) -> &'out mut [T; 2]
70where
71    T: Clone + Add<T, Output = T>,
72    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
73{
74    let tmp = out.clone();
75    transform_mat2(out, &tmp, m)
76}
77/// # Example
78/// ```
79/// let mut v = vec2::new_zero();
80/// vec2::transform_mat3(&mut v, &vec2::new_one(),
81///     &[1_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 1_f32],
82/// );
83/// assert_eq!(v, vec2::new_one());
84/// ```
85#[inline]
86pub fn transform_mat3<'out, T>(out: &'out mut [T; 2], v: &[T; 2], m: &[T; 9]) -> &'out mut [T; 2]
87where
88    T: Add<T, Output = T>,
89    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
90{
91    out[0] = &v[0] * &m[0] + &v[1] * &m[3];
92    out[1] = &v[0] * &m[1] + &v[1] * &m[4];
93    out
94}
95/// # Example
96/// ```
97/// let mut v = vec2::new_one();
98/// vec2::transform_mat3_mut(&mut v,
99///     &[1_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 1_f32],
100/// );
101/// assert_eq!(v, vec2::new_one());
102/// ```
103#[inline]
104pub fn transform_mat3_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 9]) -> &'out mut [T; 2]
105where
106    T: Clone + Add<T, Output = T>,
107    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
108{
109    let tmp = out.clone();
110    transform_mat3(out, &tmp, m)
111}
112/// # Example
113/// ```
114/// let mut v = vec2::new_zero();
115/// vec2::transform_mat4(&mut v, &vec2::new_one(),
116///     &[1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32]
117/// );
118/// assert_eq!(v, vec2::new_one());
119/// ```
120#[inline]
121pub fn transform_mat4<'out, T>(out: &'out mut [T; 2], v: &[T; 2], m: &[T; 16]) -> &'out mut [T; 2]
122where
123    T: Clone + Add<T, Output = T>,
124    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
125{
126    out[0] = &v[0] * &m[0] + &v[1] * &m[4] + m[12].clone();
127    out[1] = &v[0] * &m[1] + &v[1] * &m[5] + m[13].clone();
128    out
129}
130/// # Example
131/// ```
132/// let mut v = vec2::new_one();
133/// vec2::transform_mat4_mut(&mut v,
134///     &[1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32]
135/// );
136/// assert_eq!(v, vec2::new_one());
137/// ```
138#[inline]
139pub fn transform_mat4_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 16]) -> &'out mut [T; 2]
140where
141    T: Clone + Add<T, Output = T>,
142    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
143{
144    let tmp = out.clone();
145    transform_mat4(out, &tmp, m)
146}
147/// # Example
148/// ```
149/// let mut v = vec2::new_zero();
150/// vec2::transform_mat4_rotation(&mut v, &vec2::new_one(),
151///     &[1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32]
152/// );
153/// assert_eq!(v, vec2::new_one());
154/// ```
155#[inline]
156pub fn transform_mat4_rotation<'out, T>(
157    out: &'out mut [T; 2],
158    v: &[T; 2],
159    m: &[T; 16],
160) -> &'out mut [T; 2]
161where
162    T: Clone + Add<T, Output = T>,
163    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
164{
165    out[0] = &v[0] * &m[0] + &v[1] * &m[4];
166    out[1] = &v[0] * &m[1] + &v[1] * &m[5];
167    out
168}
169/// # Example
170/// ```
171/// let mut v = vec2::new_one();
172/// vec2::transform_mat4_rotation_mut(&mut v,
173///     &[1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32]
174/// );
175/// assert_eq!(v, vec2::new_one());
176/// ```
177#[inline]
178pub fn transform_mat4_rotation_mut<'out, T>(out: &'out mut [T; 2], m: &[T; 16]) -> &'out mut [T; 2]
179where
180    T: Clone + Add<T, Output = T>,
181    for<'a, 'b> &'a T: Mul<&'b T, Output = T>,
182{
183    let tmp = out.clone();
184    transform_mat4(out, &tmp, m)
185}
186/// # Example
187/// ```
188/// let mut v = vec2::new_zero();
189/// vec2::transform_mat4_projection(&mut v, &vec2::new_one(),
190///     &[1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32]
191/// );
192/// assert_eq!(v, vec2::new_one());
193/// ```
194#[inline]
195pub fn transform_mat4_projection<'out, T>(
196    out: &'out mut [T; 2],
197    v: &[T; 2],
198    m: &[T; 16],
199) -> &'out mut [T; 2]
200where
201    T: Clone + One + Zero + Add<T, Output = T>,
202    for<'a, 'b> &'a T: Div<&'b T, Output = T> + Mul<&'b T, Output = T>,
203{
204    let d = &v[0] * &m[3] + &v[1] * &m[7] + m[15].clone();
205    let inv_d = if d.is_zero() { d } else { &T::one() / &d };
206
207    out[0] = &(&v[0] * &m[0] + &v[1] * &m[4] + m[12].clone()) * &inv_d;
208    out[1] = &(&v[0] * &m[1] + &v[1] * &m[5] + m[13].clone()) * &inv_d;
209    out
210}
211/// # Example
212/// ```
213/// let mut v = vec2::new_one();
214/// vec2::transform_mat4_projection_mut(&mut v,
215///     &[1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32, 0_f32, 0_f32, 0_f32, 0_f32, 1_f32]
216/// );
217/// assert_eq!(v, vec2::new_one());
218/// ```
219#[inline]
220pub fn transform_mat4_projection_mut<'out, T>(
221    out: &'out mut [T; 2],
222    m: &[T; 16],
223) -> &'out mut [T; 2]
224where
225    T: Clone + One + Zero + Add<T, Output = T>,
226    for<'a, 'b> &'a T: Div<&'b T, Output = T> + Mul<&'b T, Output = T>,
227{
228    let tmp = out.clone();
229    transform_mat4_projection(out, &tmp, m)
230}