1#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
19#[repr(C)]
20pub struct Vec3I16 {
21 pub x: i16,
23 pub y: i16,
25 pub z: i16,
27}
28
29impl Vec3I16 {
30 pub const ZERO: Self = Self { x: 0, y: 0, z: 0 };
32
33 #[inline(always)]
35 pub const fn new(x: i16, y: i16, z: i16) -> Self {
36 Self { x, y, z }
37 }
38
39 #[inline(always)]
42 pub const fn xy_packed(self) -> u32 {
43 ((self.y as u16 as u32) << 16) | (self.x as u16 as u32)
44 }
45
46 #[inline(always)]
48 pub const fn z_packed(self) -> u32 {
49 self.z as i32 as u32
50 }
51}
52
53#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
57#[repr(C)]
58pub struct Vec3I32 {
59 pub x: i32,
61 pub y: i32,
63 pub z: i32,
65}
66
67impl Vec3I32 {
68 pub const ZERO: Self = Self { x: 0, y: 0, z: 0 };
70
71 #[inline(always)]
73 pub const fn new(x: i32, y: i32, z: i32) -> Self {
74 Self { x, y, z }
75 }
76}
77
78#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
81#[repr(C)]
82pub struct Mat3I16 {
83 pub m: [[i16; 3]; 3],
85}
86
87impl Mat3I16 {
88 pub const ZERO: Self = Self { m: [[0; 3]; 3] };
90
91 pub const IDENTITY: Self = Self {
93 m: [[0x1000, 0, 0], [0, 0x1000, 0], [0, 0, 0x1000]],
94 };
95
96 #[inline(always)]
98 pub const fn row(&self, i: usize) -> [i16; 3] {
99 self.m[i]
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use super::*;
106
107 #[test]
108 fn identity_diagonal_is_one_in_1_3_12() {
109 assert_eq!(Mat3I16::IDENTITY.m[0][0], 0x1000);
111 assert_eq!(Mat3I16::IDENTITY.m[1][1], 0x1000);
112 assert_eq!(Mat3I16::IDENTITY.m[2][2], 0x1000);
113 assert_eq!(Mat3I16::IDENTITY.m[0][1], 0);
115 assert_eq!(Mat3I16::IDENTITY.m[1][2], 0);
116 }
117
118 #[test]
119 fn vec3_i16_xy_packs_little_endian() {
120 let v = Vec3I16::new(-1, 2, 3);
122 assert_eq!(v.xy_packed(), 0x0002_FFFF);
123 }
124
125 #[test]
126 fn vec3_i16_z_sign_extends() {
127 let v = Vec3I16::new(0, 0, -1);
128 assert_eq!(v.z_packed(), 0xFFFF_FFFF);
129 }
130
131 #[test]
132 fn vec3_i32_construct_and_fields() {
133 let t = Vec3I32::new(100, 200, 300);
134 assert_eq!(t.x, 100);
135 assert_eq!(t.y, 200);
136 assert_eq!(t.z, 300);
137 }
138
139 #[test]
140 fn zero_constants_are_zero() {
141 assert_eq!(Vec3I16::ZERO.x, 0);
142 assert_eq!(Vec3I16::ZERO.y, 0);
143 assert_eq!(Vec3I16::ZERO.z, 0);
144 assert_eq!(Vec3I32::ZERO.x, 0);
145 assert_eq!(Mat3I16::ZERO.m[0][0], 0);
146 }
147}