1/////////////////////////////////////////////////////////////////////////////////// 2/// OpenGL Mathematics (glm.g-truc.net) 3/// 4/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) 5/// Permission is hereby granted, free of charge, to any person obtaining a copy 6/// of this software and associated documentation files (the "Software"), to deal 7/// in the Software without restriction, including without limitation the rights 8/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9/// copies of the Software, and to permit persons to whom the Software is 10/// furnished to do so, subject to the following conditions: 11/// 12/// The above copyright notice and this permission notice shall be included in 13/// all copies or substantial portions of the Software. 14/// 15/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21/// THE SOFTWARE. 22/// 23/// @ref core 24/// @file glm/core/type_mat3x2.inl 25/// @date 2006-08-05 / 2011-06-15 26/// @author Christophe Riccio 27/////////////////////////////////////////////////////////////////////////////////// 28 29namespace glm{ 30namespace detail 31{ 32 template <typename T, precision P> 33 GLM_FUNC_QUALIFIER GLM_CONSTEXPR length_t tmat3x2<T, P>::length() const 34 { 35 return 3; 36 } 37 38 ////////////////////////////////////// 39 // Accesses 40 41 template <typename T, precision P> 42 GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type & 43 tmat3x2<T, P>::operator[] 44 ( 45 length_t i 46 ) 47 { 48 assert(i < this->length()); 49 return this->value[i]; 50 } 51 52 template <typename T, precision P> 53 GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type const & 54 tmat3x2<T, P>::operator[] 55 ( 56 length_t i 57 ) const 58 { 59 assert(i < this->length()); 60 return this->value[i]; 61 } 62 63 ////////////////////////////////////////////////////////////// 64 // Constructors 65 66 template <typename T, precision P> 67 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2() 68 { 69 this->value[0] = col_type(1, 0); 70 this->value[1] = col_type(0, 1); 71 this->value[2] = col_type(0, 0); 72 } 73 74 template <typename T, precision P> 75 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 76 ( 77 tmat3x2<T, P> const & m 78 ) 79 { 80 this->value[0] = m.value[0]; 81 this->value[1] = m.value[1]; 82 this->value[2] = m.value[2]; 83 } 84 85 template <typename T, precision P> 86 template <precision Q> 87 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2( 88 tmat3x2<T, Q> const & m) 89 { 90 this->value[0] = m.value[0]; 91 this->value[1] = m.value[1]; 92 this->value[2] = m.value[2]; 93 } 94 95 template <typename T, precision P> 96 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 97 ( 98 ctor 99 ) 100 {} 101 102 template <typename T, precision P> 103 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 104 ( 105 T const & s 106 ) 107 { 108 this->value[0] = col_type(s, 0); 109 this->value[1] = col_type(0, s); 110 this->value[2] = col_type(0, 0); 111 } 112 113 template <typename T, precision P> 114 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 115 ( 116 T const & x0, T const & y0, 117 T const & x1, T const & y1, 118 T const & x2, T const & y2 119 ) 120 { 121 this->value[0] = col_type(x0, y0); 122 this->value[1] = col_type(x1, y1); 123 this->value[2] = col_type(x2, y2); 124 } 125 126 template <typename T, precision P> 127 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 128 ( 129 col_type const & v0, 130 col_type const & v1, 131 col_type const & v2 132 ) 133 { 134 this->value[0] = v0; 135 this->value[1] = v1; 136 this->value[2] = v2; 137 } 138 139 ////////////////////////////////////// 140 // Conversion constructors 141 template <typename T, precision P> 142 template < 143 typename X1, typename Y1, 144 typename X2, typename Y2, 145 typename X3, typename Y3> 146 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 147 ( 148 X1 const & x1, Y1 const & y1, 149 X2 const & x2, Y2 const & y2, 150 X3 const & x3, Y3 const & y3 151 ) 152 { 153 this->value[0] = col_type(static_cast<T>(x1), value_type(y1)); 154 this->value[1] = col_type(static_cast<T>(x2), value_type(y2)); 155 this->value[2] = col_type(static_cast<T>(x3), value_type(y3)); 156 } 157 158 template <typename T, precision P> 159 template <typename V1, typename V2, typename V3> 160 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 161 ( 162 tvec2<V1, P> const & v1, 163 tvec2<V2, P> const & v2, 164 tvec2<V3, P> const & v3 165 ) 166 { 167 this->value[0] = col_type(v1); 168 this->value[1] = col_type(v2); 169 this->value[2] = col_type(v3); 170 } 171 172 ////////////////////////////////////////////////////////////// 173 // mat3x2 matrix conversions 174 175 template <typename T, precision P> 176 template <typename U, precision Q> 177 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 178 ( 179 tmat3x2<U, Q> const & m 180 ) 181 { 182 this->value[0] = col_type(m[0]); 183 this->value[1] = col_type(m[1]); 184 this->value[2] = col_type(m[2]); 185 } 186 187 template <typename T, precision P> 188 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 189 ( 190 tmat2x2<T, P> const & m 191 ) 192 { 193 this->value[0] = m[0]; 194 this->value[1] = m[1]; 195 this->value[2] = col_type(T(0)); 196 } 197 198 template <typename T, precision P> 199 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 200 ( 201 tmat3x3<T, P> const & m 202 ) 203 { 204 this->value[0] = col_type(m[0]); 205 this->value[1] = col_type(m[1]); 206 this->value[2] = col_type(m[2]); 207 } 208 209 template <typename T, precision P> 210 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 211 ( 212 tmat4x4<T, P> const & m 213 ) 214 { 215 this->value[0] = col_type(m[0]); 216 this->value[1] = col_type(m[1]); 217 this->value[2] = col_type(m[2]); 218 } 219 220 template <typename T, precision P> 221 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 222 ( 223 tmat2x3<T, P> const & m 224 ) 225 { 226 this->value[0] = col_type(m[0]); 227 this->value[1] = col_type(m[1]); 228 this->value[2] = col_type(T(0)); 229 } 230 231 template <typename T, precision P> 232 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 233 ( 234 tmat2x4<T, P> const & m 235 ) 236 { 237 this->value[0] = col_type(m[0]); 238 this->value[1] = col_type(m[1]); 239 this->value[2] = col_type(T(0)); 240 } 241 242 template <typename T, precision P> 243 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 244 ( 245 tmat3x4<T, P> const & m 246 ) 247 { 248 this->value[0] = col_type(m[0]); 249 this->value[1] = col_type(m[1]); 250 this->value[2] = col_type(m[2]); 251 } 252 253 template <typename T, precision P> 254 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 255 ( 256 tmat4x2<T, P> const & m 257 ) 258 { 259 this->value[0] = m[0]; 260 this->value[1] = m[1]; 261 this->value[2] = m[2]; 262 } 263 264 template <typename T, precision P> 265 GLM_FUNC_QUALIFIER tmat3x2<T, P>::tmat3x2 266 ( 267 tmat4x3<T, P> const & m 268 ) 269 { 270 this->value[0] = col_type(m[0]); 271 this->value[1] = col_type(m[1]); 272 this->value[2] = col_type(m[2]); 273 } 274 275 ////////////////////////////////////////////////////////////// 276 // Unary updatable operators 277 278 template <typename T, precision P> 279 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator= (tmat3x2<T, P> const & m) 280 { 281 this->value[0] = m[0]; 282 this->value[1] = m[1]; 283 this->value[2] = m[2]; 284 return *this; 285 } 286 287 template <typename T, precision P> 288 template <typename U> 289 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator= (tmat3x2<U, P> const & m) 290 { 291 this->value[0] = m[0]; 292 this->value[1] = m[1]; 293 this->value[2] = m[2]; 294 return *this; 295 } 296 297 template <typename T, precision P> 298 template <typename U> 299 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+= (U s) 300 { 301 this->value[0] += s; 302 this->value[1] += s; 303 this->value[2] += s; 304 return *this; 305 } 306 307 template <typename T, precision P> 308 template <typename U> 309 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator+= (tmat3x2<U, P> const & m) 310 { 311 this->value[0] += m[0]; 312 this->value[1] += m[1]; 313 this->value[2] += m[2]; 314 return *this; 315 } 316 317 template <typename T, precision P> 318 template <typename U> 319 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-= (U s) 320 { 321 this->value[0] -= s; 322 this->value[1] -= s; 323 this->value[2] -= s; 324 return *this; 325 } 326 327 template <typename T, precision P> 328 template <typename U> 329 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-= (tmat3x2<U, P> const & m) 330 { 331 this->value[0] -= m[0]; 332 this->value[1] -= m[1]; 333 this->value[2] -= m[2]; 334 return *this; 335 } 336 337 template <typename T, precision P> 338 template <typename U> 339 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator*= (U s) 340 { 341 this->value[0] *= s; 342 this->value[1] *= s; 343 this->value[2] *= s; 344 return *this; 345 } 346 347 template <typename T, precision P> 348 template <typename U> 349 GLM_FUNC_QUALIFIER tmat3x2<T, P> & tmat3x2<T, P>::operator/= (U s) 350 { 351 this->value[0] /= s; 352 this->value[1] /= s; 353 this->value[2] /= s; 354 return *this; 355 } 356 357 template <typename T, precision P> 358 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator++ () 359 { 360 ++this->value[0]; 361 ++this->value[1]; 362 ++this->value[2]; 363 return *this; 364 } 365 366 template <typename T, precision P> 367 GLM_FUNC_QUALIFIER tmat3x2<T, P>& tmat3x2<T, P>::operator-- () 368 { 369 --this->value[0]; 370 --this->value[1]; 371 --this->value[2]; 372 return *this; 373 } 374 375 template <typename T, precision P> 376 GLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator++(int) 377 { 378 tmat3x2<T, P> Result(*this); 379 ++*this; 380 return Result; 381 } 382 383 template <typename T, precision P> 384 GLM_FUNC_QUALIFIER tmat3x2<T, P> tmat3x2<T, P>::operator--(int) 385 { 386 tmat3x2<T, P> Result(*this); 387 --*this; 388 return Result; 389 } 390 391 ////////////////////////////////////////////////////////////// 392 // Binary operators 393 394 template <typename T, precision P> 395 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+ 396 ( 397 tmat3x2<T, P> const & m, 398 T const & s 399 ) 400 { 401 return tmat3x2<T, P>( 402 m[0] + s, 403 m[1] + s, 404 m[2] + s); 405 } 406 407 template <typename T, precision P> 408 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator+ 409 ( 410 tmat3x2<T, P> const & m1, 411 tmat3x2<T, P> const & m2 412 ) 413 { 414 return tmat3x2<T, P>( 415 m1[0] + m2[0], 416 m1[1] + m2[1], 417 m1[2] + m2[2]); 418 } 419 420 template <typename T, precision P> 421 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator- 422 ( 423 tmat3x2<T, P> const & m, 424 T const & s 425 ) 426 { 427 return tmat3x2<T, P>( 428 m[0] - s, 429 m[1] - s, 430 m[2] - s); 431 } 432 433 template <typename T, precision P> 434 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator- 435 ( 436 tmat3x2<T, P> const & m1, 437 tmat3x2<T, P> const & m2 438 ) 439 { 440 return tmat3x2<T, P>( 441 m1[0] - m2[0], 442 m1[1] - m2[1], 443 m1[2] - m2[2]); 444 } 445 446 template <typename T, precision P> 447 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator* 448 ( 449 tmat3x2<T, P> const & m, 450 T const & s 451 ) 452 { 453 return tmat3x2<T, P>( 454 m[0] * s, 455 m[1] * s, 456 m[2] * s); 457 } 458 459 template <typename T, precision P> 460 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator* 461 ( 462 T const & s, 463 tmat3x2<T, P> const & m 464 ) 465 { 466 return tmat3x2<T, P>( 467 m[0] * s, 468 m[1] * s, 469 m[2] * s); 470 } 471 472 template <typename T, precision P> 473 GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::col_type operator* 474 ( 475 tmat3x2<T, P> const & m, 476 typename tmat3x2<T, P>::row_type const & v) 477 { 478 return typename tmat3x2<T, P>::col_type( 479 m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, 480 m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z); 481 } 482 483 template <typename T, precision P> 484 GLM_FUNC_QUALIFIER typename tmat3x2<T, P>::row_type operator* 485 ( 486 typename tmat3x2<T, P>::col_type const & v, 487 tmat3x2<T, P> const & m) 488 { 489 return typename tmat3x2<T, P>::row_type( 490 v.x * m[0][0] + v.y * m[0][1], 491 v.x * m[1][0] + v.y * m[1][1], 492 v.x * m[2][0] + v.y * m[2][1]); 493 } 494 495 template <typename T, precision P> 496 GLM_FUNC_QUALIFIER tmat2x2<T, P> operator* 497 ( 498 tmat3x2<T, P> const & m1, 499 tmat2x3<T, P> const & m2 500 ) 501 { 502 const T SrcA00 = m1[0][0]; 503 const T SrcA01 = m1[0][1]; 504 const T SrcA10 = m1[1][0]; 505 const T SrcA11 = m1[1][1]; 506 const T SrcA20 = m1[2][0]; 507 const T SrcA21 = m1[2][1]; 508 509 const T SrcB00 = m2[0][0]; 510 const T SrcB01 = m2[0][1]; 511 const T SrcB02 = m2[0][2]; 512 const T SrcB10 = m2[1][0]; 513 const T SrcB11 = m2[1][1]; 514 const T SrcB12 = m2[1][2]; 515 516 tmat2x2<T, P> Result(tmat2x2<T, P>::_null); 517 Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; 518 Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; 519 Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; 520 Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; 521 return Result; 522 } 523 524 template <typename T, precision P> 525 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator* 526 ( 527 tmat3x2<T, P> const & m1, 528 tmat3x3<T, P> const & m2 529 ) 530 { 531 return tmat3x2<T, P>( 532 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], 533 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], 534 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], 535 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], 536 m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], 537 m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]); 538 } 539 540 template <typename T, precision P> 541 GLM_FUNC_QUALIFIER tmat4x2<T, P> operator* 542 ( 543 tmat3x2<T, P> const & m1, 544 tmat4x3<T, P> const & m2 545 ) 546 { 547 return tmat4x2<T, P>( 548 m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], 549 m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], 550 m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], 551 m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], 552 m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], 553 m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], 554 m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], 555 m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]); 556 } 557 558 template <typename T, precision P> 559 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator/ 560 ( 561 tmat3x2<T, P> const & m, 562 T const & s 563 ) 564 { 565 return tmat3x2<T, P>( 566 m[0] / s, 567 m[1] / s, 568 m[2] / s); 569 } 570 571 template <typename T, precision P> 572 GLM_FUNC_QUALIFIER tmat3x2<T, P> operator/ 573 ( 574 T const & s, 575 tmat3x2<T, P> const & m 576 ) 577 { 578 return tmat3x2<T, P>( 579 s / m[0], 580 s / m[1], 581 s / m[2]); 582 } 583 584 // Unary constant operators 585 template <typename T, precision P> 586 GLM_FUNC_QUALIFIER tmat3x2<T, P> const operator- 587 ( 588 tmat3x2<T, P> const & m 589 ) 590 { 591 return tmat3x2<T, P>( 592 -m[0], 593 -m[1], 594 -m[2]); 595 } 596 597 ////////////////////////////////////// 598 // Boolean operators 599 600 template <typename T, precision P> 601 GLM_FUNC_QUALIFIER bool operator== 602 ( 603 tmat3x2<T, P> const & m1, 604 tmat3x2<T, P> const & m2 605 ) 606 { 607 return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); 608 } 609 610 template <typename T, precision P> 611 GLM_FUNC_QUALIFIER bool operator!= 612 ( 613 tmat3x2<T, P> const & m1, 614 tmat3x2<T, P> const & m2 615 ) 616 { 617 return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); 618 } 619 620} //namespace detail 621} //namespace glm 622