• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1///////////////////////////////////////////////////////////////////////////////////////////////////
2// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
3///////////////////////////////////////////////////////////////////////////////////////////////////
4// Created : 2008-03-10
5// Updated : 2008-03-15
6// Licence : This source is under MIT License
7// File    : gtx_associated_min_max.inl
8///////////////////////////////////////////////////////////////////////////////////////////////////
9
10namespace glm{
11
12// Min comparison between 2 variables
13template<typename T, typename U, precision P>
14GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b)
15{
16	return x < y ? a : b;
17}
18
19template<typename T, typename U, precision P>
20GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
21(
22	const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,
23	const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b
24)
25{
26	detail::tvec2<U, P> Result;
27	//Result.x = x[0] < y[0] ? a[0] : b[0];
28	//Result.y = x[1] < y[1] ? a[1] : b[1];
29	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
30		Result[i] = x[i] < y[i] ? a[i] : b[i];
31	return Result;
32}
33
34template<typename T, typename U, precision P>
35GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
36(
37	const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,
38	const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b
39)
40{
41	detail::tvec3<U, P> Result;
42	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
43		Result[i] = x[i] < y[i] ? a[i] : b[i];
44	return Result;
45}
46
47template<typename T, typename U, precision P>
48GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
49(
50	const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,
51	const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b
52)
53{
54	detail::tvec4<U, P> Result;
55	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
56		Result[i] = x[i] < y[i] ? a[i] : b[i];
57	return Result;
58}
59
60template<typename T, typename U, precision P>
61GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
62(
63	T x, const detail::tvec2<U, P>& a,
64	T y, const detail::tvec2<U, P>& b
65)
66{
67	detail::tvec2<U, P> Result;
68	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
69		Result[i] = x < y ? a[i] : b[i];
70	return Result;
71}
72
73template<typename T, typename U, precision P>
74GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
75(
76	T x, const detail::tvec3<U, P>& a,
77	T y, const detail::tvec3<U, P>& b
78)
79{
80	detail::tvec3<U, P> Result;
81	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
82		Result[i] = x < y ? a[i] : b[i];
83	return Result;
84}
85
86template<typename T, typename U, precision P>
87GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
88(
89	T x, const detail::tvec4<U, P>& a,
90	T y, const detail::tvec4<U, P>& b
91)
92{
93	detail::tvec4<U, P> Result;
94	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
95		Result[i] = x < y ? a[i] : b[i];
96	return Result;
97}
98
99template<typename T, typename U, precision P>
100GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
101(
102	detail::tvec2<T, P> const & x, U a,
103	detail::tvec2<T, P> const & y, U b
104)
105{
106	detail::tvec2<U, P> Result;
107	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
108		Result[i] = x[i] < y[i] ? a : b;
109	return Result;
110}
111
112template<typename T, typename U, precision P>
113GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
114(
115	const detail::tvec3<T, P>& x, U a,
116	const detail::tvec3<T, P>& y, U b
117)
118{
119	detail::tvec3<U, P> Result;
120	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
121		Result[i] = x[i] < y[i] ? a : b;
122	return Result;
123}
124
125template<typename T, typename U, precision P>
126GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
127(
128	const detail::tvec4<T, P>& x, U a,
129	const detail::tvec4<T, P>& y, U b
130)
131{
132	detail::tvec4<U, P> Result;
133	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
134		Result[i] = x[i] < y[i] ? a : b;
135	return Result;
136}
137
138// Min comparison between 3 variables
139template<typename T, typename U>
140GLM_FUNC_QUALIFIER U associatedMin
141(
142	T x, U a,
143	T y, U b,
144	T z, U c
145)
146{
147	U Result = x < y ? (x < z ? a : c) : (y < z ? b : c);
148	return Result;
149}
150
151template<typename T, typename U, precision P>
152GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
153(
154	const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,
155	const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,
156	const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c
157)
158{
159	detail::tvec2<U, P> Result;
160	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
161		Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
162	return Result;
163}
164
165template<typename T, typename U, precision P>
166GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
167(
168	const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,
169	const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,
170	const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c
171)
172{
173	detail::tvec3<U, P> Result;
174	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
175		Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
176	return Result;
177}
178
179template<typename T, typename U, precision P>
180GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
181(
182	const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,
183	const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,
184	const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c
185)
186{
187	detail::tvec4<U, P> Result;
188	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
189		Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]);
190	return Result;
191}
192
193// Min comparison between 4 variables
194template<typename T, typename U>
195GLM_FUNC_QUALIFIER U associatedMin
196(
197	T x, U a,
198	T y, U b,
199	T z, U c,
200	T w, U d
201)
202{
203	T Test1 = min(x, y);
204	T Test2 = min(z, w);;
205	U Result1 = x < y ? a : b;
206	U Result2 = z < w ? c : d;
207	U Result = Test1 < Test2 ? Result1 : Result2;
208	return Result;
209}
210
211// Min comparison between 4 variables
212template<typename T, typename U, precision P>
213GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
214(
215	const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,
216	const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,
217	const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c,
218	const detail::tvec2<T, P>& w, const detail::tvec2<U, P>& d
219)
220{
221	detail::tvec2<U, P> Result;
222	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
223	{
224		T Test1 = min(x[i], y[i]);
225		T Test2 = min(z[i], w[i]);
226		U Result1 = x[i] < y[i] ? a[i] : b[i];
227		U Result2 = z[i] < w[i] ? c[i] : d[i];
228		Result[i] = Test1 < Test2 ? Result1 : Result2;
229	}
230	return Result;
231}
232
233// Min comparison between 4 variables
234template<typename T, typename U, precision P>
235GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
236(
237	const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,
238	const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,
239	const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c,
240	const detail::tvec3<T, P>& w, const detail::tvec3<U, P>& d
241)
242{
243	detail::tvec3<U, P> Result;
244	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
245	{
246		T Test1 = min(x[i], y[i]);
247		T Test2 = min(z[i], w[i]);
248		U Result1 = x[i] < y[i] ? a[i] : b[i];
249		U Result2 = z[i] < w[i] ? c[i] : d[i];
250		Result[i] = Test1 < Test2 ? Result1 : Result2;
251	}
252	return Result;
253}
254
255// Min comparison between 4 variables
256template<typename T, typename U, precision P>
257GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
258(
259	const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,
260	const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,
261	const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c,
262	const detail::tvec4<T, P>& w, const detail::tvec4<U, P>& d
263)
264{
265	detail::tvec4<U, P> Result;
266	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
267	{
268		T Test1 = min(x[i], y[i]);
269		T Test2 = min(z[i], w[i]);
270		U Result1 = x[i] < y[i] ? a[i] : b[i];
271		U Result2 = z[i] < w[i] ? c[i] : d[i];
272		Result[i] = Test1 < Test2 ? Result1 : Result2;
273	}
274	return Result;
275}
276
277// Min comparison between 4 variables
278template<typename T, typename U, precision P>
279GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
280(
281	T x, const detail::tvec2<U, P>& a,
282	T y, const detail::tvec2<U, P>& b,
283	T z, const detail::tvec2<U, P>& c,
284	T w, const detail::tvec2<U, P>& d
285)
286{
287	T Test1 = min(x, y);
288	T Test2 = min(z, w);
289
290	detail::tvec2<U, P> Result;
291	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
292	{
293		U Result1 = x < y ? a[i] : b[i];
294		U Result2 = z < w ? c[i] : d[i];
295		Result[i] = Test1 < Test2 ? Result1 : Result2;
296	}
297	return Result;
298}
299
300// Min comparison between 4 variables
301template<typename T, typename U, precision P>
302GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
303(
304	T x, const detail::tvec3<U, P>& a,
305	T y, const detail::tvec3<U, P>& b,
306	T z, const detail::tvec3<U, P>& c,
307	T w, const detail::tvec3<U, P>& d
308)
309{
310	T Test1 = min(x, y);
311	T Test2 = min(z, w);
312
313	detail::tvec3<U, P> Result;
314	for(typename detail::tvec3<U, P>::size_type i = 0; i < detail::tvec3<U, P>::value_size; ++i)
315	{
316		U Result1 = x < y ? a[i] : b[i];
317		U Result2 = z < w ? c[i] : d[i];
318		Result[i] = Test1 < Test2 ? Result1 : Result2;
319	}
320	return Result;
321}
322
323// Min comparison between 4 variables
324template<typename T, typename U, precision P>
325GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
326(
327	T x, const detail::tvec4<U, P>& a,
328	T y, const detail::tvec4<U, P>& b,
329	T z, const detail::tvec4<U, P>& c,
330	T w, const detail::tvec4<U, P>& d
331)
332{
333	T Test1 = min(x, y);
334	T Test2 = min(z, w);
335
336	detail::tvec4<U, P> Result;
337	for(typename detail::tvec4<U, P>::size_type i = 0; i < detail::tvec4<U, P>::value_size; ++i)
338	{
339		U Result1 = x < y ? a[i] : b[i];
340		U Result2 = z < w ? c[i] : d[i];
341		Result[i] = Test1 < Test2 ? Result1 : Result2;
342	}
343	return Result;
344}
345
346// Min comparison between 4 variables
347template<typename T, typename U, precision P>
348GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMin
349(
350	const detail::tvec2<T, P>& x, U a,
351	const detail::tvec2<T, P>& y, U b,
352	const detail::tvec2<T, P>& z, U c,
353	const detail::tvec2<T, P>& w, U d
354)
355{
356	detail::tvec2<U, P> Result;
357	for(typename detail::tvec2<T, P>::size_type i = 0; i < detail::tvec2<T, P>::value_size(); ++i)
358	{
359		T Test1 = min(x[i], y[i]);
360		T Test2 = min(z[i], w[i]);;
361		U Result1 = x[i] < y[i] ? a : b;
362		U Result2 = z[i] < w[i] ? c : d;
363		Result[i] = Test1 < Test2 ? Result1 : Result2;
364	}
365	return Result;
366}
367
368// Min comparison between 4 variables
369template<typename T, typename U, precision P>
370GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMin
371(
372	const detail::tvec3<T, P>& x, U a,
373	const detail::tvec3<T, P>& y, U b,
374	const detail::tvec3<T, P>& z, U c,
375	const detail::tvec3<T, P>& w, U d
376)
377{
378	detail::tvec3<U, P> Result;
379	for(typename detail::tvec3<T, P>::size_type i = 0; i < detail::tvec3<T, P>::value_size(); ++i)
380	{
381		T Test1 = min(x[i], y[i]);
382		T Test2 = min(z[i], w[i]);;
383		U Result1 = x[i] < y[i] ? a : b;
384		U Result2 = z[i] < w[i] ? c : d;
385		Result[i] = Test1 < Test2 ? Result1 : Result2;
386	}
387	return Result;
388}
389
390// Min comparison between 4 variables
391template<typename T, typename U, precision P>
392GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMin
393(
394	const detail::tvec4<T, P>& x, U a,
395	const detail::tvec4<T, P>& y, U b,
396	const detail::tvec4<T, P>& z, U c,
397	const detail::tvec4<T, P>& w, U d
398)
399{
400	detail::tvec4<U, P> Result;
401	for(typename detail::tvec4<T, P>::size_type i = 0; i < detail::tvec4<T, P>::value_size(); ++i)
402	{
403		T Test1 = min(x[i], y[i]);
404		T Test2 = min(z[i], w[i]);;
405		U Result1 = x[i] < y[i] ? a : b;
406		U Result2 = z[i] < w[i] ? c : d;
407		Result[i] = Test1 < Test2 ? Result1 : Result2;
408	}
409	return Result;
410}
411
412// Max comparison between 2 variables
413template<typename T, typename U>
414GLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b)
415{
416	return x > y ? a : b;
417}
418
419// Max comparison between 2 variables
420template<typename T, typename U, precision P>
421GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
422(
423	const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,
424	const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b
425)
426{
427	detail::tvec2<U, P> Result;
428	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
429		Result[i] = x[i] > y[i] ? a[i] : b[i];
430	return Result;
431}
432
433// Max comparison between 2 variables
434template<typename T, typename U, precision P>
435GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
436(
437	const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,
438	const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b
439)
440{
441	detail::tvec3<U, P> Result;
442	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
443		Result[i] = x[i] > y[i] ? a[i] : b[i];
444	return Result;
445}
446
447// Max comparison between 2 variables
448template<typename T, typename U, precision P>
449GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
450(
451	const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,
452	const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b
453)
454{
455	detail::tvec4<U, P> Result;
456	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
457		Result[i] = x[i] > y[i] ? a[i] : b[i];
458	return Result;
459}
460
461// Max comparison between 2 variables
462template<typename T, typename U, precision P>
463GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
464(
465	T x, const detail::tvec2<U, P>& a,
466	T y, const detail::tvec2<U, P>& b
467)
468{
469	detail::tvec2<U, P> Result;
470	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
471		Result[i] = x > y ? a[i] : b[i];
472	return Result;
473}
474
475// Max comparison between 2 variables
476template<typename T, typename U, precision P>
477GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
478(
479	T x, const detail::tvec3<U, P>& a,
480	T y, const detail::tvec3<U, P>& b
481)
482{
483	detail::tvec3<U, P> Result;
484	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
485		Result[i] = x > y ? a[i] : b[i];
486	return Result;
487}
488
489// Max comparison between 2 variables
490template<typename T, typename U, precision P>
491GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
492(
493	T x, const detail::tvec4<U, P>& a,
494	T y, const detail::tvec4<U, P>& b
495)
496{
497	detail::tvec4<U, P> Result;
498	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
499		Result[i] = x > y ? a[i] : b[i];
500	return Result;
501}
502
503// Max comparison between 2 variables
504template<typename T, typename U, precision P>
505GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
506(
507	const detail::tvec2<T, P>& x, U a,
508	const detail::tvec2<T, P>& y, U b
509)
510{
511	detail::tvec2<U, P> Result;
512	for(typename detail::tvec2<T, P>::size_type i = 0; i < Result.length(); ++i)
513		Result[i] = x[i] > y[i] ? a : b;
514	return Result;
515}
516
517// Max comparison between 2 variables
518template<typename T, typename U, precision P>
519GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
520(
521	const detail::tvec3<T, P>& x, U a,
522	const detail::tvec3<T, P>& y, U b
523)
524{
525	detail::tvec3<U, P> Result;
526	for(typename detail::tvec3<T, P>::size_type i = 0; i < Result.length(); ++i)
527		Result[i] = x[i] > y[i] ? a : b;
528	return Result;
529}
530
531// Max comparison between 2 variables
532template<typename T, typename U, precision P>
533GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
534(
535	const detail::tvec4<T, P>& x, U a,
536	const detail::tvec4<T, P>& y, U b
537)
538{
539	detail::tvec4<U, P> Result;
540	for(typename detail::tvec4<T, P>::size_type i = 0; i < Result.length(); ++i)
541		Result[i] = x[i] > y[i] ? a : b;
542	return Result;
543}
544
545// Max comparison between 3 variables
546template<typename T, typename U>
547GLM_FUNC_QUALIFIER U associatedMax
548(
549	T x, U a,
550	T y, U b,
551	T z, U c
552)
553{
554	U Result = x > y ? (x > z ? a : c) : (y > z ? b : c);
555	return Result;
556}
557
558// Max comparison between 3 variables
559template<typename T, typename U, precision P>
560GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
561(
562	const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,
563	const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,
564	const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c
565)
566{
567	detail::tvec2<U, P> Result;
568	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
569		Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
570	return Result;
571}
572
573// Max comparison between 3 variables
574template<typename T, typename U, precision P>
575GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
576(
577	const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,
578	const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,
579	const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c
580)
581{
582	detail::tvec3<U, P> Result;
583	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
584		Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
585	return Result;
586}
587
588// Max comparison between 3 variables
589template<typename T, typename U, precision P>
590GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
591(
592	const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,
593	const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,
594	const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c
595)
596{
597	detail::tvec4<U, P> Result;
598	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
599		Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]);
600	return Result;
601}
602
603// Max comparison between 3 variables
604template<typename T, typename U, precision P>
605GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
606(
607	T x, const detail::tvec2<U, P>& a,
608	T y, const detail::tvec2<U, P>& b,
609	T z, const detail::tvec2<U, P>& c
610)
611{
612	detail::tvec2<U, P> Result;
613	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
614		Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
615	return Result;
616}
617
618// Max comparison between 3 variables
619template<typename T, typename U, precision P>
620GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
621(
622	T x, const detail::tvec3<U, P>& a,
623	T y, const detail::tvec3<U, P>& b,
624	T z, const detail::tvec3<U, P>& c
625)
626{
627	detail::tvec3<U, P> Result;
628	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
629		Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
630	return Result;
631}
632
633// Max comparison between 3 variables
634template<typename T, typename U, precision P>
635GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
636(
637	T x, const detail::tvec4<U, P>& a,
638	T y, const detail::tvec4<U, P>& b,
639	T z, const detail::tvec4<U, P>& c
640)
641{
642	detail::tvec4<U, P> Result;
643	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
644		Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]);
645	return Result;
646}
647
648// Max comparison between 3 variables
649template<typename T, typename U, precision P>
650GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
651(
652	const detail::tvec2<T, P>& x, U a,
653	const detail::tvec2<T, P>& y, U b,
654	const detail::tvec2<T, P>& z, U c
655)
656{
657	detail::tvec2<U, P> Result;
658	for(typename detail::tvec2<T, P>::size_type i = 0; i < Result.length(); ++i)
659		Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
660	return Result;
661}
662
663// Max comparison between 3 variables
664template<typename T, typename U, precision P>
665GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
666(
667	const detail::tvec3<T, P>& x, U a,
668	const detail::tvec3<T, P>& y, U b,
669	const detail::tvec3<T, P>& z, U c
670)
671{
672	detail::tvec3<U, P> Result;
673	for(typename detail::tvec3<T, P>::size_type i = 0; i < Result.length(); ++i)
674		Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
675	return Result;
676}
677
678// Max comparison between 3 variables
679template<typename T, typename U, precision P>
680GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
681(
682	const detail::tvec4<T, P>& x, U a,
683	const detail::tvec4<T, P>& y, U b,
684	const detail::tvec4<T, P>& z, U c
685)
686{
687	detail::tvec4<U, P> Result;
688	for(typename detail::tvec4<T, P>::size_type i = 0; i < Result.length(); ++i)
689		Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c);
690	return Result;
691}
692
693// Max comparison between 4 variables
694template<typename T, typename U>
695GLM_FUNC_QUALIFIER U associatedMax
696(
697	T x, U a,
698	T y, U b,
699	T z, U c,
700	T w, U d
701)
702{
703	T Test1 = max(x, y);
704	T Test2 = max(z, w);;
705	U Result1 = x > y ? a : b;
706	U Result2 = z > w ? c : d;
707	U Result = Test1 > Test2 ? Result1 : Result2;
708	return Result;
709}
710
711// Max comparison between 4 variables
712template<typename T, typename U, precision P>
713GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
714(
715	const detail::tvec2<T, P>& x, const detail::tvec2<U, P>& a,
716	const detail::tvec2<T, P>& y, const detail::tvec2<U, P>& b,
717	const detail::tvec2<T, P>& z, const detail::tvec2<U, P>& c,
718	const detail::tvec2<T, P>& w, const detail::tvec2<U, P>& d
719)
720{
721	detail::tvec2<U, P> Result;
722	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
723	{
724		T Test1 = max(x[i], y[i]);
725		T Test2 = max(z[i], w[i]);
726		U Result1 = x[i] > y[i] ? a[i] : b[i];
727		U Result2 = z[i] > w[i] ? c[i] : d[i];
728		Result[i] = Test1 > Test2 ? Result1 : Result2;
729	}
730	return Result;
731}
732
733// Max comparison between 4 variables
734template<typename T, typename U, precision P>
735GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
736(
737	const detail::tvec3<T, P>& x, const detail::tvec3<U, P>& a,
738	const detail::tvec3<T, P>& y, const detail::tvec3<U, P>& b,
739	const detail::tvec3<T, P>& z, const detail::tvec3<U, P>& c,
740	const detail::tvec3<T, P>& w, const detail::tvec3<U, P>& d
741)
742{
743	detail::tvec3<U, P> Result;
744	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
745	{
746		T Test1 = max(x[i], y[i]);
747		T Test2 = max(z[i], w[i]);
748		U Result1 = x[i] > y[i] ? a[i] : b[i];
749		U Result2 = z[i] > w[i] ? c[i] : d[i];
750		Result[i] = Test1 > Test2 ? Result1 : Result2;
751	}
752	return Result;
753}
754
755// Max comparison between 4 variables
756template<typename T, typename U, precision P>
757GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
758(
759	const detail::tvec4<T, P>& x, const detail::tvec4<U, P>& a,
760	const detail::tvec4<T, P>& y, const detail::tvec4<U, P>& b,
761	const detail::tvec4<T, P>& z, const detail::tvec4<U, P>& c,
762	const detail::tvec4<T, P>& w, const detail::tvec4<U, P>& d
763)
764{
765	detail::tvec4<U, P> Result;
766	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
767	{
768		T Test1 = max(x[i], y[i]);
769		T Test2 = max(z[i], w[i]);
770		U Result1 = x[i] > y[i] ? a[i] : b[i];
771		U Result2 = z[i] > w[i] ? c[i] : d[i];
772		Result[i] = Test1 > Test2 ? Result1 : Result2;
773	}
774	return Result;
775}
776
777// Max comparison between 4 variables
778template<typename T, typename U, precision P>
779GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
780(
781	T x, const detail::tvec2<U, P>& a,
782	T y, const detail::tvec2<U, P>& b,
783	T z, const detail::tvec2<U, P>& c,
784	T w, const detail::tvec2<U, P>& d
785)
786{
787	T Test1 = max(x, y);
788	T Test2 = max(z, w);
789
790	detail::tvec2<U, P> Result;
791	for(typename detail::tvec2<U, P>::size_type i = 0; i < Result.length(); ++i)
792	{
793		U Result1 = x > y ? a[i] : b[i];
794		U Result2 = z > w ? c[i] : d[i];
795		Result[i] = Test1 > Test2 ? Result1 : Result2;
796	}
797	return Result;
798}
799
800// Max comparison between 4 variables
801template<typename T, typename U, precision P>
802GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
803(
804	T x, const detail::tvec3<U, P>& a,
805	T y, const detail::tvec3<U, P>& b,
806	T z, const detail::tvec3<U, P>& c,
807	T w, const detail::tvec3<U, P>& d
808)
809{
810	T Test1 = max(x, y);
811	T Test2 = max(z, w);
812
813	detail::tvec3<U, P> Result;
814	for(typename detail::tvec3<U, P>::size_type i = 0; i < Result.length(); ++i)
815	{
816		U Result1 = x > y ? a[i] : b[i];
817		U Result2 = z > w ? c[i] : d[i];
818		Result[i] = Test1 > Test2 ? Result1 : Result2;
819	}
820	return Result;
821}
822
823// Max comparison between 4 variables
824template<typename T, typename U, precision P>
825GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
826(
827	T x, const detail::tvec4<U, P>& a,
828	T y, const detail::tvec4<U, P>& b,
829	T z, const detail::tvec4<U, P>& c,
830	T w, const detail::tvec4<U, P>& d
831)
832{
833	T Test1 = max(x, y);
834	T Test2 = max(z, w);
835
836	detail::tvec4<U, P> Result;
837	for(typename detail::tvec4<U, P>::size_type i = 0; i < Result.length(); ++i)
838	{
839		U Result1 = x > y ? a[i] : b[i];
840		U Result2 = z > w ? c[i] : d[i];
841		Result[i] = Test1 > Test2 ? Result1 : Result2;
842	}
843	return Result;
844}
845
846// Max comparison between 4 variables
847template<typename T, typename U, precision P>
848GLM_FUNC_QUALIFIER detail::tvec2<U, P> associatedMax
849(
850	const detail::tvec2<T, P>& x, U a,
851	const detail::tvec2<T, P>& y, U b,
852	const detail::tvec2<T, P>& z, U c,
853	const detail::tvec2<T, P>& w, U d
854)
855{
856	detail::tvec2<U, P> Result;
857	for(typename detail::tvec2<T, P>::size_type i = 0; i < Result.length(); ++i)
858	{
859		T Test1 = max(x[i], y[i]);
860		T Test2 = max(z[i], w[i]);;
861		U Result1 = x[i] > y[i] ? a : b;
862		U Result2 = z[i] > w[i] ? c : d;
863		Result[i] = Test1 > Test2 ? Result1 : Result2;
864	}
865	return Result;
866}
867
868// Max comparison between 4 variables
869template<typename T, typename U, precision P>
870GLM_FUNC_QUALIFIER detail::tvec3<U, P> associatedMax
871(
872	const detail::tvec3<T, P>& x, U a,
873	const detail::tvec3<T, P>& y, U b,
874	const detail::tvec3<T, P>& z, U c,
875	const detail::tvec3<T, P>& w, U d
876)
877{
878	detail::tvec3<U, P> Result;
879	for(typename detail::tvec3<T, P>::size_type i = 0; i < Result.length(); ++i)
880	{
881		T Test1 = max(x[i], y[i]);
882		T Test2 = max(z[i], w[i]);;
883		U Result1 = x[i] > y[i] ? a : b;
884		U Result2 = z[i] > w[i] ? c : d;
885		Result[i] = Test1 > Test2 ? Result1 : Result2;
886	}
887	return Result;
888}
889
890// Max comparison between 4 variables
891template<typename T, typename U, precision P>
892GLM_FUNC_QUALIFIER detail::tvec4<U, P> associatedMax
893(
894	const detail::tvec4<T, P>& x, U a,
895	const detail::tvec4<T, P>& y, U b,
896	const detail::tvec4<T, P>& z, U c,
897	const detail::tvec4<T, P>& w, U d
898)
899{
900	detail::tvec4<U, P> Result;
901	for(typename detail::tvec4<T, P>::size_type i = 0; i < Result.length(); ++i)
902	{
903		T Test1 = max(x[i], y[i]);
904		T Test2 = max(z[i], w[i]);;
905		U Result1 = x[i] > y[i] ? a : b;
906		U Result2 = z[i] > w[i] ? c : d;
907		Result[i] = Test1 > Test2 ? Result1 : Result2;
908	}
909	return Result;
910}
911
912}//namespace glm
913