geng_utils/
conversions.rs

1use geng::prelude::{mat3, r32, vec2, Float, R32, R64};
2
3/// A trait for converting into an [R32].
4pub trait RealConversions {
5    fn as_r32(&self) -> R32;
6}
7
8impl<T: Float> RealConversions for T {
9    fn as_r32(&self) -> R32 {
10        r32(self.as_f32())
11    }
12}
13
14/// A trait for converting [vec2]'s inner types between [f32] and [R32].
15pub trait Vec2RealConversions {
16    fn as_f32(&self) -> vec2<f32>;
17    fn as_r32(&self) -> vec2<R32>;
18}
19
20/// A trait for converting [mat3]'s inner types between [f32] and [R32].
21pub trait Mat3RealConversions {
22    fn as_f32(&self) -> mat3<f32>;
23    fn as_r32(&self) -> mat3<R32>;
24}
25
26// impl<T: Float> Vec2RealConversions for vec2<T> {
27//     fn as_f32(&self) -> vec2<f32> {
28//         self.map(|x| x.as_f32())
29//     }
30//     fn as_r32(&self) -> vec2<R32> {
31//         self.map(|x| r32(x.as_f32()))
32//     }
33// }
34
35macro_rules! impl_vec2_lossy {
36    ($t:ident) => {
37        impl Vec2RealConversions for vec2<$t> {
38            fn as_f32(&self) -> vec2<f32> {
39                self.map(|x| x as f32)
40            }
41            fn as_r32(&self) -> vec2<R32> {
42                self.map(|x| r32(x as f32))
43            }
44        }
45    };
46}
47
48macro_rules! impl_vec2_float {
49    ($t:ident) => {
50        impl Vec2RealConversions for vec2<$t> {
51            fn as_f32(&self) -> vec2<f32> {
52                self.map(|x| x.as_f32())
53            }
54            fn as_r32(&self) -> vec2<R32> {
55                self.map(|x| r32(x.as_f32()))
56            }
57        }
58    };
59}
60
61impl_vec2_lossy!(usize);
62impl_vec2_lossy!(u8);
63impl_vec2_lossy!(u16);
64impl_vec2_lossy!(u32);
65impl_vec2_lossy!(u64);
66impl_vec2_lossy!(u128);
67impl_vec2_lossy!(isize);
68impl_vec2_lossy!(i8);
69impl_vec2_lossy!(i16);
70impl_vec2_lossy!(i32);
71impl_vec2_lossy!(i64);
72impl_vec2_lossy!(i128);
73
74impl_vec2_float!(f32);
75impl_vec2_float!(f64);
76impl_vec2_float!(R32);
77impl_vec2_float!(R64);
78
79impl<T: Float> Mat3RealConversions for mat3<T> {
80    fn as_f32(&self) -> mat3<f32> {
81        self.map(|x| x.as_f32())
82    }
83    fn as_r32(&self) -> mat3<R32> {
84        self.map(|x| r32(x.as_f32()))
85    }
86}