wgsl_types/types/
vec4.rs

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}