Home | History | Annotate | Download | only in gtx
      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 
     10 namespace glm{
     11 
     12 // Min comparison between 2 variables
     13 template<typename T, typename U, precision P>
     14 GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b)
     15 {
     16 	return x < y ? a : b;
     17 }
     18 
     19 template<typename T, typename U, precision P>
     20 GLM_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 
     34 template<typename T, typename U, precision P>
     35 GLM_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 
     47 template<typename T, typename U, precision P>
     48 GLM_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 
     60 template<typename T, typename U, precision P>
     61 GLM_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 
     73 template<typename T, typename U, precision P>
     74 GLM_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 
     86 template<typename T, typename U, precision P>
     87 GLM_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 
     99 template<typename T, typename U, precision P>
    100 GLM_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 
    112 template<typename T, typename U, precision P>
    113 GLM_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 
    125 template<typename T, typename U, precision P>
    126 GLM_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
    139 template<typename T, typename U>
    140 GLM_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 
    151 template<typename T, typename U, precision P>
    152 GLM_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 
    165 template<typename T, typename U, precision P>
    166 GLM_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 
    179 template<typename T, typename U, precision P>
    180 GLM_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
    194 template<typename T, typename U>
    195 GLM_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
    212 template<typename T, typename U, precision P>
    213 GLM_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
    234 template<typename T, typename U, precision P>
    235 GLM_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
    256 template<typename T, typename U, precision P>
    257 GLM_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
    278 template<typename T, typename U, precision P>
    279 GLM_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
    301 template<typename T, typename U, precision P>
    302 GLM_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
    324 template<typename T, typename U, precision P>
    325 GLM_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
    347 template<typename T, typename U, precision P>
    348 GLM_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
    369 template<typename T, typename U, precision P>
    370 GLM_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
    391 template<typename T, typename U, precision P>
    392 GLM_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
    413 template<typename T, typename U>
    414 GLM_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
    420 template<typename T, typename U, precision P>
    421 GLM_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
    434 template<typename T, typename U, precision P>
    435 GLM_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
    448 template<typename T, typename U, precision P>
    449 GLM_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
    462 template<typename T, typename U, precision P>
    463 GLM_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
    476 template<typename T, typename U, precision P>
    477 GLM_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
    490 template<typename T, typename U, precision P>
    491 GLM_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
    504 template<typename T, typename U, precision P>
    505 GLM_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
    518 template<typename T, typename U, precision P>
    519 GLM_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
    532 template<typename T, typename U, precision P>
    533 GLM_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
    546 template<typename T, typename U>
    547 GLM_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
    559 template<typename T, typename U, precision P>
    560 GLM_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
    574 template<typename T, typename U, precision P>
    575 GLM_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
    589 template<typename T, typename U, precision P>
    590 GLM_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
    604 template<typename T, typename U, precision P>
    605 GLM_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
    619 template<typename T, typename U, precision P>
    620 GLM_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
    634 template<typename T, typename U, precision P>
    635 GLM_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
    649 template<typename T, typename U, precision P>
    650 GLM_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
    664 template<typename T, typename U, precision P>
    665 GLM_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
    679 template<typename T, typename U, precision P>
    680 GLM_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
    694 template<typename T, typename U>
    695 GLM_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
    712 template<typename T, typename U, precision P>
    713 GLM_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
    734 template<typename T, typename U, precision P>
    735 GLM_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
    756 template<typename T, typename U, precision P>
    757 GLM_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
    778 template<typename T, typename U, precision P>
    779 GLM_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
    801 template<typename T, typename U, precision P>
    802 GLM_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
    824 template<typename T, typename U, precision P>
    825 GLM_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
    847 template<typename T, typename U, precision P>
    848 GLM_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
    869 template<typename T, typename U, precision P>
    870 GLM_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
    891 template<typename T, typename U, precision P>
    892 GLM_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