1use std::fmt;
2use std::fmt::Debug;
3use std::ops::{Add, Sub, Mul, Div, Neg};
4use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign};
5use crate::vec::{Vec, Math, Interpolation};
6use crate::vec2::Vec2;
7use crate::vec3::Vec3;
8use crate::consts::{Zero, One, UnitX, UnitY, UnitZ, UnitW};
9
10#[repr(C)]
11#[derive(Debug, Copy, Clone, Default, Hash, Eq, PartialEq)]
12pub struct Vec4<T>
13{
14 pub x:T,
15 pub y:T,
16 pub z:T,
17 pub w:T,
18}
19
20impl<T> Neg for Vec4<T> where T:Neg<Output=T>
21{
22 type Output = Self;
23
24 fn neg(self) -> Self
25 {
26 Self
27 {
28 x: -self.x,
29 y: -self.y,
30 z: -self.z,
31 w: -self.w
32 }
33 }
34}
35
36impl<T> Add for Vec4<T> where T:Add<Output=T>
37{
38 type Output = Self;
39
40 fn add(self, other: Self) -> Self
41 {
42 Self
43 {
44 x: self.x + other.x,
45 y: self.y + other.y,
46 z: self.z + other.z,
47 w: self.w + other.w,
48 }
49 }
50}
51
52impl<T> Sub for Vec4<T> where T:Sub<Output=T>
53{
54 type Output = Self;
55
56 fn sub(self, other: Self) -> Self
57 {
58 Self
59 {
60 x: self.x - other.x,
61 y: self.y - other.y,
62 z: self.z - other.z,
63 w: self.w - other.w,
64 }
65 }
66}
67
68impl<T> Mul<T> for Vec4<T> where T:Mul<Output=T> + Copy
69{
70 type Output = Self;
71
72 fn mul(self, s: T) -> Self
73 {
74 Self
75 {
76 x:self.x * s,
77 y:self.y * s,
78 z:self.z * s,
79 w:self.w * s,
80 }
81 }
82}
83
84impl<T> Mul for Vec4<T> where T:Mul<Output=T>
85{
86 type Output = Self;
87
88 fn mul(self, other: Self) -> Self
89 {
90 Self
91 {
92 x: self.x * other.x,
93 y: self.y * other.y,
94 z: self.z * other.z,
95 w: self.w * other.w,
96 }
97 }
98}
99
100impl<T> Div<T> for Vec4<T> where T:Div<Output=T> + Copy
101{
102 type Output = Self;
103
104 fn div(self, s: T) -> Self
105 {
106 Self
107 {
108 x:self.x / s,
109 y:self.y / s,
110 z:self.z / s,
111 w:self.w / s,
112 }
113 }
114}
115
116impl<T> Div for Vec4<T> where T:Div<Output=T>
117{
118 type Output = Self;
119
120 fn div(self, other: Self) -> Self
121 {
122 Self
123 {
124 x: self.x / other.x,
125 y: self.y / other.y,
126 z: self.z / other.z,
127 w: self.w / other.w,
128 }
129 }
130}
131
132impl<T> AddAssign for Vec4<T> where T: AddAssign<T>
133{
134 fn add_assign(&mut self, other: Self)
135 {
136 self.x += other.x;
137 self.y += other.y;
138 self.z += other.z;
139 self.w += other.w;
140 }
141}
142
143impl<T> SubAssign for Vec4<T> where T: SubAssign<T>
144{
145 fn sub_assign(&mut self, other: Self)
146 {
147 self.x -= other.x;
148 self.y -= other.y;
149 self.z -= other.z;
150 self.w -= other.w;
151 }
152}
153
154impl<T> MulAssign<T> for Vec4<T> where T: MulAssign<T> + Copy
155{
156 fn mul_assign(&mut self, s: T)
157 {
158 self.x *= s;
159 self.y *= s;
160 self.z *= s;
161 self.w *= s;
162 }
163}
164
165impl<T> MulAssign for Vec4<T> where T: MulAssign<T>
166{
167 fn mul_assign(&mut self, other: Self)
168 {
169 self.x *= other.x;
170 self.y *= other.y;
171 self.z *= other.z;
172 self.w *= other.w;
173 }
174}
175
176impl<'a, T> MulAssign<&'a T> for Vec4<T> where T:MulAssign<T> + Copy
177{
178 fn mul_assign(&mut self, other: &'a T)
179 {
180 self.x *= *other;
181 self.y *= *other;
182 self.z *= *other;
183 self.w *= *other;
184 }
185}
186
187impl<T> DivAssign<T> for Vec4<T> where T: DivAssign<T> + Copy
188{
189 fn div_assign(&mut self, s: T)
190 {
191 self.x /= s;
192 self.y /= s;
193 self.z /= s;
194 self.w /= s;
195 }
196}
197
198impl<T> DivAssign for Vec4<T> where T: DivAssign<T>
199{
200 fn div_assign(&mut self, other: Self)
201 {
202 self.x /= other.x;
203 self.y /= other.y;
204 self.z /= other.z;
205 self.w /= other.w;
206 }
207}
208
209impl<'a, T> DivAssign<&'a T> for Vec4<T> where T:DivAssign<T> + Copy
210{
211 fn div_assign(&mut self, s: &'a T)
212 {
213 self.x /= *s;
214 self.y /= *s;
215 self.z /= *s;
216 self.w /= *s;
217 }
218}
219
220impl<T> Vec4<T> where T: Copy
221{
222 #[inline(always)]
224 pub fn new(x: T, y: T, z: T, w: T) -> Self { Self { x, y, z, w } }
225
226 #[inline(always)]
227 pub fn len() -> usize
228 {
229 return 4;
230 }
231
232 #[inline(always)]
233 pub fn to_tuple(&self) -> (T, T, T, T)
234 {
235 (self.x, self.y, self.z, self.w)
236 }
237
238 #[inline(always)]
239 pub fn xx(&self) -> Vec2<T> { Vec2::new(self.x, self.x) }
240 #[inline(always)]
241 pub fn xy(&self) -> Vec2<T> { Vec2::new(self.x, self.y) }
242 #[inline(always)]
243 pub fn xz(&self) -> Vec2<T> { Vec2::new(self.x, self.z) }
244 #[inline(always)]
245 pub fn xw(&self) -> Vec2<T> { Vec2::new(self.x, self.w) }
246 #[inline(always)]
247 pub fn yx(&self) -> Vec2<T> { Vec2::new(self.y, self.x) }
248 #[inline(always)]
249 pub fn yy(&self) -> Vec2<T> { Vec2::new(self.y, self.y) }
250 #[inline(always)]
251 pub fn yz(&self) -> Vec2<T> { Vec2::new(self.y, self.z) }
252 #[inline(always)]
253 pub fn yw(&self) -> Vec2<T> { Vec2::new(self.y, self.w) }
254 #[inline(always)]
255 pub fn zx(&self) -> Vec2<T> { Vec2::new(self.z, self.x) }
256 #[inline(always)]
257 pub fn zy(&self) -> Vec2<T> { Vec2::new(self.z, self.y) }
258 #[inline(always)]
259 pub fn zz(&self) -> Vec2<T> { Vec2::new(self.z, self.z) }
260 #[inline(always)]
261 pub fn zw(&self) -> Vec2<T> { Vec2::new(self.z, self.w) }
262 #[inline(always)]
263 pub fn wx(&self) -> Vec2<T> { Vec2::new(self.w, self.x) }
264 #[inline(always)]
265 pub fn wy(&self) -> Vec2<T> { Vec2::new(self.w, self.y) }
266 #[inline(always)]
267 pub fn wz(&self) -> Vec2<T> { Vec2::new(self.w, self.z) }
268 #[inline(always)]
269 pub fn ww(&self) -> Vec2<T> { Vec2::new(self.w, self.w) }
270 #[inline(always)]
271 pub fn xxx(&self) -> Vec3<T> { Vec3::new(self.x, self.x, self.x) }
272 #[inline(always)]
273 pub fn xxy(&self) -> Vec3<T> { Vec3::new(self.x, self.x, self.y) }
274 #[inline(always)]
275 pub fn xxz(&self) -> Vec3<T> { Vec3::new(self.x, self.x, self.z) }
276 #[inline(always)]
277 pub fn xxw(&self) -> Vec3<T> { Vec3::new(self.x, self.x, self.w) }
278 #[inline(always)]
279 pub fn xyx(&self) -> Vec3<T> { Vec3::new(self.x, self.y, self.x) }
280 #[inline(always)]
281 pub fn xyy(&self) -> Vec3<T> { Vec3::new(self.x, self.y, self.y) }
282 #[inline(always)]
283 pub fn xyz(&self) -> Vec3<T> { Vec3::new(self.x, self.y, self.z) }
284 #[inline(always)]
285 pub fn xyw(&self) -> Vec3<T> { Vec3::new(self.x, self.y, self.w) }
286 #[inline(always)]
287 pub fn xzx(&self) -> Vec3<T> { Vec3::new(self.x, self.z, self.x) }
288 #[inline(always)]
289 pub fn xzy(&self) -> Vec3<T> { Vec3::new(self.x, self.z, self.y) }
290 #[inline(always)]
291 pub fn xzz(&self) -> Vec3<T> { Vec3::new(self.x, self.z, self.z) }
292 #[inline(always)]
293 pub fn xzw(&self) -> Vec3<T> { Vec3::new(self.x, self.z, self.w) }
294 #[inline(always)]
295 pub fn xwx(&self) -> Vec3<T> { Vec3::new(self.x, self.w, self.x) }
296 #[inline(always)]
297 pub fn xwy(&self) -> Vec3<T> { Vec3::new(self.x, self.w, self.y) }
298 #[inline(always)]
299 pub fn xwz(&self) -> Vec3<T> { Vec3::new(self.x, self.w, self.z) }
300 #[inline(always)]
301 pub fn xww(&self) -> Vec3<T> { Vec3::new(self.x, self.w, self.w) }
302 #[inline(always)]
303 pub fn yxx(&self) -> Vec3<T> { Vec3::new(self.y, self.x, self.x) }
304 #[inline(always)]
305 pub fn yxy(&self) -> Vec3<T> { Vec3::new(self.y, self.x, self.y) }
306 #[inline(always)]
307 pub fn yxz(&self) -> Vec3<T> { Vec3::new(self.y, self.x, self.z) }
308 #[inline(always)]
309 pub fn yxw(&self) -> Vec3<T> { Vec3::new(self.y, self.x, self.w) }
310 #[inline(always)]
311 pub fn yyx(&self) -> Vec3<T> { Vec3::new(self.y, self.y, self.x) }
312 #[inline(always)]
313 pub fn yyy(&self) -> Vec3<T> { Vec3::new(self.y, self.y, self.y) }
314 #[inline(always)]
315 pub fn yyz(&self) -> Vec3<T> { Vec3::new(self.y, self.y, self.z) }
316 #[inline(always)]
317 pub fn yyw(&self) -> Vec3<T> { Vec3::new(self.y, self.y, self.w) }
318 #[inline(always)]
319 pub fn yzx(&self) -> Vec3<T> { Vec3::new(self.y, self.z, self.x) }
320 #[inline(always)]
321 pub fn yzy(&self) -> Vec3<T> { Vec3::new(self.y, self.z, self.y) }
322 #[inline(always)]
323 pub fn yzz(&self) -> Vec3<T> { Vec3::new(self.y, self.z, self.z) }
324 #[inline(always)]
325 pub fn yzw(&self) -> Vec3<T> { Vec3::new(self.y, self.z, self.w) }
326 #[inline(always)]
327 pub fn ywx(&self) -> Vec3<T> { Vec3::new(self.y, self.w, self.x) }
328 #[inline(always)]
329 pub fn ywy(&self) -> Vec3<T> { Vec3::new(self.y, self.w, self.y) }
330 #[inline(always)]
331 pub fn ywz(&self) -> Vec3<T> { Vec3::new(self.y, self.w, self.z) }
332 #[inline(always)]
333 pub fn yww(&self) -> Vec3<T> { Vec3::new(self.y, self.w, self.w) }
334 #[inline(always)]
335 pub fn zxx(&self) -> Vec3<T> { Vec3::new(self.z, self.x, self.x) }
336 #[inline(always)]
337 pub fn zxy(&self) -> Vec3<T> { Vec3::new(self.z, self.x, self.y) }
338 #[inline(always)]
339 pub fn zxz(&self) -> Vec3<T> { Vec3::new(self.z, self.x, self.z) }
340 #[inline(always)]
341 pub fn zxw(&self) -> Vec3<T> { Vec3::new(self.z, self.x, self.w) }
342 #[inline(always)]
343 pub fn zyx(&self) -> Vec3<T> { Vec3::new(self.z, self.y, self.x) }
344 #[inline(always)]
345 pub fn zyy(&self) -> Vec3<T> { Vec3::new(self.z, self.y, self.y) }
346 #[inline(always)]
347 pub fn zyz(&self) -> Vec3<T> { Vec3::new(self.z, self.y, self.z) }
348 #[inline(always)]
349 pub fn zyw(&self) -> Vec3<T> { Vec3::new(self.z, self.y, self.w) }
350 #[inline(always)]
351 pub fn zzx(&self) -> Vec3<T> { Vec3::new(self.z, self.z, self.x) }
352 #[inline(always)]
353 pub fn zzy(&self) -> Vec3<T> { Vec3::new(self.z, self.z, self.y) }
354 #[inline(always)]
355 pub fn zzz(&self) -> Vec3<T> { Vec3::new(self.z, self.z, self.z) }
356 #[inline(always)]
357 pub fn zzw(&self) -> Vec3<T> { Vec3::new(self.z, self.z, self.w) }
358 #[inline(always)]
359 pub fn zwx(&self) -> Vec3<T> { Vec3::new(self.z, self.w, self.x) }
360 #[inline(always)]
361 pub fn zwy(&self) -> Vec3<T> { Vec3::new(self.z, self.w, self.y) }
362 #[inline(always)]
363 pub fn zwz(&self) -> Vec3<T> { Vec3::new(self.z, self.w, self.z) }
364 #[inline(always)]
365 pub fn zww(&self) -> Vec3<T> { Vec3::new(self.z, self.w, self.w) }
366 #[inline(always)]
367 pub fn wxx(&self) -> Vec3<T> { Vec3::new(self.w, self.x, self.x) }
368 #[inline(always)]
369 pub fn wxy(&self) -> Vec3<T> { Vec3::new(self.w, self.x, self.y) }
370 #[inline(always)]
371 pub fn wxz(&self) -> Vec3<T> { Vec3::new(self.w, self.x, self.z) }
372 #[inline(always)]
373 pub fn wxw(&self) -> Vec3<T> { Vec3::new(self.w, self.x, self.w) }
374 #[inline(always)]
375 pub fn wyx(&self) -> Vec3<T> { Vec3::new(self.w, self.y, self.x) }
376 #[inline(always)]
377 pub fn wyy(&self) -> Vec3<T> { Vec3::new(self.w, self.y, self.y) }
378 #[inline(always)]
379 pub fn wyz(&self) -> Vec3<T> { Vec3::new(self.w, self.y, self.z) }
380 #[inline(always)]
381 pub fn wyw(&self) -> Vec3<T> { Vec3::new(self.w, self.y, self.w) }
382 #[inline(always)]
383 pub fn wzx(&self) -> Vec3<T> { Vec3::new(self.w, self.z, self.x) }
384 #[inline(always)]
385 pub fn wzy(&self) -> Vec3<T> { Vec3::new(self.w, self.z, self.y) }
386 #[inline(always)]
387 pub fn wzz(&self) -> Vec3<T> { Vec3::new(self.w, self.z, self.z) }
388 #[inline(always)]
389 pub fn wzw(&self) -> Vec3<T> { Vec3::new(self.w, self.z, self.w) }
390 #[inline(always)]
391 pub fn wwx(&self) -> Vec3<T> { Vec3::new(self.w, self.w, self.x) }
392 #[inline(always)]
393 pub fn wwy(&self) -> Vec3<T> { Vec3::new(self.w, self.w, self.y) }
394 #[inline(always)]
395 pub fn wwz(&self) -> Vec3<T> { Vec3::new(self.w, self.w, self.z) }
396 #[inline(always)]
397 pub fn www(&self) -> Vec3<T> { Vec3::new(self.w, self.w, self.w) }
398 #[inline(always)]
399 pub fn xxxx(&self) -> Self { Self::new(self.x, self.x, self.x, self.x) }
400 #[inline(always)]
401 pub fn xxxy(&self) -> Self { Self::new(self.x, self.x, self.x, self.y) }
402 #[inline(always)]
403 pub fn xxxz(&self) -> Self { Self::new(self.x, self.x, self.x, self.z) }
404 #[inline(always)]
405 pub fn xxxw(&self) -> Self { Self::new(self.x, self.x, self.x, self.w) }
406 #[inline(always)]
407 pub fn xxyx(&self) -> Self { Self::new(self.x, self.x, self.y, self.x) }
408 #[inline(always)]
409 pub fn xxyy(&self) -> Self { Self::new(self.x, self.x, self.y, self.y) }
410 #[inline(always)]
411 pub fn xxyz(&self) -> Self { Self::new(self.x, self.x, self.y, self.z) }
412 #[inline(always)]
413 pub fn xxyw(&self) -> Self { Self::new(self.x, self.x, self.y, self.w) }
414 #[inline(always)]
415 pub fn xxzx(&self) -> Self { Self::new(self.x, self.x, self.z, self.x) }
416 #[inline(always)]
417 pub fn xxzy(&self) -> Self { Self::new(self.x, self.x, self.z, self.y) }
418 #[inline(always)]
419 pub fn xxzz(&self) -> Self { Self::new(self.x, self.x, self.z, self.z) }
420 #[inline(always)]
421 pub fn xxzw(&self) -> Self { Self::new(self.x, self.x, self.z, self.w) }
422 #[inline(always)]
423 pub fn xxwx(&self) -> Self { Self::new(self.x, self.x, self.w, self.x) }
424 #[inline(always)]
425 pub fn xxwy(&self) -> Self { Self::new(self.x, self.x, self.w, self.y) }
426 #[inline(always)]
427 pub fn xxwz(&self) -> Self { Self::new(self.x, self.x, self.w, self.z) }
428 #[inline(always)]
429 pub fn xxww(&self) -> Self { Self::new(self.x, self.x, self.w, self.w) }
430 #[inline(always)]
431 pub fn xyxx(&self) -> Self { Self::new(self.x, self.y, self.x, self.x) }
432 #[inline(always)]
433 pub fn xyxy(&self) -> Self { Self::new(self.x, self.y, self.x, self.y) }
434 #[inline(always)]
435 pub fn xyxz(&self) -> Self { Self::new(self.x, self.y, self.x, self.z) }
436 #[inline(always)]
437 pub fn xyxw(&self) -> Self { Self::new(self.x, self.y, self.x, self.w) }
438 #[inline(always)]
439 pub fn xyyx(&self) -> Self { Self::new(self.x, self.y, self.y, self.x) }
440 #[inline(always)]
441 pub fn xyyy(&self) -> Self { Self::new(self.x, self.y, self.y, self.y) }
442 #[inline(always)]
443 pub fn xyyz(&self) -> Self { Self::new(self.x, self.y, self.y, self.z) }
444 #[inline(always)]
445 pub fn xyyw(&self) -> Self { Self::new(self.x, self.y, self.y, self.w) }
446 #[inline(always)]
447 pub fn xyzx(&self) -> Self { Self::new(self.x, self.y, self.z, self.x) }
448 #[inline(always)]
449 pub fn xyzy(&self) -> Self { Self::new(self.x, self.y, self.z, self.y) }
450 #[inline(always)]
451 pub fn xyzz(&self) -> Self { Self::new(self.x, self.y, self.z, self.z) }
452 #[inline(always)]
453 pub fn xyzw(&self) -> Self { Self::new(self.x, self.y, self.z, self.w) }
454 #[inline(always)]
455 pub fn xywx(&self) -> Self { Self::new(self.x, self.y, self.w, self.x) }
456 #[inline(always)]
457 pub fn xywy(&self) -> Self { Self::new(self.x, self.y, self.w, self.y) }
458 #[inline(always)]
459 pub fn xywz(&self) -> Self { Self::new(self.x, self.y, self.w, self.z) }
460 #[inline(always)]
461 pub fn xyww(&self) -> Self { Self::new(self.x, self.y, self.w, self.w) }
462 #[inline(always)]
463 pub fn xzxx(&self) -> Self { Self::new(self.x, self.z, self.x, self.x) }
464 #[inline(always)]
465 pub fn xzxy(&self) -> Self { Self::new(self.x, self.z, self.x, self.y) }
466 #[inline(always)]
467 pub fn xzxz(&self) -> Self { Self::new(self.x, self.z, self.x, self.z) }
468 #[inline(always)]
469 pub fn xzxw(&self) -> Self { Self::new(self.x, self.z, self.x, self.w) }
470 #[inline(always)]
471 pub fn xzyx(&self) -> Self { Self::new(self.x, self.z, self.y, self.x) }
472 #[inline(always)]
473 pub fn xzyy(&self) -> Self { Self::new(self.x, self.z, self.y, self.y) }
474 #[inline(always)]
475 pub fn xzyz(&self) -> Self { Self::new(self.x, self.z, self.y, self.z) }
476 #[inline(always)]
477 pub fn xzyw(&self) -> Self { Self::new(self.x, self.z, self.y, self.w) }
478 #[inline(always)]
479 pub fn xzzx(&self) -> Self { Self::new(self.x, self.z, self.z, self.x) }
480 #[inline(always)]
481 pub fn xzzy(&self) -> Self { Self::new(self.x, self.z, self.z, self.y) }
482 #[inline(always)]
483 pub fn xzzz(&self) -> Self { Self::new(self.x, self.z, self.z, self.z) }
484 #[inline(always)]
485 pub fn xzzw(&self) -> Self { Self::new(self.x, self.z, self.z, self.w) }
486 #[inline(always)]
487 pub fn xzwx(&self) -> Self { Self::new(self.x, self.z, self.w, self.x) }
488 #[inline(always)]
489 pub fn xzwy(&self) -> Self { Self::new(self.x, self.z, self.w, self.y) }
490 #[inline(always)]
491 pub fn xzwz(&self) -> Self { Self::new(self.x, self.z, self.w, self.z) }
492 #[inline(always)]
493 pub fn xzww(&self) -> Self { Self::new(self.x, self.z, self.w, self.w) }
494 #[inline(always)]
495 pub fn xwxx(&self) -> Self { Self::new(self.x, self.w, self.x, self.x) }
496 #[inline(always)]
497 pub fn xwxy(&self) -> Self { Self::new(self.x, self.w, self.x, self.y) }
498 #[inline(always)]
499 pub fn xwxz(&self) -> Self { Self::new(self.x, self.w, self.x, self.z) }
500 #[inline(always)]
501 pub fn xwxw(&self) -> Self { Self::new(self.x, self.w, self.x, self.w) }
502 #[inline(always)]
503 pub fn xwyx(&self) -> Self { Self::new(self.x, self.w, self.y, self.x) }
504 #[inline(always)]
505 pub fn xwyy(&self) -> Self { Self::new(self.x, self.w, self.y, self.y) }
506 #[inline(always)]
507 pub fn xwyz(&self) -> Self { Self::new(self.x, self.w, self.y, self.z) }
508 #[inline(always)]
509 pub fn xwyw(&self) -> Self { Self::new(self.x, self.w, self.y, self.w) }
510 #[inline(always)]
511 pub fn xwzx(&self) -> Self { Self::new(self.x, self.w, self.z, self.x) }
512 #[inline(always)]
513 pub fn xwzy(&self) -> Self { Self::new(self.x, self.w, self.z, self.y) }
514 #[inline(always)]
515 pub fn xwzz(&self) -> Self { Self::new(self.x, self.w, self.z, self.z) }
516 #[inline(always)]
517 pub fn xwzw(&self) -> Self { Self::new(self.x, self.w, self.z, self.w) }
518 #[inline(always)]
519 pub fn xwwx(&self) -> Self { Self::new(self.x, self.w, self.w, self.x) }
520 #[inline(always)]
521 pub fn xwwy(&self) -> Self { Self::new(self.x, self.w, self.w, self.y) }
522 #[inline(always)]
523 pub fn xwwz(&self) -> Self { Self::new(self.x, self.w, self.w, self.z) }
524 #[inline(always)]
525 pub fn xwww(&self) -> Self { Self::new(self.x, self.w, self.w, self.w) }
526 #[inline(always)]
527 pub fn yxxx(&self) -> Self { Self::new(self.y, self.x, self.x, self.x) }
528 #[inline(always)]
529 pub fn yxxy(&self) -> Self { Self::new(self.y, self.x, self.x, self.y) }
530 #[inline(always)]
531 pub fn yxxz(&self) -> Self { Self::new(self.y, self.x, self.x, self.z) }
532 #[inline(always)]
533 pub fn yxxw(&self) -> Self { Self::new(self.y, self.x, self.x, self.w) }
534 #[inline(always)]
535 pub fn yxyx(&self) -> Self { Self::new(self.y, self.x, self.y, self.x) }
536 #[inline(always)]
537 pub fn yxyy(&self) -> Self { Self::new(self.y, self.x, self.y, self.y) }
538 #[inline(always)]
539 pub fn yxyz(&self) -> Self { Self::new(self.y, self.x, self.y, self.z) }
540 #[inline(always)]
541 pub fn yxyw(&self) -> Self { Self::new(self.y, self.x, self.y, self.w) }
542 #[inline(always)]
543 pub fn yxzx(&self) -> Self { Self::new(self.y, self.x, self.z, self.x) }
544 #[inline(always)]
545 pub fn yxzy(&self) -> Self { Self::new(self.y, self.x, self.z, self.y) }
546 #[inline(always)]
547 pub fn yxzz(&self) -> Self { Self::new(self.y, self.x, self.z, self.z) }
548 #[inline(always)]
549 pub fn yxzw(&self) -> Self { Self::new(self.y, self.x, self.z, self.w) }
550 #[inline(always)]
551 pub fn yxwx(&self) -> Self { Self::new(self.y, self.x, self.w, self.x) }
552 #[inline(always)]
553 pub fn yxwy(&self) -> Self { Self::new(self.y, self.x, self.w, self.y) }
554 #[inline(always)]
555 pub fn yxwz(&self) -> Self { Self::new(self.y, self.x, self.w, self.z) }
556 #[inline(always)]
557 pub fn yxww(&self) -> Self { Self::new(self.y, self.x, self.w, self.w) }
558 #[inline(always)]
559 pub fn yyxx(&self) -> Self { Self::new(self.y, self.y, self.x, self.x) }
560 #[inline(always)]
561 pub fn yyxy(&self) -> Self { Self::new(self.y, self.y, self.x, self.y) }
562 #[inline(always)]
563 pub fn yyxz(&self) -> Self { Self::new(self.y, self.y, self.x, self.z) }
564 #[inline(always)]
565 pub fn yyxw(&self) -> Self { Self::new(self.y, self.y, self.x, self.w) }
566 #[inline(always)]
567 pub fn yyyx(&self) -> Self { Self::new(self.y, self.y, self.y, self.x) }
568 #[inline(always)]
569 pub fn yyyy(&self) -> Self { Self::new(self.y, self.y, self.y, self.y) }
570 #[inline(always)]
571 pub fn yyyz(&self) -> Self { Self::new(self.y, self.y, self.y, self.z) }
572 #[inline(always)]
573 pub fn yyyw(&self) -> Self { Self::new(self.y, self.y, self.y, self.w) }
574 #[inline(always)]
575 pub fn yyzx(&self) -> Self { Self::new(self.y, self.y, self.z, self.x) }
576 #[inline(always)]
577 pub fn yyzy(&self) -> Self { Self::new(self.y, self.y, self.z, self.y) }
578 #[inline(always)]
579 pub fn yyzz(&self) -> Self { Self::new(self.y, self.y, self.z, self.z) }
580 #[inline(always)]
581 pub fn yyzw(&self) -> Self { Self::new(self.y, self.y, self.z, self.w) }
582 #[inline(always)]
583 pub fn yywx(&self) -> Self { Self::new(self.y, self.y, self.w, self.x) }
584 #[inline(always)]
585 pub fn yywy(&self) -> Self { Self::new(self.y, self.y, self.w, self.y) }
586 #[inline(always)]
587 pub fn yywz(&self) -> Self { Self::new(self.y, self.y, self.w, self.z) }
588 #[inline(always)]
589 pub fn yyww(&self) -> Self { Self::new(self.y, self.y, self.w, self.w) }
590 #[inline(always)]
591 pub fn yzxx(&self) -> Self { Self::new(self.y, self.z, self.x, self.x) }
592 #[inline(always)]
593 pub fn yzxy(&self) -> Self { Self::new(self.y, self.z, self.x, self.y) }
594 #[inline(always)]
595 pub fn yzxz(&self) -> Self { Self::new(self.y, self.z, self.x, self.z) }
596 #[inline(always)]
597 pub fn yzxw(&self) -> Self { Self::new(self.y, self.z, self.x, self.w) }
598 #[inline(always)]
599 pub fn yzyx(&self) -> Self { Self::new(self.y, self.z, self.y, self.x) }
600 #[inline(always)]
601 pub fn yzyy(&self) -> Self { Self::new(self.y, self.z, self.y, self.y) }
602 #[inline(always)]
603 pub fn yzyz(&self) -> Self { Self::new(self.y, self.z, self.y, self.z) }
604 #[inline(always)]
605 pub fn yzyw(&self) -> Self { Self::new(self.y, self.z, self.y, self.w) }
606 #[inline(always)]
607 pub fn yzzx(&self) -> Self { Self::new(self.y, self.z, self.z, self.x) }
608 #[inline(always)]
609 pub fn yzzy(&self) -> Self { Self::new(self.y, self.z, self.z, self.y) }
610 #[inline(always)]
611 pub fn yzzz(&self) -> Self { Self::new(self.y, self.z, self.z, self.z) }
612 #[inline(always)]
613 pub fn yzzw(&self) -> Self { Self::new(self.y, self.z, self.z, self.w) }
614 #[inline(always)]
615 pub fn yzwx(&self) -> Self { Self::new(self.y, self.z, self.w, self.x) }
616 #[inline(always)]
617 pub fn yzwy(&self) -> Self { Self::new(self.y, self.z, self.w, self.y) }
618 #[inline(always)]
619 pub fn yzwz(&self) -> Self { Self::new(self.y, self.z, self.w, self.z) }
620 #[inline(always)]
621 pub fn yzww(&self) -> Self { Self::new(self.y, self.z, self.w, self.w) }
622 #[inline(always)]
623 pub fn ywxx(&self) -> Self { Self::new(self.y, self.w, self.x, self.x) }
624 #[inline(always)]
625 pub fn ywxy(&self) -> Self { Self::new(self.y, self.w, self.x, self.y) }
626 #[inline(always)]
627 pub fn ywxz(&self) -> Self { Self::new(self.y, self.w, self.x, self.z) }
628 #[inline(always)]
629 pub fn ywxw(&self) -> Self { Self::new(self.y, self.w, self.x, self.w) }
630 #[inline(always)]
631 pub fn ywyx(&self) -> Self { Self::new(self.y, self.w, self.y, self.x) }
632 #[inline(always)]
633 pub fn ywyy(&self) -> Self { Self::new(self.y, self.w, self.y, self.y) }
634 #[inline(always)]
635 pub fn ywyz(&self) -> Self { Self::new(self.y, self.w, self.y, self.z) }
636 #[inline(always)]
637 pub fn ywyw(&self) -> Self { Self::new(self.y, self.w, self.y, self.w) }
638 #[inline(always)]
639 pub fn ywzx(&self) -> Self { Self::new(self.y, self.w, self.z, self.x) }
640 #[inline(always)]
641 pub fn ywzy(&self) -> Self { Self::new(self.y, self.w, self.z, self.y) }
642 #[inline(always)]
643 pub fn ywzz(&self) -> Self { Self::new(self.y, self.w, self.z, self.z) }
644 #[inline(always)]
645 pub fn ywzw(&self) -> Self { Self::new(self.y, self.w, self.z, self.w) }
646 #[inline(always)]
647 pub fn ywwx(&self) -> Self { Self::new(self.y, self.w, self.w, self.x) }
648 #[inline(always)]
649 pub fn ywwy(&self) -> Self { Self::new(self.y, self.w, self.w, self.y) }
650 #[inline(always)]
651 pub fn ywwz(&self) -> Self { Self::new(self.y, self.w, self.w, self.z) }
652 #[inline(always)]
653 pub fn ywww(&self) -> Self { Self::new(self.y, self.w, self.w, self.w) }
654 #[inline(always)]
655 pub fn zxxx(&self) -> Self { Self::new(self.z, self.x, self.x, self.x) }
656 #[inline(always)]
657 pub fn zxxy(&self) -> Self { Self::new(self.z, self.x, self.x, self.y) }
658 #[inline(always)]
659 pub fn zxxz(&self) -> Self { Self::new(self.z, self.x, self.x, self.z) }
660 #[inline(always)]
661 pub fn zxxw(&self) -> Self { Self::new(self.z, self.x, self.x, self.w) }
662 #[inline(always)]
663 pub fn zxyx(&self) -> Self { Self::new(self.z, self.x, self.y, self.x) }
664 #[inline(always)]
665 pub fn zxyy(&self) -> Self { Self::new(self.z, self.x, self.y, self.y) }
666 #[inline(always)]
667 pub fn zxyz(&self) -> Self { Self::new(self.z, self.x, self.y, self.z) }
668 #[inline(always)]
669 pub fn zxyw(&self) -> Self { Self::new(self.z, self.x, self.y, self.w) }
670 #[inline(always)]
671 pub fn zxzx(&self) -> Self { Self::new(self.z, self.x, self.z, self.x) }
672 #[inline(always)]
673 pub fn zxzy(&self) -> Self { Self::new(self.z, self.x, self.z, self.y) }
674 #[inline(always)]
675 pub fn zxzz(&self) -> Self { Self::new(self.z, self.x, self.z, self.z) }
676 #[inline(always)]
677 pub fn zxzw(&self) -> Self { Self::new(self.z, self.x, self.z, self.w) }
678 #[inline(always)]
679 pub fn zxwx(&self) -> Self { Self::new(self.z, self.x, self.w, self.x) }
680 #[inline(always)]
681 pub fn zxwy(&self) -> Self { Self::new(self.z, self.x, self.w, self.y) }
682 #[inline(always)]
683 pub fn zxwz(&self) -> Self { Self::new(self.z, self.x, self.w, self.z) }
684 #[inline(always)]
685 pub fn zxww(&self) -> Self { Self::new(self.z, self.x, self.w, self.w) }
686 #[inline(always)]
687 pub fn zyxx(&self) -> Self { Self::new(self.z, self.y, self.x, self.x) }
688 #[inline(always)]
689 pub fn zyxy(&self) -> Self { Self::new(self.z, self.y, self.x, self.y) }
690 #[inline(always)]
691 pub fn zyxz(&self) -> Self { Self::new(self.z, self.y, self.x, self.z) }
692 #[inline(always)]
693 pub fn zyxw(&self) -> Self { Self::new(self.z, self.y, self.x, self.w) }
694 #[inline(always)]
695 pub fn zyyx(&self) -> Self { Self::new(self.z, self.y, self.y, self.x) }
696 #[inline(always)]
697 pub fn zyyy(&self) -> Self { Self::new(self.z, self.y, self.y, self.y) }
698 #[inline(always)]
699 pub fn zyyz(&self) -> Self { Self::new(self.z, self.y, self.y, self.z) }
700 #[inline(always)]
701 pub fn zyyw(&self) -> Self { Self::new(self.z, self.y, self.y, self.w) }
702 #[inline(always)]
703 pub fn zyzx(&self) -> Self { Self::new(self.z, self.y, self.z, self.x) }
704 #[inline(always)]
705 pub fn zyzy(&self) -> Self { Self::new(self.z, self.y, self.z, self.y) }
706 #[inline(always)]
707 pub fn zyzz(&self) -> Self { Self::new(self.z, self.y, self.z, self.z) }
708 #[inline(always)]
709 pub fn zyzw(&self) -> Self { Self::new(self.z, self.y, self.z, self.w) }
710 #[inline(always)]
711 pub fn zywx(&self) -> Self { Self::new(self.z, self.y, self.w, self.x) }
712 #[inline(always)]
713 pub fn zywy(&self) -> Self { Self::new(self.z, self.y, self.w, self.y) }
714 #[inline(always)]
715 pub fn zywz(&self) -> Self { Self::new(self.z, self.y, self.w, self.z) }
716 #[inline(always)]
717 pub fn zyww(&self) -> Self { Self::new(self.z, self.y, self.w, self.w) }
718 #[inline(always)]
719 pub fn zzxx(&self) -> Self { Self::new(self.z, self.z, self.x, self.x) }
720 #[inline(always)]
721 pub fn zzxy(&self) -> Self { Self::new(self.z, self.z, self.x, self.y) }
722 #[inline(always)]
723 pub fn zzxz(&self) -> Self { Self::new(self.z, self.z, self.x, self.z) }
724 #[inline(always)]
725 pub fn zzxw(&self) -> Self { Self::new(self.z, self.z, self.x, self.w) }
726 #[inline(always)]
727 pub fn zzyx(&self) -> Self { Self::new(self.z, self.z, self.y, self.x) }
728 #[inline(always)]
729 pub fn zzyy(&self) -> Self { Self::new(self.z, self.z, self.y, self.y) }
730 #[inline(always)]
731 pub fn zzyz(&self) -> Self { Self::new(self.z, self.z, self.y, self.z) }
732 #[inline(always)]
733 pub fn zzyw(&self) -> Self { Self::new(self.z, self.z, self.y, self.w) }
734 #[inline(always)]
735 pub fn zzzx(&self) -> Self { Self::new(self.z, self.z, self.z, self.x) }
736 #[inline(always)]
737 pub fn zzzy(&self) -> Self { Self::new(self.z, self.z, self.z, self.y) }
738 #[inline(always)]
739 pub fn zzzz(&self) -> Self { Self::new(self.z, self.z, self.z, self.z) }
740 #[inline(always)]
741 pub fn zzzw(&self) -> Self { Self::new(self.z, self.z, self.z, self.w) }
742 #[inline(always)]
743 pub fn zzwx(&self) -> Self { Self::new(self.z, self.z, self.w, self.x) }
744 #[inline(always)]
745 pub fn zzwy(&self) -> Self { Self::new(self.z, self.z, self.w, self.y) }
746 #[inline(always)]
747 pub fn zzwz(&self) -> Self { Self::new(self.z, self.z, self.w, self.z) }
748 #[inline(always)]
749 pub fn zzww(&self) -> Self { Self::new(self.z, self.z, self.w, self.w) }
750 #[inline(always)]
751 pub fn zwxx(&self) -> Self { Self::new(self.z, self.w, self.x, self.x) }
752 #[inline(always)]
753 pub fn zwxy(&self) -> Self { Self::new(self.z, self.w, self.x, self.y) }
754 #[inline(always)]
755 pub fn zwxz(&self) -> Self { Self::new(self.z, self.w, self.x, self.z) }
756 #[inline(always)]
757 pub fn zwxw(&self) -> Self { Self::new(self.z, self.w, self.x, self.w) }
758 #[inline(always)]
759 pub fn zwyx(&self) -> Self { Self::new(self.z, self.w, self.y, self.x) }
760 #[inline(always)]
761 pub fn zwyy(&self) -> Self { Self::new(self.z, self.w, self.y, self.y) }
762 #[inline(always)]
763 pub fn zwyz(&self) -> Self { Self::new(self.z, self.w, self.y, self.z) }
764 #[inline(always)]
765 pub fn zwyw(&self) -> Self { Self::new(self.z, self.w, self.y, self.w) }
766 #[inline(always)]
767 pub fn zwzx(&self) -> Self { Self::new(self.z, self.w, self.z, self.x) }
768 #[inline(always)]
769 pub fn zwzy(&self) -> Self { Self::new(self.z, self.w, self.z, self.y) }
770 #[inline(always)]
771 pub fn zwzz(&self) -> Self { Self::new(self.z, self.w, self.z, self.z) }
772 #[inline(always)]
773 pub fn zwzw(&self) -> Self { Self::new(self.z, self.w, self.z, self.w) }
774 #[inline(always)]
775 pub fn zwwx(&self) -> Self { Self::new(self.z, self.w, self.w, self.x) }
776 #[inline(always)]
777 pub fn zwwy(&self) -> Self { Self::new(self.z, self.w, self.w, self.y) }
778 #[inline(always)]
779 pub fn zwwz(&self) -> Self { Self::new(self.z, self.w, self.w, self.z) }
780 #[inline(always)]
781 pub fn zwww(&self) -> Self { Self::new(self.z, self.w, self.w, self.w) }
782 #[inline(always)]
783 pub fn wxxx(&self) -> Self { Self::new(self.w, self.x, self.x, self.x) }
784 #[inline(always)]
785 pub fn wxxy(&self) -> Self { Self::new(self.w, self.x, self.x, self.y) }
786 #[inline(always)]
787 pub fn wxxz(&self) -> Self { Self::new(self.w, self.x, self.x, self.z) }
788 #[inline(always)]
789 pub fn wxxw(&self) -> Self { Self::new(self.w, self.x, self.x, self.w) }
790 #[inline(always)]
791 pub fn wxyx(&self) -> Self { Self::new(self.w, self.x, self.y, self.x) }
792 #[inline(always)]
793 pub fn wxyy(&self) -> Self { Self::new(self.w, self.x, self.y, self.y) }
794 #[inline(always)]
795 pub fn wxyz(&self) -> Self { Self::new(self.w, self.x, self.y, self.z) }
796 #[inline(always)]
797 pub fn wxyw(&self) -> Self { Self::new(self.w, self.x, self.y, self.w) }
798 #[inline(always)]
799 pub fn wxzx(&self) -> Self { Self::new(self.w, self.x, self.z, self.x) }
800 #[inline(always)]
801 pub fn wxzy(&self) -> Self { Self::new(self.w, self.x, self.z, self.y) }
802 #[inline(always)]
803 pub fn wxzz(&self) -> Self { Self::new(self.w, self.x, self.z, self.z) }
804 #[inline(always)]
805 pub fn wxzw(&self) -> Self { Self::new(self.w, self.x, self.z, self.w) }
806 #[inline(always)]
807 pub fn wxwx(&self) -> Self { Self::new(self.w, self.x, self.w, self.x) }
808 #[inline(always)]
809 pub fn wxwy(&self) -> Self { Self::new(self.w, self.x, self.w, self.y) }
810 #[inline(always)]
811 pub fn wxwz(&self) -> Self { Self::new(self.w, self.x, self.w, self.z) }
812 #[inline(always)]
813 pub fn wxww(&self) -> Self { Self::new(self.w, self.x, self.w, self.w) }
814 #[inline(always)]
815 pub fn wyxx(&self) -> Self { Self::new(self.w, self.y, self.x, self.x) }
816 #[inline(always)]
817 pub fn wyxy(&self) -> Self { Self::new(self.w, self.y, self.x, self.y) }
818 #[inline(always)]
819 pub fn wyxz(&self) -> Self { Self::new(self.w, self.y, self.x, self.z) }
820 #[inline(always)]
821 pub fn wyxw(&self) -> Self { Self::new(self.w, self.y, self.x, self.w) }
822 #[inline(always)]
823 pub fn wyyx(&self) -> Self { Self::new(self.w, self.y, self.y, self.x) }
824 #[inline(always)]
825 pub fn wyyy(&self) -> Self { Self::new(self.w, self.y, self.y, self.y) }
826 #[inline(always)]
827 pub fn wyyz(&self) -> Self { Self::new(self.w, self.y, self.y, self.z) }
828 #[inline(always)]
829 pub fn wyyw(&self) -> Self { Self::new(self.w, self.y, self.y, self.w) }
830 #[inline(always)]
831 pub fn wyzx(&self) -> Self { Self::new(self.w, self.y, self.z, self.x) }
832 #[inline(always)]
833 pub fn wyzy(&self) -> Self { Self::new(self.w, self.y, self.z, self.y) }
834 #[inline(always)]
835 pub fn wyzz(&self) -> Self { Self::new(self.w, self.y, self.z, self.z) }
836 #[inline(always)]
837 pub fn wyzw(&self) -> Self { Self::new(self.w, self.y, self.z, self.w) }
838 #[inline(always)]
839 pub fn wywx(&self) -> Self { Self::new(self.w, self.y, self.w, self.x) }
840 #[inline(always)]
841 pub fn wywy(&self) -> Self { Self::new(self.w, self.y, self.w, self.y) }
842 #[inline(always)]
843 pub fn wywz(&self) -> Self { Self::new(self.w, self.y, self.w, self.z) }
844 #[inline(always)]
845 pub fn wyww(&self) -> Self { Self::new(self.w, self.y, self.w, self.w) }
846 #[inline(always)]
847 pub fn wzxx(&self) -> Self { Self::new(self.w, self.z, self.x, self.x) }
848 #[inline(always)]
849 pub fn wzxy(&self) -> Self { Self::new(self.w, self.z, self.x, self.y) }
850 #[inline(always)]
851 pub fn wzxz(&self) -> Self { Self::new(self.w, self.z, self.x, self.z) }
852 #[inline(always)]
853 pub fn wzxw(&self) -> Self { Self::new(self.w, self.z, self.x, self.w) }
854 #[inline(always)]
855 pub fn wzyx(&self) -> Self { Self::new(self.w, self.z, self.y, self.x) }
856 #[inline(always)]
857 pub fn wzyy(&self) -> Self { Self::new(self.w, self.z, self.y, self.y) }
858 #[inline(always)]
859 pub fn wzyz(&self) -> Self { Self::new(self.w, self.z, self.y, self.z) }
860 #[inline(always)]
861 pub fn wzyw(&self) -> Self { Self::new(self.w, self.z, self.y, self.w) }
862 #[inline(always)]
863 pub fn wzzx(&self) -> Self { Self::new(self.w, self.z, self.z, self.x) }
864 #[inline(always)]
865 pub fn wzzy(&self) -> Self { Self::new(self.w, self.z, self.z, self.y) }
866 #[inline(always)]
867 pub fn wzzz(&self) -> Self { Self::new(self.w, self.z, self.z, self.z) }
868 #[inline(always)]
869 pub fn wzzw(&self) -> Self { Self::new(self.w, self.z, self.z, self.w) }
870 #[inline(always)]
871 pub fn wzwx(&self) -> Self { Self::new(self.w, self.z, self.w, self.x) }
872 #[inline(always)]
873 pub fn wzwy(&self) -> Self { Self::new(self.w, self.z, self.w, self.y) }
874 #[inline(always)]
875 pub fn wzwz(&self) -> Self { Self::new(self.w, self.z, self.w, self.z) }
876 #[inline(always)]
877 pub fn wzww(&self) -> Self { Self::new(self.w, self.z, self.w, self.w) }
878 #[inline(always)]
879 pub fn wwxx(&self) -> Self { Self::new(self.w, self.w, self.x, self.x) }
880 #[inline(always)]
881 pub fn wwxy(&self) -> Self { Self::new(self.w, self.w, self.x, self.y) }
882 #[inline(always)]
883 pub fn wwxz(&self) -> Self { Self::new(self.w, self.w, self.x, self.z) }
884 #[inline(always)]
885 pub fn wwxw(&self) -> Self { Self::new(self.w, self.w, self.x, self.w) }
886 #[inline(always)]
887 pub fn wwyx(&self) -> Self { Self::new(self.w, self.w, self.y, self.x) }
888 #[inline(always)]
889 pub fn wwyy(&self) -> Self { Self::new(self.w, self.w, self.y, self.y) }
890 #[inline(always)]
891 pub fn wwyz(&self) -> Self { Self::new(self.w, self.w, self.y, self.z) }
892 #[inline(always)]
893 pub fn wwyw(&self) -> Self { Self::new(self.w, self.w, self.y, self.w) }
894 #[inline(always)]
895 pub fn wwzx(&self) -> Self { Self::new(self.w, self.w, self.z, self.x) }
896 #[inline(always)]
897 pub fn wwzy(&self) -> Self { Self::new(self.w, self.w, self.z, self.y) }
898 #[inline(always)]
899 pub fn wwzz(&self) -> Self { Self::new(self.w, self.w, self.z, self.z) }
900 #[inline(always)]
901 pub fn wwzw(&self) -> Self { Self::new(self.w, self.w, self.z, self.w) }
902 #[inline(always)]
903 pub fn wwwx(&self) -> Self { Self::new(self.w, self.w, self.w, self.x) }
904 #[inline(always)]
905 pub fn wwwy(&self) -> Self { Self::new(self.w, self.w, self.w, self.y) }
906 #[inline(always)]
907 pub fn wwwz(&self) -> Self { Self::new(self.w, self.w, self.w, self.z) }
908 #[inline(always)]
909 pub fn wwww(&self) -> Self { Self::new(self.w, self.w, self.w, self.w) }
910}
911
912impl<T> Vec4<T> where T:Vec + Math
913{
914 #[inline]
915 pub fn dot(&self, b: Self) -> T
916 {
917 return self.x * b.x + self.y * b.y + self.z * b.z + self.w * b.w;
918 }
919
920 #[inline]
921 pub fn cross(&self, b: Self) -> Self
922 {
923 Vec4
924 {
925 x:self.w * b.x + self.x * b.w + self.z * b.y - self.y * b.z,
926 y:self.w * b.y + self.y * b.w + self.x * b.z - self.z * b.x,
927 z:self.w * b.z + self.z * b.w + self.y * b.x - self.x * b.y,
928 w:self.w * b.w - self.x * b.x - self.y * b.y - self.z * b.z,
929 }
930 }
931
932 #[inline]
933 pub fn length2(&self) -> T
934 {
935 return self.dot(*self);
936 }
937
938 #[inline]
939 pub fn length(&self) -> T
940 {
941 return self.length2().sqrt();
942 }
943
944 #[inline]
945 pub fn distance(&self, b: Self) -> T
946 {
947 return (*self - b).length();
948 }
949
950 #[inline]
951 pub fn normalize(&self) -> Self
952 {
953 let mag_sq = self.length2();
954 if mag_sq.gt(T::zero())
955 {
956 let inv_sqrt = T::one() / mag_sq.sqrt();
957 return *self * inv_sqrt;
958 }
959
960 return *self;
961 }
962}
963
964impl<T> Math for Vec4<T> where T:Copy + Math
965{
966 #[inline]
967 fn abs(self) -> Self
968 {
969 let mx = self.x.abs();
970 let my = self.y.abs();
971 let mz = self.z.abs();
972 let mw = self.w.abs();
973 Self { x: mx, y: my, z: mz, w:mw }
974 }
975
976 #[inline]
977 fn recip(self) -> Self
978 {
979 let mx = self.x.recip();
980 let my = self.y.recip();
981 let mz = self.z.recip();
982 let mw = self.w.recip();
983 Self { x: mx, y: my, z: mz, w:mw }
984 }
985
986 #[inline]
987 fn sqrt(self) -> Self
988 {
989 let mx = self.x.sqrt();
990 let my = self.y.sqrt();
991 let mz = self.z.sqrt();
992 let mw = self.w.sqrt();
993 Self { x: mx, y: my, z: mz, w:mw }
994 }
995
996 #[inline]
997 fn rsqrt(self) -> Self
998 {
999 let mx = self.x.rsqrt();
1000 let my = self.y.rsqrt();
1001 let mz = self.z.rsqrt();
1002 let mw = self.w.rsqrt();
1003 Self { x: mx, y: my, z: mz, w:mw }
1004 }
1005
1006 #[inline]
1007 fn sin(self) -> Self
1008 {
1009 let mx = self.x.sin();
1010 let my = self.y.sin();
1011 let mz = self.z.sin();
1012 let mw = self.w.sin();
1013 Self { x: mx, y: my, z: mz, w:mw }
1014 }
1015
1016 #[inline]
1017 fn cos(self) -> Self
1018 {
1019 let mx = self.x.cos();
1020 let my = self.y.cos();
1021 let mz = self.z.cos();
1022 let mw = self.w.cos();
1023 Self { x: mx, y: my, z: mz, w:mw }
1024 }
1025
1026 #[inline]
1027 fn tan(self) -> Self
1028 {
1029 let mx = self.x.tan();
1030 let my = self.y.tan();
1031 let mz = self.z.tan();
1032 let mw = self.w.tan();
1033 Self { x: mx, y: my, z: mz, w:mw }
1034 }
1035
1036 #[inline]
1037 fn sincos(self) -> (Vec4<T>, Vec4<T>)
1038 {
1039 let mx = self.x.sincos();
1040 let my = self.y.sincos();
1041 let mz = self.z.sincos();
1042 let mw = self.w.sincos();
1043 (
1044 Self { x: mx.0, y: my.0, z: mz.0, w: mw.0 },
1045 Self { x: mx.1, y: my.1, z: mz.1, w: mw.1 }
1046 )
1047 }
1048
1049 #[inline]
1050 fn acos(self) -> Self
1051 {
1052 let mx = self.x.acos();
1053 let my = self.y.acos();
1054 let mz = self.z.acos();
1055 let mw = self.w.acos();
1056 Self { x: mx, y: my, z: mz, w:mw }
1057 }
1058
1059 #[inline]
1060 fn asin(self) -> Self
1061 {
1062 let mx = self.x.asin();
1063 let my = self.y.asin();
1064 let mz = self.z.asin();
1065 let mw = self.w.asin();
1066 Self { x: mx, y: my, z: mz, w:mw }
1067 }
1068
1069 #[inline]
1070 fn atan(self) -> Self
1071 {
1072 let mx = self.x.atan();
1073 let my = self.y.atan();
1074 let mz = self.z.atan();
1075 let mw = self.w.atan();
1076 Self { x: mx, y: my, z: mz, w:mw }
1077 }
1078
1079 #[inline]
1080 fn exp(self) -> Self
1081 {
1082 let mx = self.x.exp();
1083 let my = self.y.exp();
1084 let mz = self.z.exp();
1085 let mw = self.w.exp();
1086 Self { x: mx, y: my, z: mz, w:mw }
1087 }
1088
1089 #[inline]
1090 fn exp2(self) -> Self
1091 {
1092 let mx = self.x.exp2();
1093 let my = self.y.exp2();
1094 let mz = self.z.exp2();
1095 let mw = self.w.exp2();
1096 Self { x: mx, y: my, z: mz, w:mw }
1097 }
1098
1099 #[inline]
1100 fn log(self, _rhs: Self) -> Self
1101 {
1102 let mx = self.x.log(_rhs.x);
1103 let my = self.y.log(_rhs.y);
1104 let mz = self.z.log(_rhs.z);
1105 let mw = self.w.log(_rhs.w);
1106 Self { x: mx, y: my, z: mz, w:mw }
1107 }
1108
1109 #[inline]
1110 fn log2(self) -> Self
1111 {
1112 let mx = self.x.log2();
1113 let my = self.y.log2();
1114 let mz = self.z.log2();
1115 let mw = self.w.log2();
1116 Self { x: mx, y: my, z: mz, w:mw }
1117 }
1118
1119 #[inline]
1120 fn log10(self) -> Self
1121 {
1122 let mx = self.x.log10();
1123 let my = self.y.log10();
1124 let mz = self.z.log10();
1125 let mw = self.w.log10();
1126 Self { x: mx, y: my, z: mz, w:mw }
1127 }
1128
1129 #[inline]
1130 fn to_radians(self) -> Self
1131 {
1132 let mx = self.x.to_radians();
1133 let my = self.y.to_radians();
1134 let mz = self.z.to_radians();
1135 let mw = self.w.to_radians();
1136 Self { x: mx, y: my, z: mz, w:mw }
1137 }
1138
1139 #[inline]
1140 fn to_degrees(self) -> Self
1141 {
1142 let mx = self.x.to_degrees();
1143 let my = self.y.to_degrees();
1144 let mz = self.z.to_degrees();
1145 let mw = self.w.to_degrees();
1146 Self { x: mx, y: my, z: mz, w:mw }
1147 }
1148
1149 #[inline]
1150 fn min(self, _rhs: Self) -> Self
1151 {
1152 let mx = self.x.min(_rhs.x);
1153 let my = self.y.min(_rhs.y);
1154 let mz = self.z.min(_rhs.z);
1155 let mw = self.w.min(_rhs.x);
1156 Self { x: mx, y: my, z: mz, w:mw }
1157 }
1158
1159 #[inline]
1160 fn max(self, _rhs: Self) -> Self
1161 {
1162 let mx = self.x.max(_rhs.x);
1163 let my = self.y.max(_rhs.y);
1164 let mz = self.z.max(_rhs.z);
1165 let mw = self.w.max(_rhs.w);
1166 Self { x: mx, y: my, z: mz, w:mw }
1167 }
1168
1169 #[inline]
1170 fn saturate(self) -> Self
1171 {
1172 let mx = self.x.saturate();
1173 let my = self.y.saturate();
1174 let mz = self.z.saturate();
1175 let mw = self.w.saturate();
1176 Self { x: mx, y: my, z: mz, w: mw }
1177 }
1178
1179 #[inline]
1180 fn snorm2unorm(self) -> Self
1181 {
1182 let mx = self.x.snorm2unorm();
1183 let my = self.y.snorm2unorm();
1184 let mz = self.z.snorm2unorm();
1185 let mw = self.w.snorm2unorm();
1186 Self { x: mx, y: my, z: mz, w: mw }
1187 }
1188
1189 #[inline]
1190 fn unorm2snorm(self) -> Self
1191 {
1192 let mx = self.x.unorm2snorm();
1193 let my = self.y.unorm2snorm();
1194 let mz = self.z.unorm2snorm();
1195 let mw = self.w.unorm2snorm();
1196 Self { x: mx, y: my, z: mz, w: mw }
1197 }
1198
1199 #[inline]
1200 fn clamp(self, minval: Self, maxval: Self) -> Self
1201 {
1202 let mx = self.x.clamp(minval.x, maxval.x);
1203 let my = self.y.clamp(minval.y, maxval.y);
1204 let mz = self.z.clamp(minval.z, maxval.z);
1205 let mw = self.w.clamp(minval.w, maxval.w);
1206 Self { x: mx, y: my, z: mz, w:mw }
1207 }
1208}
1209
1210impl<T> Interpolation<T> for Vec4<T> where T: Copy + One + Mul<Output=T> + Add<Output=T> + Sub<Output=T>
1211{
1212 #[inline(always)]
1213 fn lerp(self, b: Self, t: T) -> Self
1214 {
1215 return self*(T::one() - t) + b*t;
1216 }
1217}
1218
1219impl<T> Zero for Vec4<T> where T:Zero
1220{
1221 #[inline(always)]
1222 fn zero() -> Self
1223 {
1224 Self
1225 {
1226 x: T::zero(), y: T::zero(), z: T::zero(), w: T::zero()
1227 }
1228 }
1229}
1230
1231impl<T> One for Vec4<T> where T:One
1232{
1233 #[inline(always)]
1234 fn one() -> Self
1235 {
1236 Self
1237 {
1238 x: T::one(), y: T::one(), z: T::one(), w: T::one()
1239 }
1240 }
1241}
1242
1243impl<T> UnitX for Vec4<T> where T:One + Zero
1244{
1245 #[inline(always)]
1246 fn unit_x() -> Self
1247 {
1248 Self
1249 {
1250 x: T::one(), y: T::zero(), z: T::zero(), w: T::one()
1251 }
1252 }
1253}
1254
1255impl<T> UnitY for Vec4<T> where T:One + Zero
1256{
1257 #[inline(always)]
1258 fn unit_y() -> Self
1259 {
1260 Self
1261 {
1262 x: T::zero(), y: T::one(), z: T::zero(), w: T::one()
1263 }
1264 }
1265}
1266
1267impl<T> UnitZ for Vec4<T> where T:One + Zero
1268{
1269 #[inline(always)]
1270 fn unit_z() -> Self
1271 {
1272 Self
1273 {
1274 x: T::zero(), y: T::one(), z: T::zero(), w: T::one()
1275 }
1276 }
1277}
1278
1279impl<T> UnitW for Vec4<T> where T:One + Zero
1280{
1281 #[inline(always)]
1282 fn unit_w() -> Self
1283 {
1284 Self
1285 {
1286 x: T::zero(), y: T::zero(), z: T::zero(), w: T::one()
1287 }
1288 }
1289}
1290
1291impl<T> fmt::Display for Vec4<T> where T:Debug
1292{
1293 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
1294 {
1295 write!(f, "({:?}, {:?}, {:?}, {:?})", self.x, self.y, self.z, self.w)
1296 }
1297}
1298
1299impl<T> fmt::Binary for Vec4<T> where T:Vec + Math
1300{
1301 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
1302 {
1303 let len = self.length();
1304 let decimals = f.precision().unwrap_or(3);
1305 let string = format!("{:.*?}", decimals, len);
1306 f.pad_integral(true, "", &string)
1307 }
1308}
1309
1310impl<T> From<Vec3<T>> for Vec4<T> where T:Copy + One
1311{
1312 fn from(v:Vec3<T>) -> Self
1313 {
1314 Self
1315 {
1316 x:v.x,
1317 y:v.y,
1318 z:v.z,
1319 w:T::one()
1320 }
1321 }
1322}
1323
1324impl<T> From<Vec4<T>> for Vec3<T> where T:Copy + Div<Output=T>
1325{
1326 fn from(v:Vec4<T>) -> Self
1327 {
1328 Self
1329 {
1330 x:v.x / v.w,
1331 y:v.y / v.w,
1332 z:v.z / v.w,
1333 }
1334 }
1335}
1336
1337impl<T> From<[T;4]> for Vec4<T> where T:Copy
1338{
1339 fn from(v:[T;4]) -> Self
1340 {
1341 Self
1342 {
1343 x:v[0],
1344 y:v[1],
1345 z:v[2],
1346 w:v[3],
1347 }
1348 }
1349}
1350
1351impl<T> From<(T,T,T,T)> for Vec4<T> where T:Copy
1352{
1353 fn from(v:(T,T,T,T)) -> Self
1354 {
1355 Self
1356 {
1357 x:v.0,
1358 y:v.1,
1359 z:v.2,
1360 w:v.3
1361 }
1362 }
1363}
1364
1365impl<T> AsRef<Vec4<T>> for Vec4<T>
1366{
1367 fn as_ref(&self) -> &Vec4<T>
1368 {
1369 self
1370 }
1371}
1372
1373impl<T> AsMut<Vec4<T>> for Vec4<T>
1374{
1375 fn as_mut(&mut self) -> &mut Vec4<T>
1376 {
1377 self
1378 }
1379}