Skip to main content

grafix_toolbox/kit/policies/math/cast/
matrix.rs

1use super::super::pre::*;
2
3impl<T: Copy> Cast<mat4<T>> for mat3<T> {
4	#[inline(always)]
5	fn to(((v11, v12, v13, _), (v21, v22, v23, _), (v31, v32, v33, _), _): mat4<T>) -> Self {
6		((v11, v12, v13), (v21, v22, v23), (v31, v32, v33))
7	}
8}
9impl<T: Copy> Cast<mat4<T>> for mat2<T> {
10	#[inline(always)]
11	fn to(((v11, v12, ..), (v21, v22, ..), ..): mat4<T>) -> Self {
12		((v11, v12), (v21, v22))
13	}
14}
15impl<T: Copy> Cast<mat3<T>> for mat2<T> {
16	#[inline(always)]
17	fn to(((v11, v12, _), (v21, v22, _), _): mat3<T>) -> Self {
18		((v11, v12), (v21, v22))
19	}
20}
21impl<T: Copy + Cast<u32>> Cast<mat2<T>> for mat3<T> {
22	#[inline(always)]
23	fn to(((v11, v12), (v21, v22)): mat2<T>) -> Self {
24		let (z, o) = <(T, T)>::to((0, 1));
25		((v11, v12, z), (v21, v22, z), (z, z, o))
26	}
27}
28impl<T: Copy + Cast<u32>> Cast<mat2<T>> for mat4<T> {
29	#[inline(always)]
30	fn to(((v11, v12), (v21, v22)): mat2<T>) -> Self {
31		let (z, o) = <(T, T)>::to((0, 1));
32		((v11, v12, z, z), (v21, v22, z, z), (z, z, o, z), (z, z, z, o))
33	}
34}
35impl<T: Copy + Cast<u32>> Cast<mat3<T>> for mat4<T> {
36	#[inline(always)]
37	fn to(((v11, v12, v13), (v21, v22, v23), (v31, v32, v33)): mat3<T>) -> Self {
38		let (z, o) = <(T, T)>::to((0, 1));
39		((v11, v12, v13, z), (v21, v22, v23, z), (v31, v32, v33, z), (z, z, z, o))
40	}
41}
42
43pub trait FlattenCast<T> {
44	fn flatten(self) -> Vec<T>;
45}
46impl<T: Copy> FlattenCast<T> for &[vec2<T>] {
47	#[inline(always)]
48	fn flatten(self) -> Vec<T> {
49		self.iter().flat_map(|&(x, y)| [x, y]).collect()
50	}
51}
52impl<T: Copy> FlattenCast<T> for &[vec3<T>] {
53	#[inline(always)]
54	fn flatten(self) -> Vec<T> {
55		self.iter().flat_map(|&(x, y, z)| [x, y, z]).collect()
56	}
57}
58impl<T: Copy> FlattenCast<T> for &[vec4<T>] {
59	#[inline(always)]
60	fn flatten(self) -> Vec<T> {
61		self.iter().flat_map(|&(x, y, z, a)| [x, y, z, a]).collect()
62	}
63}
64impl<T: Copy> FlattenCast<T> for vec2<T> {
65	#[inline(always)]
66	fn flatten(self) -> Vec<T> {
67		vec![self.0, self.1]
68	}
69}
70impl<T: Copy> FlattenCast<T> for vec3<T> {
71	#[inline(always)]
72	fn flatten(self) -> Vec<T> {
73		vec![self.0, self.1, self.2]
74	}
75}
76impl<T: Copy> FlattenCast<T> for vec4<T> {
77	#[inline(always)]
78	fn flatten(self) -> Vec<T> {
79		vec![self.0, self.1, self.2, self.3]
80	}
81}
82
83pub trait FlattenCastMat<T> {
84	fn flatten_all(self) -> Vec<T>;
85}
86impl<N: Copy, T: FlattenCast<N>> FlattenCastMat<N> for vec2<T> {
87	#[inline(always)]
88	fn flatten_all(self) -> Vec<N> {
89		[self.0.flatten(), self.1.flatten()].concat()
90	}
91}
92impl<N: Copy, T: FlattenCast<N>> FlattenCastMat<N> for vec3<T> {
93	#[inline(always)]
94	fn flatten_all(self) -> Vec<N> {
95		[self.0.flatten(), self.1.flatten(), self.2.flatten()].concat()
96	}
97}
98impl<N: Copy, T: FlattenCast<N>> FlattenCastMat<N> for vec4<T> {
99	#[inline(always)]
100	fn flatten_all(self) -> Vec<N> {
101		[self.0.flatten(), self.1.flatten(), self.2.flatten(), self.3.flatten()].concat()
102	}
103}