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