mew/
shaderprimitive.rs

1#![allow(non_camel_case_types)]
2
3use std::ops::{ Deref, DerefMut, };
4
5
6macro_rules! primitive {
7    { $name:ident [ $ty:ty ; $len:literal ] => $align:literal } => {
8        #[derive(Clone, Copy, Debug)]
9        #[repr(align($align))]
10        pub struct $name([$ty; $len]);
11
12        impl $name {
13            pub const BYTES: usize = size_of::<$ty>() * $len;
14            //const PADDING: usize = Self::BYTES.next_multiple_of($crate::wgpu::VERTEX_STRIDE_ALIGNMENT as usize) - Self::BYTES;
15        }
16
17        impl $crate::shaderprimitive::MewShaderPrimitive for $name {
18            type Bytes = [u8; Self::BYTES];
19            type Inner = [$ty; $len];
20
21            fn from_inner(inner: Self::Inner) -> Self {
22                //value.iter_mut().for_each(|val| *val = ::std::mem::transmute(val.to_le_bytes()));
23                Self(inner)
24            }
25
26            fn from_bytes(bytes: Self::Bytes) -> Self {
27                unsafe { Self(::std::mem::transmute(bytes)) }
28            }
29
30            fn zeroed() -> Self {
31                unsafe { Self(::std::mem::zeroed()) }
32            }
33        }
34
35        impl From<[u8; Self::BYTES]> for $name {
36            fn from(bytes: [u8; Self::BYTES]) -> Self {
37                Self::from_bytes(bytes)
38            }
39        }
40        impl From<[$ty; $len]> for $name {
41            fn from(inner: [$ty; $len]) -> Self {
42                Self::from_inner(inner)
43            }
44        }
45
46        impl Deref for $name {
47            type Target = [$ty; $len];
48            fn deref(&self) -> &Self::Target {
49                &self.0
50            }
51        }
52        impl DerefMut for $name {
53            fn deref_mut(&mut self) -> &mut Self::Target {
54                &mut self.0
55            }
56        }
57
58        impl AsRef<[u8; Self::BYTES]> for $name {
59            fn as_ref(&self) -> &[u8; Self::BYTES] {
60                unsafe { ::std::mem::transmute(&self.0) }
61            }
62        }
63        impl AsMut<[u8; Self::BYTES]> for $name {
64            fn as_mut(&mut self) -> &mut [u8; Self::BYTES] {
65                unsafe { ::std::mem::transmute(&mut self.0) }
66            }
67        }
68
69        impl Default for $name {
70            fn default() -> Self {
71                Self::zeroed()
72            }
73        }
74    };
75}
76
77primitive! { I32 [i32; 1] => 4 }
78primitive! { U32 [u32; 1] => 4 }
79primitive! { F32 [f32; 1] => 4 }
80
81primitive! { Vec2i [i32; 2] => 8 }
82primitive! { Vec2u [u32; 2] => 8 }
83primitive! { Vec2f [f32; 2] => 8 }
84
85primitive! { Vec3i [i32; 3] => 16 }
86primitive! { Vec3u [u32; 3] => 16 }
87primitive! { Vec3f [f32; 3] => 16 }
88
89primitive! { Vec4i [i32; 4] => 16 }
90primitive! { Vec4u [u32; 4] => 16 }
91primitive! { Vec4f [f32; 4] => 16 }
92
93
94primitive! { Mat2x2i [[i32; 2]; 2] => 16 }
95primitive! { Mat2x2u [[u32; 2]; 2] => 16 }
96primitive! { Mat2x2f [[f32; 2]; 2] => 16 }
97
98primitive! { Mat3x2i [[i32; 2]; 3] => 32 }
99primitive! { Mat3x2u [[u32; 2]; 3] => 32 }
100primitive! { Mat3x2f [[f32; 2]; 3] => 32 }
101
102primitive! { Mat4x2i [[i32; 2]; 4] => 32 }
103primitive! { Mat4x2u [[u32; 2]; 4] => 32 }
104primitive! { Mat4x2f [[f32; 2]; 4] => 32 }
105
106
107primitive! { Mat2x3i [[i32; 3]; 2] => 32 }
108primitive! { Mat2x3u [[u32; 3]; 2] => 32 }
109primitive! { Mat2x3f [[f32; 3]; 2] => 32 }
110
111primitive! { Mat3x3i [[i32; 3]; 3] => 64 }
112primitive! { Mat3x3u [[u32; 3]; 3] => 64 }
113primitive! { Mat3x3f [[f32; 3]; 3] => 64 }
114
115primitive! { Mat4x3i [[i32; 3]; 4] => 64 }
116primitive! { Mat4x3u [[u32; 3]; 4] => 64 }
117primitive! { Mat4x3f [[f32; 3]; 4] => 64 }
118
119
120primitive! { Mat2x4i [[i32; 4]; 2] => 32 }
121primitive! { Mat2x4u [[u32; 4]; 2] => 32 }
122primitive! { Mat2x4f [[f32; 4]; 2] => 32 }
123
124primitive! { Mat3x4i [[i32; 4]; 3] => 64 }
125primitive! { Mat3x4u [[u32; 4]; 3] => 64 }
126primitive! { Mat3x4f [[f32; 4]; 3] => 64 }
127
128primitive! { Mat4x4i [[i32; 4]; 4] => 64 }
129primitive! { Mat4x4u [[u32; 4]; 4] => 64 }
130primitive! { Mat4x4f [[f32; 4]; 4] => 64 }
131
132
133pub trait MewShaderPrimitive {
134    type Bytes;
135    type Inner;
136    fn from_inner(inner: Self::Inner) -> Self;
137    fn from_bytes(bytes: Self::Bytes) -> Self;
138    fn zeroed() -> Self;
139}