1/// @ref core 2 3#include "compute_vector_relational.hpp" 4 5namespace glm 6{ 7 // -- Implicit basic constructors -- 8 9# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE 10 template<typename T, qualifier Q> 11 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec() 12# if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE 13 : x(0), y(0), z(0) 14# endif 15 {} 16 17 template<typename T, qualifier Q> 18 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, Q> const& v) 19 : x(v.x), y(v.y), z(v.z) 20 {} 21# endif 22 23 template<typename T, qualifier Q> 24 template<qualifier P> 25 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, T, P> const& v) 26 : x(v.x), y(v.y), z(v.z) 27 {} 28 29 // -- Explicit basic constructors -- 30 31 template<typename T, qualifier Q> 32 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T scalar) 33 : x(scalar), y(scalar), z(scalar) 34 {} 35 36 template <typename T, qualifier Q> 37 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(T _x, T _y, T _z) 38 : x(_x), y(_y), z(_z) 39 {} 40 41 // -- Conversion scalar constructors -- 42 43 template<typename T, qualifier Q> 44 template<typename U, qualifier P> 45 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, U, P> const& v) 46 : x(static_cast<T>(v.x)) 47 , y(static_cast<T>(v.x)) 48 , z(static_cast<T>(v.x)) 49 {} 50 51 template<typename T, qualifier Q> 52 template<typename X, typename Y, typename Z> 53 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, Z _z) 54 : x(static_cast<T>(_x)) 55 , y(static_cast<T>(_y)) 56 , z(static_cast<T>(_z)) 57 {} 58 59 template<typename T, qualifier Q> 60 template<typename X, typename Y, typename Z> 61 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, Z _z) 62 : x(static_cast<T>(_x.x)) 63 , y(static_cast<T>(_y)) 64 , z(static_cast<T>(_z)) 65 {} 66 67 template<typename T, qualifier Q> 68 template<typename X, typename Y, typename Z> 69 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, Z _z) 70 : x(static_cast<T>(_x)) 71 , y(static_cast<T>(_y.x)) 72 , z(static_cast<T>(_z)) 73 {} 74 75 template<typename T, qualifier Q> 76 template<typename X, typename Y, typename Z> 77 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, Z _z) 78 : x(static_cast<T>(_x.x)) 79 , y(static_cast<T>(_y.x)) 80 , z(static_cast<T>(_z)) 81 {} 82 83 template<typename T, qualifier Q> 84 template<typename X, typename Y, typename Z> 85 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, Y _y, vec<1, Z, Q> const& _z) 86 : x(static_cast<T>(_x)) 87 , y(static_cast<T>(_y)) 88 , z(static_cast<T>(_z.x)) 89 {} 90 91 template<typename T, qualifier Q> 92 template<typename X, typename Y, typename Z> 93 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, Y _y, vec<1, Z, Q> const& _z) 94 : x(static_cast<T>(_x.x)) 95 , y(static_cast<T>(_y)) 96 , z(static_cast<T>(_z.x)) 97 {} 98 99 template<typename T, qualifier Q> 100 template<typename X, typename Y, typename Z> 101 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(X _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) 102 : x(static_cast<T>(_x)) 103 , y(static_cast<T>(_y.x)) 104 , z(static_cast<T>(_z.x)) 105 {} 106 107 template<typename T, qualifier Q> 108 template<typename X, typename Y, typename Z> 109 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, X, Q> const& _x, vec<1, Y, Q> const& _y, vec<1, Z, Q> const& _z) 110 : x(static_cast<T>(_x.x)) 111 , y(static_cast<T>(_y.x)) 112 , z(static_cast<T>(_z.x)) 113 {} 114 115 // -- Conversion vector constructors -- 116 117 template<typename T, qualifier Q> 118 template<typename A, typename B, qualifier P> 119 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, B _z) 120 : x(static_cast<T>(_xy.x)) 121 , y(static_cast<T>(_xy.y)) 122 , z(static_cast<T>(_z)) 123 {} 124 125 template<typename T, qualifier Q> 126 template<typename A, typename B, qualifier P> 127 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<2, A, P> const& _xy, vec<1, B, P> const& _z) 128 : x(static_cast<T>(_xy.x)) 129 , y(static_cast<T>(_xy.y)) 130 , z(static_cast<T>(_z.x)) 131 {} 132 133 template<typename T, qualifier Q> 134 template<typename A, typename B, qualifier P> 135 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(A _x, vec<2, B, P> const& _yz) 136 : x(static_cast<T>(_x)) 137 , y(static_cast<T>(_yz.x)) 138 , z(static_cast<T>(_yz.y)) 139 {} 140 141 template<typename T, qualifier Q> 142 template<typename A, typename B, qualifier P> 143 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<1, A, P> const& _x, vec<2, B, P> const& _yz) 144 : x(static_cast<T>(_x.x)) 145 , y(static_cast<T>(_yz.x)) 146 , z(static_cast<T>(_yz.y)) 147 {} 148 149 template<typename T, qualifier Q> 150 template<typename U, qualifier P> 151 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<3, U, P> const& v) 152 : x(static_cast<T>(v.x)) 153 , y(static_cast<T>(v.y)) 154 , z(static_cast<T>(v.z)) 155 {} 156 157 template<typename T, qualifier Q> 158 template<typename U, qualifier P> 159 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>::vec(vec<4, U, P> const& v) 160 : x(static_cast<T>(v.x)) 161 , y(static_cast<T>(v.y)) 162 , z(static_cast<T>(v.z)) 163 {} 164 165 // -- Component accesses -- 166 167 template<typename T, qualifier Q> 168 GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) 169 { 170 assert(i >= 0 && i < this->length()); 171 switch(i) 172 { 173 default: 174 case 0: 175 return x; 176 case 1: 177 return y; 178 case 2: 179 return z; 180 } 181 } 182 183 template<typename T, qualifier Q> 184 GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<3, T, Q>::operator[](typename vec<3, T, Q>::length_type i) const 185 { 186 assert(i >= 0 && i < this->length()); 187 switch(i) 188 { 189 default: 190 case 0: 191 return x; 192 case 1: 193 return y; 194 case 2: 195 return z; 196 } 197 } 198 199 // -- Unary arithmetic operators -- 200 201# if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE 202 template<typename T, qualifier Q> 203 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, T, Q> const& v) 204 { 205 this->x = v.x; 206 this->y = v.y; 207 this->z = v.z; 208 return *this; 209 } 210# endif 211 212 template<typename T, qualifier Q> 213 template<typename U> 214 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q>& vec<3, T, Q>::operator=(vec<3, U, Q> const& v) 215 { 216 this->x = static_cast<T>(v.x); 217 this->y = static_cast<T>(v.y); 218 this->z = static_cast<T>(v.z); 219 return *this; 220 } 221 222 template<typename T, qualifier Q> 223 template<typename U> 224 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(U scalar) 225 { 226 this->x += static_cast<T>(scalar); 227 this->y += static_cast<T>(scalar); 228 this->z += static_cast<T>(scalar); 229 return *this; 230 } 231 232 template<typename T, qualifier Q> 233 template<typename U> 234 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<1, U, Q> const& v) 235 { 236 this->x += static_cast<T>(v.x); 237 this->y += static_cast<T>(v.x); 238 this->z += static_cast<T>(v.x); 239 return *this; 240 } 241 242 template<typename T, qualifier Q> 243 template<typename U> 244 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator+=(vec<3, U, Q> const& v) 245 { 246 this->x += static_cast<T>(v.x); 247 this->y += static_cast<T>(v.y); 248 this->z += static_cast<T>(v.z); 249 return *this; 250 } 251 252 template<typename T, qualifier Q> 253 template<typename U> 254 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(U scalar) 255 { 256 this->x -= static_cast<T>(scalar); 257 this->y -= static_cast<T>(scalar); 258 this->z -= static_cast<T>(scalar); 259 return *this; 260 } 261 262 template<typename T, qualifier Q> 263 template<typename U> 264 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<1, U, Q> const& v) 265 { 266 this->x -= static_cast<T>(v.x); 267 this->y -= static_cast<T>(v.x); 268 this->z -= static_cast<T>(v.x); 269 return *this; 270 } 271 272 template<typename T, qualifier Q> 273 template<typename U> 274 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator-=(vec<3, U, Q> const& v) 275 { 276 this->x -= static_cast<T>(v.x); 277 this->y -= static_cast<T>(v.y); 278 this->z -= static_cast<T>(v.z); 279 return *this; 280 } 281 282 template<typename T, qualifier Q> 283 template<typename U> 284 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(U scalar) 285 { 286 this->x *= static_cast<T>(scalar); 287 this->y *= static_cast<T>(scalar); 288 this->z *= static_cast<T>(scalar); 289 return *this; 290 } 291 292 template<typename T, qualifier Q> 293 template<typename U> 294 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<1, U, Q> const& v) 295 { 296 this->x *= static_cast<T>(v.x); 297 this->y *= static_cast<T>(v.x); 298 this->z *= static_cast<T>(v.x); 299 return *this; 300 } 301 302 template<typename T, qualifier Q> 303 template<typename U> 304 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator*=(vec<3, U, Q> const& v) 305 { 306 this->x *= static_cast<T>(v.x); 307 this->y *= static_cast<T>(v.y); 308 this->z *= static_cast<T>(v.z); 309 return *this; 310 } 311 312 template<typename T, qualifier Q> 313 template<typename U> 314 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(U v) 315 { 316 this->x /= static_cast<T>(v); 317 this->y /= static_cast<T>(v); 318 this->z /= static_cast<T>(v); 319 return *this; 320 } 321 322 template<typename T, qualifier Q> 323 template<typename U> 324 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<1, U, Q> const& v) 325 { 326 this->x /= static_cast<T>(v.x); 327 this->y /= static_cast<T>(v.x); 328 this->z /= static_cast<T>(v.x); 329 return *this; 330 } 331 332 template<typename T, qualifier Q> 333 template<typename U> 334 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator/=(vec<3, U, Q> const& v) 335 { 336 this->x /= static_cast<T>(v.x); 337 this->y /= static_cast<T>(v.y); 338 this->z /= static_cast<T>(v.z); 339 return *this; 340 } 341 342 // -- Increment and decrement operators -- 343 344 template<typename T, qualifier Q> 345 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator++() 346 { 347 ++this->x; 348 ++this->y; 349 ++this->z; 350 return *this; 351 } 352 353 template<typename T, qualifier Q> 354 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator--() 355 { 356 --this->x; 357 --this->y; 358 --this->z; 359 return *this; 360 } 361 362 template<typename T, qualifier Q> 363 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator++(int) 364 { 365 vec<3, T, Q> Result(*this); 366 ++*this; 367 return Result; 368 } 369 370 template<typename T, qualifier Q> 371 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> vec<3, T, Q>::operator--(int) 372 { 373 vec<3, T, Q> Result(*this); 374 --*this; 375 return Result; 376 } 377 378 // -- Unary bit operators -- 379 380 template<typename T, qualifier Q> 381 template<typename U> 382 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(U scalar) 383 { 384 this->x %= scalar; 385 this->y %= scalar; 386 this->z %= scalar; 387 return *this; 388 } 389 390 template<typename T, qualifier Q> 391 template<typename U> 392 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<1, U, Q> const& v) 393 { 394 this->x %= v.x; 395 this->y %= v.x; 396 this->z %= v.x; 397 return *this; 398 } 399 400 template<typename T, qualifier Q> 401 template<typename U> 402 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator%=(vec<3, U, Q> const& v) 403 { 404 this->x %= v.x; 405 this->y %= v.y; 406 this->z %= v.z; 407 return *this; 408 } 409 410 template<typename T, qualifier Q> 411 template<typename U> 412 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(U scalar) 413 { 414 this->x &= scalar; 415 this->y &= scalar; 416 this->z &= scalar; 417 return *this; 418 } 419 420 template<typename T, qualifier Q> 421 template<typename U> 422 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<1, U, Q> const& v) 423 { 424 this->x &= v.x; 425 this->y &= v.x; 426 this->z &= v.x; 427 return *this; 428 } 429 430 template<typename T, qualifier Q> 431 template<typename U> 432 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator&=(vec<3, U, Q> const& v) 433 { 434 this->x &= v.x; 435 this->y &= v.y; 436 this->z &= v.z; 437 return *this; 438 } 439 440 template<typename T, qualifier Q> 441 template<typename U> 442 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(U scalar) 443 { 444 this->x |= scalar; 445 this->y |= scalar; 446 this->z |= scalar; 447 return *this; 448 } 449 450 template<typename T, qualifier Q> 451 template<typename U> 452 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<1, U, Q> const& v) 453 { 454 this->x |= v.x; 455 this->y |= v.x; 456 this->z |= v.x; 457 return *this; 458 } 459 460 template<typename T, qualifier Q> 461 template<typename U> 462 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator|=(vec<3, U, Q> const& v) 463 { 464 this->x |= v.x; 465 this->y |= v.y; 466 this->z |= v.z; 467 return *this; 468 } 469 470 template<typename T, qualifier Q> 471 template<typename U> 472 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(U scalar) 473 { 474 this->x ^= scalar; 475 this->y ^= scalar; 476 this->z ^= scalar; 477 return *this; 478 } 479 480 template<typename T, qualifier Q> 481 template<typename U> 482 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<1, U, Q> const& v) 483 { 484 this->x ^= v.x; 485 this->y ^= v.x; 486 this->z ^= v.x; 487 return *this; 488 } 489 490 template<typename T, qualifier Q> 491 template<typename U> 492 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator^=(vec<3, U, Q> const& v) 493 { 494 this->x ^= v.x; 495 this->y ^= v.y; 496 this->z ^= v.z; 497 return *this; 498 } 499 500 template<typename T, qualifier Q> 501 template<typename U> 502 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(U scalar) 503 { 504 this->x <<= scalar; 505 this->y <<= scalar; 506 this->z <<= scalar; 507 return *this; 508 } 509 510 template<typename T, qualifier Q> 511 template<typename U> 512 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<1, U, Q> const& v) 513 { 514 this->x <<= static_cast<T>(v.x); 515 this->y <<= static_cast<T>(v.x); 516 this->z <<= static_cast<T>(v.x); 517 return *this; 518 } 519 520 template<typename T, qualifier Q> 521 template<typename U> 522 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator<<=(vec<3, U, Q> const& v) 523 { 524 this->x <<= static_cast<T>(v.x); 525 this->y <<= static_cast<T>(v.y); 526 this->z <<= static_cast<T>(v.z); 527 return *this; 528 } 529 530 template<typename T, qualifier Q> 531 template<typename U> 532 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(U scalar) 533 { 534 this->x >>= static_cast<T>(scalar); 535 this->y >>= static_cast<T>(scalar); 536 this->z >>= static_cast<T>(scalar); 537 return *this; 538 } 539 540 template<typename T, qualifier Q> 541 template<typename U> 542 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<1, U, Q> const& v) 543 { 544 this->x >>= static_cast<T>(v.x); 545 this->y >>= static_cast<T>(v.x); 546 this->z >>= static_cast<T>(v.x); 547 return *this; 548 } 549 550 template<typename T, qualifier Q> 551 template<typename U> 552 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> & vec<3, T, Q>::operator>>=(vec<3, U, Q> const& v) 553 { 554 this->x >>= static_cast<T>(v.x); 555 this->y >>= static_cast<T>(v.y); 556 this->z >>= static_cast<T>(v.z); 557 return *this; 558 } 559 560 // -- Unary arithmetic operators -- 561 562 template<typename T, qualifier Q> 563 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v) 564 { 565 return v; 566 } 567 568 template<typename T, qualifier Q> 569 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v) 570 { 571 return vec<3, T, Q>( 572 -v.x, 573 -v.y, 574 -v.z); 575 } 576 577 // -- Binary arithmetic operators -- 578 579 template<typename T, qualifier Q> 580 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, T scalar) 581 { 582 return vec<3, T, Q>( 583 v.x + scalar, 584 v.y + scalar, 585 v.z + scalar); 586 } 587 588 template<typename T, qualifier Q> 589 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 590 { 591 return vec<3, T, Q>( 592 v.x + scalar.x, 593 v.y + scalar.x, 594 v.z + scalar.x); 595 } 596 597 template<typename T, qualifier Q> 598 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(T scalar, vec<3, T, Q> const& v) 599 { 600 return vec<3, T, Q>( 601 scalar + v.x, 602 scalar + v.y, 603 scalar + v.z); 604 } 605 606 template<typename T, qualifier Q> 607 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 608 { 609 return vec<3, T, Q>( 610 scalar.x + v.x, 611 scalar.x + v.y, 612 scalar.x + v.z); 613 } 614 615 template<typename T, qualifier Q> 616 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator+(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 617 { 618 return vec<3, T, Q>( 619 v1.x + v2.x, 620 v1.y + v2.y, 621 v1.z + v2.z); 622 } 623 624 template<typename T, qualifier Q> 625 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, T scalar) 626 { 627 return vec<3, T, Q>( 628 v.x - scalar, 629 v.y - scalar, 630 v.z - scalar); 631 } 632 633 template<typename T, qualifier Q> 634 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 635 { 636 return vec<3, T, Q>( 637 v.x - scalar.x, 638 v.y - scalar.x, 639 v.z - scalar.x); 640 } 641 642 template<typename T, qualifier Q> 643 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(T scalar, vec<3, T, Q> const& v) 644 { 645 return vec<3, T, Q>( 646 scalar - v.x, 647 scalar - v.y, 648 scalar - v.z); 649 } 650 651 template<typename T, qualifier Q> 652 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 653 { 654 return vec<3, T, Q>( 655 scalar.x - v.x, 656 scalar.x - v.y, 657 scalar.x - v.z); 658 } 659 660 template<typename T, qualifier Q> 661 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator-(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 662 { 663 return vec<3, T, Q>( 664 v1.x - v2.x, 665 v1.y - v2.y, 666 v1.z - v2.z); 667 } 668 669 template<typename T, qualifier Q> 670 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, T scalar) 671 { 672 return vec<3, T, Q>( 673 v.x * scalar, 674 v.y * scalar, 675 v.z * scalar); 676 } 677 678 template<typename T, qualifier Q> 679 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 680 { 681 return vec<3, T, Q>( 682 v.x * scalar.x, 683 v.y * scalar.x, 684 v.z * scalar.x); 685 } 686 687 template<typename T, qualifier Q> 688 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(T scalar, vec<3, T, Q> const& v) 689 { 690 return vec<3, T, Q>( 691 scalar * v.x, 692 scalar * v.y, 693 scalar * v.z); 694 } 695 696 template<typename T, qualifier Q> 697 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 698 { 699 return vec<3, T, Q>( 700 scalar.x * v.x, 701 scalar.x * v.y, 702 scalar.x * v.z); 703 } 704 705 template<typename T, qualifier Q> 706 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator*(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 707 { 708 return vec<3, T, Q>( 709 v1.x * v2.x, 710 v1.y * v2.y, 711 v1.z * v2.z); 712 } 713 714 template<typename T, qualifier Q> 715 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, T scalar) 716 { 717 return vec<3, T, Q>( 718 v.x / scalar, 719 v.y / scalar, 720 v.z / scalar); 721 } 722 723 template<typename T, qualifier Q> 724 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 725 { 726 return vec<3, T, Q>( 727 v.x / scalar.x, 728 v.y / scalar.x, 729 v.z / scalar.x); 730 } 731 732 template<typename T, qualifier Q> 733 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(T scalar, vec<3, T, Q> const& v) 734 { 735 return vec<3, T, Q>( 736 scalar / v.x, 737 scalar / v.y, 738 scalar / v.z); 739 } 740 741 template<typename T, qualifier Q> 742 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 743 { 744 return vec<3, T, Q>( 745 scalar.x / v.x, 746 scalar.x / v.y, 747 scalar.x / v.z); 748 } 749 750 template<typename T, qualifier Q> 751 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator/(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 752 { 753 return vec<3, T, Q>( 754 v1.x / v2.x, 755 v1.y / v2.y, 756 v1.z / v2.z); 757 } 758 759 // -- Binary bit operators -- 760 761 template<typename T, qualifier Q> 762 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, T scalar) 763 { 764 return vec<3, T, Q>( 765 v.x % scalar, 766 v.y % scalar, 767 v.z % scalar); 768 } 769 770 template<typename T, qualifier Q> 771 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 772 { 773 return vec<3, T, Q>( 774 v.x % scalar.x, 775 v.y % scalar.x, 776 v.z % scalar.x); 777 } 778 779 template<typename T, qualifier Q> 780 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(T scalar, vec<3, T, Q> const& v) 781 { 782 return vec<3, T, Q>( 783 scalar % v.x, 784 scalar % v.y, 785 scalar % v.z); 786 } 787 788 template<typename T, qualifier Q> 789 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 790 { 791 return vec<3, T, Q>( 792 scalar.x % v.x, 793 scalar.x % v.y, 794 scalar.x % v.z); 795 } 796 797 template<typename T, qualifier Q> 798 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator%(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 799 { 800 return vec<3, T, Q>( 801 v1.x % v2.x, 802 v1.y % v2.y, 803 v1.z % v2.z); 804 } 805 806 template<typename T, qualifier Q> 807 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, T scalar) 808 { 809 return vec<3, T, Q>( 810 v.x & scalar, 811 v.y & scalar, 812 v.z & scalar); 813 } 814 815 template<typename T, qualifier Q> 816 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 817 { 818 return vec<3, T, Q>( 819 v.x & scalar.x, 820 v.y & scalar.x, 821 v.z & scalar.x); 822 } 823 824 template<typename T, qualifier Q> 825 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(T scalar, vec<3, T, Q> const& v) 826 { 827 return vec<3, T, Q>( 828 scalar & v.x, 829 scalar & v.y, 830 scalar & v.z); 831 } 832 833 template<typename T, qualifier Q> 834 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 835 { 836 return vec<3, T, Q>( 837 scalar.x & v.x, 838 scalar.x & v.y, 839 scalar.x & v.z); 840 } 841 842 template<typename T, qualifier Q> 843 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator&(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 844 { 845 return vec<3, T, Q>( 846 v1.x & v2.x, 847 v1.y & v2.y, 848 v1.z & v2.z); 849 } 850 851 template<typename T, qualifier Q> 852 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, T scalar) 853 { 854 return vec<3, T, Q>( 855 v.x | scalar, 856 v.y | scalar, 857 v.z | scalar); 858 } 859 860 template<typename T, qualifier Q> 861 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 862 { 863 return vec<3, T, Q>( 864 v.x | scalar.x, 865 v.y | scalar.x, 866 v.z | scalar.x); 867 } 868 869 template<typename T, qualifier Q> 870 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(T scalar, vec<3, T, Q> const& v) 871 { 872 return vec<3, T, Q>( 873 scalar | v.x, 874 scalar | v.y, 875 scalar | v.z); 876 } 877 878 template<typename T, qualifier Q> 879 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 880 { 881 return vec<3, T, Q>( 882 scalar.x | v.x, 883 scalar.x | v.y, 884 scalar.x | v.z); 885 } 886 887 template<typename T, qualifier Q> 888 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator|(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 889 { 890 return vec<3, T, Q>( 891 v1.x | v2.x, 892 v1.y | v2.y, 893 v1.z | v2.z); 894 } 895 896 template<typename T, qualifier Q> 897 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, T scalar) 898 { 899 return vec<3, T, Q>( 900 v.x ^ scalar, 901 v.y ^ scalar, 902 v.z ^ scalar); 903 } 904 905 template<typename T, qualifier Q> 906 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 907 { 908 return vec<3, T, Q>( 909 v.x ^ scalar.x, 910 v.y ^ scalar.x, 911 v.z ^ scalar.x); 912 } 913 914 template<typename T, qualifier Q> 915 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(T scalar, vec<3, T, Q> const& v) 916 { 917 return vec<3, T, Q>( 918 scalar ^ v.x, 919 scalar ^ v.y, 920 scalar ^ v.z); 921 } 922 923 template<typename T, qualifier Q> 924 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 925 { 926 return vec<3, T, Q>( 927 scalar.x ^ v.x, 928 scalar.x ^ v.y, 929 scalar.x ^ v.z); 930 } 931 932 template<typename T, qualifier Q> 933 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator^(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 934 { 935 return vec<3, T, Q>( 936 v1.x ^ v2.x, 937 v1.y ^ v2.y, 938 v1.z ^ v2.z); 939 } 940 941 template<typename T, qualifier Q> 942 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, T scalar) 943 { 944 return vec<3, T, Q>( 945 v.x << scalar, 946 v.y << scalar, 947 v.z << scalar); 948 } 949 950 template<typename T, qualifier Q> 951 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 952 { 953 return vec<3, T, Q>( 954 v.x << scalar.x, 955 v.y << scalar.x, 956 v.z << scalar.x); 957 } 958 959 template<typename T, qualifier Q> 960 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(T scalar, vec<3, T, Q> const& v) 961 { 962 return vec<3, T, Q>( 963 scalar << v.x, 964 scalar << v.y, 965 scalar << v.z); 966 } 967 968 template<typename T, qualifier Q> 969 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 970 { 971 return vec<3, T, Q>( 972 scalar.x << v.x, 973 scalar.x << v.y, 974 scalar.x << v.z); 975 } 976 977 template<typename T, qualifier Q> 978 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator<<(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 979 { 980 return vec<3, T, Q>( 981 v1.x << v2.x, 982 v1.y << v2.y, 983 v1.z << v2.z); 984 } 985 986 template<typename T, qualifier Q> 987 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, T scalar) 988 { 989 return vec<3, T, Q>( 990 v.x >> scalar, 991 v.y >> scalar, 992 v.z >> scalar); 993 } 994 995 template<typename T, qualifier Q> 996 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v, vec<1, T, Q> const& scalar) 997 { 998 return vec<3, T, Q>( 999 v.x >> scalar.x, 1000 v.y >> scalar.x, 1001 v.z >> scalar.x); 1002 } 1003 1004 template<typename T, qualifier Q> 1005 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(T scalar, vec<3, T, Q> const& v) 1006 { 1007 return vec<3, T, Q>( 1008 scalar >> v.x, 1009 scalar >> v.y, 1010 scalar >> v.z); 1011 } 1012 1013 template<typename T, qualifier Q> 1014 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<1, T, Q> const& scalar, vec<3, T, Q> const& v) 1015 { 1016 return vec<3, T, Q>( 1017 scalar.x >> v.x, 1018 scalar.x >> v.y, 1019 scalar.x >> v.z); 1020 } 1021 1022 template<typename T, qualifier Q> 1023 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator>>(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 1024 { 1025 return vec<3, T, Q>( 1026 v1.x >> v2.x, 1027 v1.y >> v2.y, 1028 v1.z >> v2.z); 1029 } 1030 1031 template<typename T, qualifier Q> 1032 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, T, Q> operator~(vec<3, T, Q> const& v) 1033 { 1034 return vec<3, T, Q>( 1035 ~v.x, 1036 ~v.y, 1037 ~v.z); 1038 } 1039 1040 // -- Boolean operators -- 1041 1042 template<typename T, qualifier Q> 1043 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 1044 { 1045 return 1046 detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x) && 1047 detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.y, v2.y) && 1048 detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.z, v2.z); 1049 } 1050 1051 template<typename T, qualifier Q> 1052 GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<3, T, Q> const& v1, vec<3, T, Q> const& v2) 1053 { 1054 return !(v1 == v2); 1055 } 1056 1057 template<qualifier Q> 1058 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator&&(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) 1059 { 1060 return vec<3, bool, Q>(v1.x && v2.x, v1.y && v2.y, v1.z && v2.z); 1061 } 1062 1063 template<qualifier Q> 1064 GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<3, bool, Q> operator||(vec<3, bool, Q> const& v1, vec<3, bool, Q> const& v2) 1065 { 1066 return vec<3, bool, Q>(v1.x || v2.x, v1.y || v2.y, v1.z || v2.z); 1067 } 1068}//namespace glm 1069