73 public:
constexpr Matrix4(T _v00, T _v01, T _v02, T _v03,
74 T _v10, T _v11, T _v12, T _v13,
75 T _v20, T _v21, T _v22, T _v23,
76 T _v30, T _v31, T _v32, T _v33)
77 : data{{_v00, _v01, _v02, _v03},
78 {_v10, _v11, _v12, _v13},
79 {_v20, _v21, _v22, _v23},
80 {_v30, _v31, _v32, _v33}}
402 T v0, v1, v2, v3, v4, v5, t00, t10, t20, t30;
404 v0 = this->data[2][0]*this->data[3][1]
405 - this->data[2][1]*this->data[3][0];
406 v1 = this->data[2][0]*this->data[3][2]
407 - this->data[2][2]*this->data[3][0];
408 v2 = this->data[2][0]*this->data[3][3]
409 - this->data[2][3]*this->data[3][0];
410 v3 = this->data[2][1]*this->data[3][2]
411 - this->data[2][2]*this->data[3][1];
412 v4 = this->data[2][1]*this->data[3][3]
413 - this->data[2][3]*this->data[3][1];
414 v5 = this->data[2][2]*this->data[3][3]
415 - this->data[2][3]*this->data[3][2];
417 t00 = v5*this->data[1][1] - v4*this->data[1][2] + v3*this->data[1][3];
418 t10 = -v5*this->data[1][0] + v2*this->data[1][2] - v1*this->data[1][3];
419 t20 = v4*this->data[1][0] - v2*this->data[1][1] + v0*this->data[1][3];
420 t30 = -v3*this->data[1][0] + v1*this->data[1][1] - v0*this->data[1][2];
422 return t00 * this->data[0][0]
423 + t10 * this->data[0][1]
424 + t20 * this->data[0][2]
425 + t30 * this->data[0][3];
433 T v0, v1, v2, v3, v4, v5, t00, t10, t20, t30;
436 v0 = this->data[2][0]*this->data[3][1] -
437 this->data[2][1]*this->data[3][0];
438 v1 = this->data[2][0]*this->data[3][2] -
439 this->data[2][2]*this->data[3][0];
440 v2 = this->data[2][0]*this->data[3][3] -
441 this->data[2][3]*this->data[3][0];
442 v3 = this->data[2][1]*this->data[3][2] -
443 this->data[2][2]*this->data[3][1];
444 v4 = this->data[2][1]*this->data[3][3] -
445 this->data[2][3]*this->data[3][1];
446 v5 = this->data[2][2]*this->data[3][3] -
447 this->data[2][3]*this->data[3][2];
449 t00 = +(v5*this->data[1][1] -
450 v4*this->data[1][2] + v3*this->data[1][3]);
451 t10 = -(v5*this->data[1][0] -
452 v2*this->data[1][2] + v1*this->data[1][3]);
453 t20 = +(v4*this->data[1][0] -
454 v2*this->data[1][1] + v0*this->data[1][3]);
455 t30 = -(v3*this->data[1][0] -
456 v1*this->data[1][1] + v0*this->data[1][2]);
458 T invDet = 1 / (t00 * this->data[0][0] + t10 * this->data[0][1] +
459 t20 * this->data[0][2] + t30 * this->data[0][3]);
461 r(0, 0) = t00 * invDet;
462 r(1, 0) = t10 * invDet;
463 r(2, 0) = t20 * invDet;
464 r(3, 0) = t30 * invDet;
466 r(0, 1) = -(v5*this->data[0][1] -
467 v4*this->data[0][2] + v3*this->data[0][3]) * invDet;
468 r(1, 1) = +(v5*this->data[0][0] -
469 v2*this->data[0][2] + v1*this->data[0][3]) * invDet;
470 r(2, 1) = -(v4*this->data[0][0] -
471 v2*this->data[0][1] + v0*this->data[0][3]) * invDet;
472 r(3, 1) = +(v3*this->data[0][0] -
473 v1*this->data[0][1] + v0*this->data[0][2]) * invDet;
475 v0 = this->data[1][0]*this->data[3][1] -
476 this->data[1][1]*this->data[3][0];
477 v1 = this->data[1][0]*this->data[3][2] -
478 this->data[1][2]*this->data[3][0];
479 v2 = this->data[1][0]*this->data[3][3] -
480 this->data[1][3]*this->data[3][0];
481 v3 = this->data[1][1]*this->data[3][2] -
482 this->data[1][2]*this->data[3][1];
483 v4 = this->data[1][1]*this->data[3][3] -
484 this->data[1][3]*this->data[3][1];
485 v5 = this->data[1][2]*this->data[3][3] -
486 this->data[1][3]*this->data[3][2];
488 r(0, 2) = +(v5*this->data[0][1] -
489 v4*this->data[0][2] + v3*this->data[0][3]) * invDet;
490 r(1, 2) = -(v5*this->data[0][0] -
491 v2*this->data[0][2] + v1*this->data[0][3]) * invDet;
492 r(2, 2) = +(v4*this->data[0][0] -
493 v2*this->data[0][1] + v0*this->data[0][3]) * invDet;
494 r(3, 2) = -(v3*this->data[0][0] -
495 v1*this->data[0][1] + v0*this->data[0][2]) * invDet;
497 v0 = this->data[2][1]*this->data[1][0] -
498 this->data[2][0]*this->data[1][1];
499 v1 = this->data[2][2]*this->data[1][0] -
500 this->data[2][0]*this->data[1][2];
501 v2 = this->data[2][3]*this->data[1][0] -
502 this->data[2][0]*this->data[1][3];
503 v3 = this->data[2][2]*this->data[1][1] -
504 this->data[2][1]*this->data[1][2];
505 v4 = this->data[2][3]*this->data[1][1] -
506 this->data[2][1]*this->data[1][3];
507 v5 = this->data[2][3]*this->data[1][2] -
508 this->data[2][2]*this->data[1][3];
510 r(0, 3) = -(v5*this->data[0][1] -
511 v4*this->data[0][2] + v3*this->data[0][3]) * invDet;
512 r(1, 3) = +(v5*this->data[0][0] -
513 v2*this->data[0][2] + v1*this->data[0][3]) * invDet;
514 r(2, 3) = -(v4*this->data[0][0] -
515 v2*this->data[0][1] + v0*this->data[0][3]) * invDet;
516 r(3, 3) = +(v3*this->data[0][0] -
517 v1*this->data[0][1] + v0*this->data[0][2]) * invDet;
585 this->data[0][0] * _m2(0, 0) +
586 this->data[0][1] * _m2(1, 0) +
587 this->data[0][2] * _m2(2, 0) +
588 this->data[0][3] * _m2(3, 0),
590 this->data[0][0] * _m2(0, 1) +
591 this->data[0][1] * _m2(1, 1) +
592 this->data[0][2] * _m2(2, 1) +
593 this->data[0][3] * _m2(3, 1),
595 this->data[0][0] * _m2(0, 2) +
596 this->data[0][1] * _m2(1, 2) +
597 this->data[0][2] * _m2(2, 2) +
598 this->data[0][3] * _m2(3, 2),
600 this->data[0][0] * _m2(0, 3) +
601 this->data[0][1] * _m2(1, 3) +
602 this->data[0][2] * _m2(2, 3) +
603 this->data[0][3] * _m2(3, 3),
605 this->data[1][0] * _m2(0, 0) +
606 this->data[1][1] * _m2(1, 0) +
607 this->data[1][2] * _m2(2, 0) +
608 this->data[1][3] * _m2(3, 0),
610 this->data[1][0] * _m2(0, 1) +
611 this->data[1][1] * _m2(1, 1) +
612 this->data[1][2] * _m2(2, 1) +
613 this->data[1][3] * _m2(3, 1),
615 this->data[1][0] * _m2(0, 2) +
616 this->data[1][1] * _m2(1, 2) +
617 this->data[1][2] * _m2(2, 2) +
618 this->data[1][3] * _m2(3, 2),
620 this->data[1][0] * _m2(0, 3) +
621 this->data[1][1] * _m2(1, 3) +
622 this->data[1][2] * _m2(2, 3) +
623 this->data[1][3] * _m2(3, 3),
625 this->data[2][0] * _m2(0, 0) +
626 this->data[2][1] * _m2(1, 0) +
627 this->data[2][2] * _m2(2, 0) +
628 this->data[2][3] * _m2(3, 0),
630 this->data[2][0] * _m2(0, 1) +
631 this->data[2][1] * _m2(1, 1) +
632 this->data[2][2] * _m2(2, 1) +
633 this->data[2][3] * _m2(3, 1),
635 this->data[2][0] * _m2(0, 2) +
636 this->data[2][1] * _m2(1, 2) +
637 this->data[2][2] * _m2(2, 2) +
638 this->data[2][3] * _m2(3, 2),
640 this->data[2][0] * _m2(0, 3) +
641 this->data[2][1] * _m2(1, 3) +
642 this->data[2][2] * _m2(2, 3) +
643 this->data[2][3] * _m2(3, 3),
645 this->data[3][0] * _m2(0, 0) +
646 this->data[3][1] * _m2(1, 0) +
647 this->data[3][2] * _m2(2, 0) +
648 this->data[3][3] * _m2(3, 0),
650 this->data[3][0] * _m2(0, 1) +
651 this->data[3][1] * _m2(1, 1) +
652 this->data[3][2] * _m2(2, 1) +
653 this->data[3][3] * _m2(3, 1),
655 this->data[3][0] * _m2(0, 2) +
656 this->data[3][1] * _m2(1, 2) +
657 this->data[3][2] * _m2(2, 2) +
658 this->data[3][3] * _m2(3, 2),
660 this->data[3][0] * _m2(0, 3) +
661 this->data[3][1] * _m2(1, 3) +
662 this->data[3][2] * _m2(2, 3) +
663 this->data[3][3] * _m2(3, 3));
713 return equal<T>(this->data[0][0], _m(0, 0), _tol)
714 && equal<T>(this->data[0][1], _m(0, 1), _tol)
715 && equal<T>(this->data[0][2], _m(0, 2), _tol)
716 && equal<T>(this->data[0][3], _m(0, 3), _tol)
717 && equal<T>(this->data[1][0], _m(1, 0), _tol)
718 && equal<T>(this->data[1][1], _m(1, 1), _tol)
719 && equal<T>(this->data[1][2], _m(1, 2), _tol)
720 && equal<T>(this->data[1][3], _m(1, 3), _tol)
721 && equal<T>(this->data[2][0], _m(2, 0), _tol)
722 && equal<T>(this->data[2][1], _m(2, 1), _tol)
723 && equal<T>(this->data[2][2], _m(2, 2), _tol)
724 && equal<T>(this->data[2][3], _m(2, 3), _tol)
725 && equal<T>(this->data[3][0], _m(3, 0), _tol)
726 && equal<T>(this->data[3][1], _m(3, 1), _tol)
727 && equal<T>(this->data[3][2], _m(3, 2), _tol)
728 && equal<T>(this->data[3][3], _m(3, 3), _tol);