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 }
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 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}