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