octoon_math/
vec4.rs

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	/// Creates a new Vec4 from multiple components
223	#[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}