grafix_toolbox/kit/policies/math/cast/
matrix.rs1use 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}