1use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
2
3use bytes_kman::prelude::*;
4
5#[derive(Bytes)]
6pub struct vec4<T>(pub T, pub T, pub T, pub T);
7
8impl<T: Clone> From<T> for vec4<T> {
9 fn from(value: T) -> Self {
10 Self::new(value.clone(), value.clone(), value.clone(), value)
11 }
12}
13
14impl<T> From<(T, T, T, T)> for vec4<T> {
15 fn from(value: (T, T, T, T)) -> Self {
16 Self::new(value.0, value.1, value.2, value.3)
17 }
18}
19
20impl<T: Clone> From<(&T, &T, &T, &T)> for vec4<T> {
21 fn from(value: (&T, &T, &T, &T)) -> Self {
22 Self::new(
23 value.0.clone(),
24 value.1.clone(),
25 value.2.clone(),
26 value.3.clone(),
27 )
28 }
29}
30
31impl<T: Clone> From<(&mut T, &mut T, &mut T, &mut T)> for vec4<T> {
32 fn from(value: (&mut T, &mut T, &mut T, &mut T)) -> Self {
33 Self::new(
34 value.0.clone(),
35 value.1.clone(),
36 value.2.clone(),
37 value.3.clone(),
38 )
39 }
40}
41
42impl<T: TBytes + Copy> Copy for vec4<T> {}
43
44impl<T> vec4<T> {
45 pub fn new(x: T, y: T, z: T, w: T) -> Self {
46 Self(x, y, z, w)
47 }
48
49 pub fn x(&self) -> &T {
50 &self.0
51 }
52
53 pub fn y(&self) -> &T {
54 &self.1
55 }
56
57 pub fn z(&self) -> &T {
58 &self.2
59 }
60
61 pub fn w(&self) -> &T {
62 &self.3
63 }
64
65 pub fn xy(&self) -> (&T, &T) {
66 (self.x(), self.y())
67 }
68 pub fn yx(&self) -> (&T, &T) {
69 (self.y(), self.x())
70 }
71
72 pub fn xz(&self) -> (&T, &T) {
73 (self.x(), self.z())
74 }
75 pub fn zx(&self) -> (&T, &T) {
76 (self.z(), self.x())
77 }
78
79 pub fn yz(&self) -> (&T, &T) {
80 (self.y(), self.z())
81 }
82 pub fn zy(&self) -> (&T, &T) {
83 (self.z(), self.y())
84 }
85
86 pub fn xyz(&self) -> (&T, &T, &T) {
87 (self.x(), self.y(), self.z())
88 }
89 pub fn zxy(&self) -> (&T, &T, &T) {
90 (self.z(), self.x(), self.y())
91 }
92 pub fn yzx(&self) -> (&T, &T, &T) {
93 (self.y(), self.z(), self.x())
94 }
95
96 pub fn yxz(&self) -> (&T, &T, &T) {
97 (self.y(), self.x(), self.z())
98 }
99 pub fn zyx(&self) -> (&T, &T, &T) {
100 (self.z(), self.y(), self.x())
101 }
102 pub fn xzy(&self) -> (&T, &T, &T) {
103 (self.x(), self.z(), self.y())
104 }
105
106 pub fn xw(&self) -> (&T, &T) {
107 (self.x(), self.w())
108 }
109 pub fn wx(&self) -> (&T, &T) {
110 (self.w(), self.x())
111 }
112
113 pub fn zw(&self) -> (&T, &T) {
114 (self.z(), self.w())
115 }
116 pub fn wz(&self) -> (&T, &T) {
117 (self.w(), self.z())
118 }
119
120 pub fn xyw(&self) -> (&T, &T, &T) {
121 (self.x(), self.y(), self.w())
122 }
123 pub fn wxy(&self) -> (&T, &T, &T) {
124 (self.w(), self.x(), self.y())
125 }
126 pub fn ywx(&self) -> (&T, &T, &T) {
127 (self.y(), self.w(), self.x())
128 }
129
130 pub fn yxw(&self) -> (&T, &T, &T) {
131 (self.y(), self.x(), self.w())
132 }
133 pub fn wyx(&self) -> (&T, &T, &T) {
134 (self.w(), self.y(), self.x())
135 }
136 pub fn xwy(&self) -> (&T, &T, &T) {
137 (self.x(), self.w(), self.y())
138 }
139
140 pub fn xwz(&self) -> (&T, &T, &T) {
141 (self.x(), self.w(), self.z())
142 }
143 pub fn zxw(&self) -> (&T, &T, &T) {
144 (self.z(), self.x(), self.w())
145 }
146 pub fn wzx(&self) -> (&T, &T, &T) {
147 (self.w(), self.z(), self.x())
148 }
149
150 pub fn wxz(&self) -> (&T, &T, &T) {
151 (self.w(), self.x(), self.z())
152 }
153 pub fn zwx(&self) -> (&T, &T, &T) {
154 (self.z(), self.w(), self.x())
155 }
156 pub fn xzw(&self) -> (&T, &T, &T) {
157 (self.x(), self.z(), self.w())
158 }
159
160 pub fn xyzw(&self) -> (&T, &T, &T, &T) {
161 (self.x(), self.y(), self.z(), self.w())
162 }
163 pub fn wxyz(&self) -> (&T, &T, &T, &T) {
164 (self.w(), self.x(), self.y(), self.z())
165 }
166 pub fn zwxy(&self) -> (&T, &T, &T, &T) {
167 (self.z(), self.w(), self.x(), self.y())
168 }
169 pub fn yzwx(&self) -> (&T, &T, &T, &T) {
170 (self.y(), self.z(), self.w(), self.x())
171 }
172
173 pub fn yxzw(&self) -> (&T, &T, &T, &T) {
174 (self.y(), self.x(), self.z(), self.w())
175 }
176 pub fn wyxz(&self) -> (&T, &T, &T, &T) {
177 (self.w(), self.y(), self.x(), self.z())
178 }
179 pub fn zwyx(&self) -> (&T, &T, &T, &T) {
180 (self.z(), self.w(), self.y(), self.x())
181 }
182 pub fn xzwy(&self) -> (&T, &T, &T, &T) {
183 (self.x(), self.z(), self.w(), self.y())
184 }
185
186 pub fn xywz(&self) -> (&T, &T, &T, &T) {
187 (self.x(), self.y(), self.w(), self.z())
188 }
189 pub fn zxyw(&self) -> (&T, &T, &T, &T) {
190 (self.z(), self.x(), self.y(), self.w())
191 }
192 pub fn wzxy(&self) -> (&T, &T, &T, &T) {
193 (self.w(), self.z(), self.x(), self.y())
194 }
195 pub fn ywzx(&self) -> (&T, &T, &T, &T) {
196 (self.y(), self.w(), self.z(), self.x())
197 }
198
199 pub fn xzyw(&self) -> (&T, &T, &T, &T) {
200 (self.x(), self.z(), self.y(), self.w())
201 }
202 pub fn wxzy(&self) -> (&T, &T, &T, &T) {
203 (self.w(), self.x(), self.z(), self.y())
204 }
205 pub fn ywxz(&self) -> (&T, &T, &T, &T) {
206 (self.y(), self.w(), self.x(), self.z())
207 }
208 pub fn zywx(&self) -> (&T, &T, &T, &T) {
209 (self.z(), self.y(), self.w(), self.x())
210 }
211
212 pub fn wyzx(&self) -> (&T, &T, &T, &T) {
213 (self.w(), self.y(), self.z(), self.x())
214 }
215 pub fn xwyz(&self) -> (&T, &T, &T, &T) {
216 (self.x(), self.w(), self.y(), self.z())
217 }
218 pub fn zxwy(&self) -> (&T, &T, &T, &T) {
219 (self.z(), self.x(), self.w(), self.y())
220 }
221 pub fn yzxw(&self) -> (&T, &T, &T, &T) {
222 (self.y(), self.z(), self.x(), self.w())
223 }
224
225 pub fn xwzy(&self) -> (&T, &T, &T, &T) {
226 (self.x(), self.w(), self.z(), self.y())
227 }
228 pub fn yxwz(&self) -> (&T, &T, &T, &T) {
229 (self.y(), self.x(), self.w(), self.z())
230 }
231 pub fn zyxw(&self) -> (&T, &T, &T, &T) {
232 (self.z(), self.y(), self.x(), self.w())
233 }
234 pub fn wzyx(&self) -> (&T, &T, &T, &T) {
235 (self.w(), self.z(), self.y(), self.x())
236 }
237
238 pub fn r(&self) -> &T {
239 self.x()
240 }
241 pub fn g(&self) -> &T {
242 self.y()
243 }
244 pub fn b(&self) -> &T {
245 self.z()
246 }
247 pub fn a(&self) -> &T {
248 self.w()
249 }
250
251 pub fn rg(&self) -> (&T, &T) {
252 self.xy()
253 }
254 pub fn gr(&self) -> (&T, &T) {
255 self.yx()
256 }
257
258 pub fn rb(&self) -> (&T, &T) {
259 self.xz()
260 }
261 pub fn br(&self) -> (&T, &T) {
262 self.zx()
263 }
264
265 pub fn rgb(&self) -> (&T, &T, &T) {
266 self.xyz()
267 }
268 pub fn brg(&self) -> (&T, &T, &T) {
269 self.zxy()
270 }
271 pub fn gbr(&self) -> (&T, &T, &T) {
272 self.yzx()
273 }
274
275 pub fn grb(&self) -> (&T, &T, &T) {
276 self.yxz()
277 }
278 pub fn bgr(&self) -> (&T, &T, &T) {
279 self.zyx()
280 }
281 pub fn rbg(&self) -> (&T, &T, &T) {
282 self.xzy()
283 }
284
285 pub fn rga(&self) -> (&T, &T, &T) {
286 self.xyw()
287 }
288 pub fn arg(&self) -> (&T, &T, &T) {
289 self.wxy()
290 }
291 pub fn gar(&self) -> (&T, &T, &T) {
292 self.ywx()
293 }
294
295 pub fn gra(&self) -> (&T, &T, &T) {
296 self.yxw()
297 }
298 pub fn agr(&self) -> (&T, &T, &T) {
299 self.wyx()
300 }
301 pub fn rag(&self) -> (&T, &T, &T) {
302 self.xwy()
303 }
304
305 pub fn rab(&self) -> (&T, &T, &T) {
306 self.xwz()
307 }
308 pub fn bra(&self) -> (&T, &T, &T) {
309 self.zxw()
310 }
311 pub fn abr(&self) -> (&T, &T, &T) {
312 self.wzx()
313 }
314
315 pub fn rgba(&self) -> (&T, &T, &T, &T) {
316 self.xyzw()
317 }
318 pub fn argb(&self) -> (&T, &T, &T, &T) {
319 self.wxyz()
320 }
321 pub fn barg(&self) -> (&T, &T, &T, &T) {
322 self.zwxy()
323 }
324 pub fn gbar(&self) -> (&T, &T, &T, &T) {
325 self.yzwx()
326 }
327
328 pub fn grba(&self) -> (&T, &T, &T, &T) {
329 self.yxzw()
330 }
331 pub fn agrb(&self) -> (&T, &T, &T, &T) {
332 self.wyxz()
333 }
334 pub fn bagr(&self) -> (&T, &T, &T, &T) {
335 self.zwyx()
336 }
337 pub fn rbag(&self) -> (&T, &T, &T, &T) {
338 self.xzwy()
339 }
340
341 pub fn rgab(&self) -> (&T, &T, &T, &T) {
342 self.xywz()
343 }
344 pub fn brga(&self) -> (&T, &T, &T, &T) {
345 self.zxyw()
346 }
347 pub fn abrg(&self) -> (&T, &T, &T, &T) {
348 self.wzxy()
349 }
350 pub fn gabr(&self) -> (&T, &T, &T, &T) {
351 self.ywzx()
352 }
353
354 pub fn bgra(&self) -> (&T, &T, &T, &T) {
355 self.zyxw()
356 }
357 pub fn abgr(&self) -> (&T, &T, &T, &T) {
358 self.wzyx()
359 }
360 pub fn rabg(&self) -> (&T, &T, &T, &T) {
361 self.xwzy()
362 }
363 pub fn grab(&self) -> (&T, &T, &T, &T) {
364 self.yxwz()
365 }
366
367 pub fn agbr(&self) -> (&T, &T, &T, &T) {
368 self.wyzx()
369 }
370 pub fn ragb(&self) -> (&T, &T, &T, &T) {
371 self.xwyz()
372 }
373 pub fn brag(&self) -> (&T, &T, &T, &T) {
374 self.zxwy()
375 }
376 pub fn gbra(&self) -> (&T, &T, &T, &T) {
377 self.yzxw()
378 }
379}
380
381impl<T: TBytes + Clone> Clone for vec4<T> {
382 fn clone(&self) -> Self {
383 Self(
384 self.0.clone(),
385 self.1.clone(),
386 self.2.clone(),
387 self.3.clone(),
388 )
389 }
390}
391
392impl<T: TBytes + std::fmt::Debug> std::fmt::Debug for vec4<T> {
393 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
394 f.debug_struct("vec4")
395 .field("x", &self.0)
396 .field("y", &self.1)
397 .field("z", &self.2)
398 .field("w", &self.3)
399 .finish()
400 }
401}
402
403impl<T: Add<Output = T>> Add for vec4<T> {
404 type Output = vec4<T>;
405
406 fn add(self, rhs: Self) -> Self::Output {
407 vec4(
408 self.0 + rhs.0,
409 self.1 + rhs.1,
410 self.2 + rhs.2,
411 self.3 + rhs.3,
412 )
413 }
414}
415
416impl<T: Sub<Output = T>> Sub for vec4<T> {
417 type Output = vec4<T>;
418
419 fn sub(self, rhs: Self) -> Self::Output {
420 vec4(
421 self.0 - rhs.0,
422 self.1 - rhs.1,
423 self.2 - rhs.2,
424 self.3 - rhs.3,
425 )
426 }
427}
428
429impl<T: Mul<Output = T>> Mul for vec4<T> {
430 type Output = vec4<T>;
431
432 fn mul(self, rhs: Self) -> Self::Output {
433 vec4(
434 self.0 * rhs.0,
435 self.1 * rhs.1,
436 self.2 * rhs.2,
437 self.3 * rhs.3,
438 )
439 }
440}
441
442impl<T: Div<Output = T>> Div for vec4<T> {
443 type Output = vec4<T>;
444
445 fn div(self, rhs: Self) -> Self::Output {
446 vec4(
447 self.0 / rhs.0,
448 self.1 / rhs.1,
449 self.2 / rhs.2,
450 self.3 / rhs.3,
451 )
452 }
453}
454
455impl<T: AddAssign> AddAssign for vec4<T> {
456 fn add_assign(&mut self, rhs: Self) {
457 self.0 += rhs.0;
458 self.1 += rhs.1;
459 self.2 += rhs.2;
460 self.3 += rhs.3;
461 }
462}
463
464impl<T: SubAssign> SubAssign for vec4<T> {
465 fn sub_assign(&mut self, rhs: Self) {
466 self.0 -= rhs.0;
467 self.1 -= rhs.1;
468 self.2 -= rhs.2;
469 self.3 -= rhs.3;
470 }
471}
472
473impl<T: MulAssign> MulAssign for vec4<T> {
474 fn mul_assign(&mut self, rhs: Self) {
475 self.0 *= rhs.0;
476 self.1 *= rhs.1;
477 self.2 *= rhs.2;
478 self.3 *= rhs.3;
479 }
480}
481
482impl<T: DivAssign> DivAssign for vec4<T> {
483 fn div_assign(&mut self, rhs: Self) {
484 self.0 /= rhs.0;
485 self.1 /= rhs.1;
486 self.2 /= rhs.2;
487 self.3 /= rhs.3;
488 }
489}