40 template<
typename T >
47 static const size_t DIM = 4;
85 Matrix44(
const T *dt,
bool srcIsRowMajor =
false );
88 Matrix44( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8, T d9, T d10, T d11, T d12, T d13, T d14, T d15,
bool srcIsRowMajor =
false );
94 template<
typename FromT >
103 operator T*() {
return (T*)
m; }
104 operator const T*()
const {
return (
const T*)
m; }
109 template<
typename FromT >
146 T&
at(
int row,
int col );
147 const T&
at(
int row,
int col )
const;
150 void set(
const T *dt,
bool srcIsRowMajor =
false );
152 void set( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8, T d9, T d10, T d11, T d12, T d13, T d14, T d15,
bool srcIsRowMajor =
false );
175 T
trace(
bool fullTrace =
false )
const;
244 static Matrix44<T> identity() {
return Matrix44( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ); }
276 friend std::ostream& operator<<( std::ostream &lhs, const Matrix44<T> &rhs ) {
277 for(
int i = 0; i < 4; i++) {
279 for(
int j = 0; j < 4; j++) {
280 lhs << std::setw( 12 ) << std::setprecision( 6 ) << rhs.
m[j*4+i];
282 lhs <<
"|" << std::endl;
289 template<
typename T >
295 template<
typename T >
298 for(
int i = 0; i < DIM_SQ; ++i ) {
303 template<
typename T >
306 set( dt, srcIsRowMajor );
309 template<
typename T >
310 Matrix44<T>::Matrix44( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8, T d9, T d10, T d11, T d12, T d13, T d14, T d15,
bool srcIsRowMajor )
315 d12, d13, d14, d15, srcIsRowMajor );
318 template<
typename T >
321 m[0] = vx.
x;
m[4] = vy.
x;
m[ 8] = vz.
x;
m[12] = 0;
322 m[1] = vx.
y;
m[5] = vy.
y;
m[ 9] = vz.
y;
m[13] = 0;
323 m[2] = vx.
z;
m[6] = vy.
z;
m[10] = vz.
z;
m[14] = 0;
324 m[3] = 0;
m[7] = 0;
m[11] = 0;
m[15] = 1;
327 template<
typename T >
330 m[0] = vx.
x;
m[4] = vy.
x;
m[ 8] = vz.
x;
m[12] = vw.
x;
331 m[1] = vx.
y;
m[5] = vy.
y;
m[ 9] = vz.
y;
m[13] = vw.
y;
332 m[2] = vx.
z;
m[6] = vy.
z;
m[10] = vz.
z;
m[14] = vw.
z;
333 m[3] = vx.
w;
m[7] = vy.
w;
m[11] = vz.
w;
m[15] = vw.
w;
336 template<
typename T >
337 template<
typename FromT >
340 for(
int i = 0; i < DIM_SQ; ++i ) {
341 m[i] =
static_cast<T
>( src.
m[i] );
345 template<
typename T >
349 m00 = src.
m00; m01 = src.
m01;
350 m10 = src.
m10; m11 = src.
m11;
353 template<
typename T >
356 m[ 0] = src.
m[0];
m[ 4] = src.
m[2];
m[ 8] = 0;
m[12] = src.
m[4];
357 m[ 1] = src.
m[1];
m[ 5] = src.
m[3];
m[ 9] = 0;
m[13] = src.
m[5];
358 m[ 2] = 0;
m[ 6] = 0;
m[10] = 1;
m[14] = 0;
359 m[ 3] = 0;
m[ 7] = 0;
m[11] = 0;
m[15] = 1;
362 template<
typename T >
366 m00 = src.
m00; m01 = src.
m01; m02 = src.
m02;
367 m10 = src.
m10; m11 = src.
m11; m12 = src.
m12;
368 m20 = src.
m20; m21 = src.
m21; m22 = src.
m22;
371 template<
typename T >
374 std::memcpy(
m, src.
m, MEM_LEN );
377 template<
typename T >
380 std::memcpy(
m, rhs.
m, MEM_LEN );
384 template<
typename T >
387 for(
int i = 0; i < DIM_SQ; i++ ) {
393 template<
typename T >
394 template<
typename FromT >
397 for(
int i = 0; i < DIM_SQ; i++ ) {
398 m[i] =
static_cast<T
>(rhs.
m[i]);
403 template<
typename T >
407 m00 = rhs.
m00; m01 = rhs.
m01;
408 m10 = rhs.
m10; m11 = rhs.
m11;
412 template<
typename T >
415 m[ 0] = rhs.
m[0];
m[ 4] = rhs.
m[2];
m[ 8] = 0;
m[12] = rhs.
m[4];
416 m[ 1] = rhs.
m[1];
m[ 5] = rhs.
m[3];
m[ 9] = 0;
m[13] = rhs.
m[5];
417 m[ 2] = 0;
m[ 6] = 0;
m[10] = 1;
m[14] = 0;
418 m[ 3] = 0;
m[ 7] = 0;
m[11] = 0;
m[15] = 1;
424 template<
typename T >
428 m00 = rhs.
m00; m01 = rhs.
m01; m02 = rhs.
m02;
429 m10 = rhs.
m10; m11 = rhs.
m11; m12 = rhs.
m12;
430 m20 = rhs.
m20; m21 = rhs.
m21; m22 = rhs.
m22;
434 template<
typename T >
437 for(
int i = 0; i < DIM_SQ; ++i ) {
444 template<
typename T >
449 ret.
m[ 0] =
m[ 0]*rhs.
m[ 0] +
m[ 4]*rhs.
m[ 1] +
m[ 8]*rhs.
m[ 2] +
m[12]*rhs.
m[ 3];
450 ret.
m[ 1] =
m[ 1]*rhs.
m[ 0] +
m[ 5]*rhs.
m[ 1] +
m[ 9]*rhs.
m[ 2] +
m[13]*rhs.
m[ 3];
451 ret.
m[ 2] =
m[ 2]*rhs.
m[ 0] +
m[ 6]*rhs.
m[ 1] +
m[10]*rhs.
m[ 2] +
m[14]*rhs.
m[ 3];
452 ret.
m[ 3] =
m[ 3]*rhs.
m[ 0] +
m[ 7]*rhs.
m[ 1] +
m[11]*rhs.
m[ 2] +
m[15]*rhs.
m[ 3];
454 ret.
m[ 4] =
m[ 0]*rhs.
m[ 4] +
m[ 4]*rhs.
m[ 5] +
m[ 8]*rhs.
m[ 6] +
m[12]*rhs.
m[ 7];
455 ret.
m[ 5] =
m[ 1]*rhs.
m[ 4] +
m[ 5]*rhs.
m[ 5] +
m[ 9]*rhs.
m[ 6] +
m[13]*rhs.
m[ 7];
456 ret.
m[ 6] =
m[ 2]*rhs.
m[ 4] +
m[ 6]*rhs.
m[ 5] +
m[10]*rhs.
m[ 6] +
m[14]*rhs.
m[ 7];
457 ret.
m[ 7] =
m[ 3]*rhs.
m[ 4] +
m[ 7]*rhs.
m[ 5] +
m[11]*rhs.
m[ 6] +
m[15]*rhs.
m[ 7];
459 ret.
m[ 8] =
m[ 0]*rhs.
m[ 8] +
m[ 4]*rhs.
m[ 9] +
m[ 8]*rhs.
m[10] +
m[12]*rhs.
m[11];
460 ret.
m[ 9] =
m[ 1]*rhs.
m[ 8] +
m[ 5]*rhs.
m[ 9] +
m[ 9]*rhs.
m[10] +
m[13]*rhs.
m[11];
461 ret.
m[10] =
m[ 2]*rhs.
m[ 8] +
m[ 6]*rhs.
m[ 9] +
m[10]*rhs.
m[10] +
m[14]*rhs.
m[11];
462 ret.
m[11] =
m[ 3]*rhs.
m[ 8] +
m[ 7]*rhs.
m[ 9] +
m[11]*rhs.
m[10] +
m[15]*rhs.
m[11];
464 ret.
m[12] =
m[ 0]*rhs.
m[12] +
m[ 4]*rhs.
m[13] +
m[ 8]*rhs.
m[14] +
m[12]*rhs.
m[15];
465 ret.
m[13] =
m[ 1]*rhs.
m[12] +
m[ 5]*rhs.
m[13] +
m[ 9]*rhs.
m[14] +
m[13]*rhs.
m[15];
466 ret.
m[14] =
m[ 2]*rhs.
m[12] +
m[ 6]*rhs.
m[13] +
m[10]*rhs.
m[14] +
m[14]*rhs.
m[15];
467 ret.
m[15] =
m[ 3]*rhs.
m[12] +
m[ 7]*rhs.
m[13] +
m[11]*rhs.
m[14] +
m[15]*rhs.
m[15];
469 for(
int i = 0; i < DIM_SQ; ++i ) {
476 template<
typename T >
479 for(
int i = 0; i < DIM_SQ; ++i ) {
485 template<
typename T >
488 for(
int i = 0; i < DIM_SQ; ++i ) {
494 template<
typename T >
497 for(
int i = 0; i < DIM_SQ; ++i ) {
503 template<
typename T >
507 for(
int i = 0; i < DIM_SQ; ++i ) {
513 template<
typename T >
516 for(
int i = 0; i < DIM_SQ; ++i ) {
522 template<
typename T >
525 for(
int i = 0; i < DIM_SQ; ++i ) {
531 template<
typename T >
536 ret.
m[ 0] =
m[ 0]*rhs.
m[ 0] +
m[ 4]*rhs.
m[ 1] +
m[ 8]*rhs.
m[ 2] +
m[12]*rhs.
m[ 3];
537 ret.
m[ 1] =
m[ 1]*rhs.
m[ 0] +
m[ 5]*rhs.
m[ 1] +
m[ 9]*rhs.
m[ 2] +
m[13]*rhs.
m[ 3];
538 ret.
m[ 2] =
m[ 2]*rhs.
m[ 0] +
m[ 6]*rhs.
m[ 1] +
m[10]*rhs.
m[ 2] +
m[14]*rhs.
m[ 3];
539 ret.
m[ 3] =
m[ 3]*rhs.
m[ 0] +
m[ 7]*rhs.
m[ 1] +
m[11]*rhs.
m[ 2] +
m[15]*rhs.
m[ 3];
541 ret.
m[ 4] =
m[ 0]*rhs.
m[ 4] +
m[ 4]*rhs.
m[ 5] +
m[ 8]*rhs.
m[ 6] +
m[12]*rhs.
m[ 7];
542 ret.
m[ 5] =
m[ 1]*rhs.
m[ 4] +
m[ 5]*rhs.
m[ 5] +
m[ 9]*rhs.
m[ 6] +
m[13]*rhs.
m[ 7];
543 ret.
m[ 6] =
m[ 2]*rhs.
m[ 4] +
m[ 6]*rhs.
m[ 5] +
m[10]*rhs.
m[ 6] +
m[14]*rhs.
m[ 7];
544 ret.
m[ 7] =
m[ 3]*rhs.
m[ 4] +
m[ 7]*rhs.
m[ 5] +
m[11]*rhs.
m[ 6] +
m[15]*rhs.
m[ 7];
546 ret.
m[ 8] =
m[ 0]*rhs.
m[ 8] +
m[ 4]*rhs.
m[ 9] +
m[ 8]*rhs.
m[10] +
m[12]*rhs.
m[11];
547 ret.
m[ 9] =
m[ 1]*rhs.
m[ 8] +
m[ 5]*rhs.
m[ 9] +
m[ 9]*rhs.
m[10] +
m[13]*rhs.
m[11];
548 ret.
m[10] =
m[ 2]*rhs.
m[ 8] +
m[ 6]*rhs.
m[ 9] +
m[10]*rhs.
m[10] +
m[14]*rhs.
m[11];
549 ret.
m[11] =
m[ 3]*rhs.
m[ 8] +
m[ 7]*rhs.
m[ 9] +
m[11]*rhs.
m[10] +
m[15]*rhs.
m[11];
551 ret.
m[12] =
m[ 0]*rhs.
m[12] +
m[ 4]*rhs.
m[13] +
m[ 8]*rhs.
m[14] +
m[12]*rhs.
m[15];
552 ret.
m[13] =
m[ 1]*rhs.
m[12] +
m[ 5]*rhs.
m[13] +
m[ 9]*rhs.
m[14] +
m[13]*rhs.
m[15];
553 ret.
m[14] =
m[ 2]*rhs.
m[12] +
m[ 6]*rhs.
m[13] +
m[10]*rhs.
m[14] +
m[14]*rhs.
m[15];
554 ret.
m[15] =
m[ 3]*rhs.
m[12] +
m[ 7]*rhs.
m[13] +
m[11]*rhs.
m[14] +
m[15]*rhs.
m[15];
559 template<
typename T >
563 for(
int i = 0; i < DIM_SQ; ++i ) {
564 ret.
m[i] =
m[i] + rhs.
m[i];
569 template<
typename T >
573 for(
int i = 0; i < DIM_SQ; ++i ) {
574 ret.
m[i] =
m[i] - rhs.
m[i];
579 template<
typename T >
582 T
x =
m[ 0]*rhs.
x +
m[ 4]*rhs.
y +
m[ 8]*rhs.
z +
m[12];
583 T
y =
m[ 1]*rhs.
x +
m[ 5]*rhs.
y +
m[ 9]*rhs.
z +
m[13];
584 T
z =
m[ 2]*rhs.
x +
m[ 6]*rhs.
y +
m[10]*rhs.
z +
m[14];
585 T
w =
m[ 3]*rhs.
x +
m[ 7]*rhs.
y +
m[11]*rhs.
z +
m[15];
590 template<
typename T >
594 m[ 0]*rhs.
x +
m[ 4]*rhs.
y +
m[ 8]*rhs.
z +
m[12]*rhs.
w,
595 m[ 1]*rhs.
x +
m[ 5]*rhs.
y +
m[ 9]*rhs.
z +
m[13]*rhs.
w,
596 m[ 2]*rhs.
x +
m[ 6]*rhs.
y +
m[10]*rhs.
z +
m[14]*rhs.
w,
597 m[ 3]*rhs.
x +
m[ 7]*rhs.
y +
m[11]*rhs.
z +
m[15]*rhs.
w
601 template<
typename T >
605 for(
int i = 0; i < DIM_SQ; ++i ) {
611 template<
typename T >
616 for(
int i = 0; i < DIM_SQ; ++i ) {
622 template<
typename T >
626 for(
int i = 0; i < DIM_SQ; ++i ) {
627 ret.
m[i] =
m[i] + rhs;
632 template<
typename T >
636 for(
int i = 0; i < DIM_SQ; ++i ) {
637 ret.
m[i] =
m[i] - rhs;
642 template<
typename T >
645 assert(row >= 0 && row < DIM);
646 assert(col >= 0 && col < DIM);
647 return m[col*DIM +
row];
650 template<
typename T >
653 assert(row >= 0 && row < DIM);
654 assert(col >= 0 && col < DIM);
655 return m[col*DIM +
row];
658 template<
typename T >
661 if( srcIsRowMajor ) {
662 m[0] = dt[ 0];
m[4] = dt[ 1];
m[ 8] = dt[ 2];
m[12] = dt[ 3];
663 m[1] = dt[ 4];
m[5] = dt[ 5];
m[ 9] = dt[ 6];
m[13] = dt[ 7];
664 m[2] = dt[ 8];
m[6] = dt[ 9];
m[10] = dt[10];
m[14] = dt[11];
665 m[3] = dt[12];
m[7] = dt[13];
m[11] = dt[14];
m[15] = dt[15];
668 std::memcpy(
m, dt, MEM_LEN );
672 template<
typename T >
673 void Matrix44<T>::set( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8, T d9, T d10, T d11, T d12, T d13, T d14, T d15,
bool srcIsRowMajor )
675 if( srcIsRowMajor ) {
676 m[0] = d0;
m[4] = d1;
m[ 8] = d2;
m[12] = d3;
677 m[1] = d4;
m[5] = d5;
m[ 9] = d6;
m[13] = d7;
678 m[2] = d8;
m[6] = d9;
m[10] = d10;
m[14] = d11;
679 m[3] = d12;
m[7] = d13;
m[11] = d14;
m[15] = d15;
682 m[0] = d0;
m[4] = d4;
m[ 8] = d8;
m[12] = d12;
683 m[1] = d1;
m[5] = d5;
m[ 9] = d9;
m[13] = d13;
684 m[2] = d2;
m[6] = d6;
m[10] = d10;
m[14] = d14;
685 m[3] = d3;
m[7] = d7;
m[11] = d11;
m[15] = d15;
689 template<
typename T >
701 template<
typename T >
711 template<
typename T >
722 template<
typename T >
731 template<
typename T >
734 *c0 = getColumn( 0 );
735 *c1 = getColumn( 1 );
736 *c2 = getColumn( 2 );
737 *c3 = getColumn( 3 );
740 template<
typename T >
749 template<
typename T >
758 template<
typename T >
767 template<
typename T >
773 for(
int i = 0; i < 2; ++i ) {
778 for(
int j = 0; j < 2; ++j ) {
783 ret.
at( i, j ) = at( r, c );
790 template<
typename T >
796 for(
int i = 0; i < 3; ++i ) {
801 for(
int j = 0; j < 3; ++j ) {
806 ret.
at( i, j ) = at( r, c );
813 template<
typename T >
816 std::memset(
m, 0, MEM_LEN );
819 template<
typename T >
822 m[ 0] = 1;
m[ 4] = 0;
m[ 8] = 0;
m[12] = 0;
823 m[ 1] = 0;
m[ 5] = 1;
m[ 9] = 0;
m[13] = 0;
824 m[ 2] = 0;
m[ 6] = 0;
m[10] = 1;
m[14] = 0;
825 m[ 3] = 0;
m[ 7] = 0;
m[11] = 0;
m[15] = 1;
828 template<
typename T >
831 T a0 =
m[ 0]*
m[ 5] -
m[ 1]*
m[ 4];
832 T a1 = m[ 0]*m[ 6] - m[ 2]*m[ 4];
833 T a2 = m[ 0]*m[ 7] - m[ 3]*m[ 4];
834 T a3 = m[ 1]*m[ 6] - m[ 2]*m[ 5];
835 T a4 = m[ 1]*m[ 7] - m[ 3]*m[ 5];
836 T a5 = m[ 2]*m[ 7] - m[ 3]*m[ 6];
837 T b0 = m[ 8]*m[13] - m[ 9]*m[12];
838 T b1 = m[ 8]*m[14] - m[10]*m[12];
839 T b2 = m[ 8]*m[15] - m[11]*m[12];
840 T b3 = m[ 9]*m[14] - m[10]*m[13];
841 T b4 = m[ 9]*m[15] - m[11]*m[13];
842 T b5 = m[10]*m[15] - m[11]*m[14];
844 T det = a0*b5 - a1*b4 + a2*b3 + a3*b2 - a4*b1 + a5*b0;
849 template<
typename T >
853 return m00 + m11 + m22 + m33;
856 return m00 + m11 + m22;
859 template<
typename T >
870 template<
typename T >
876 ret.
m20 = m20; ret.
m21 = m21; ret.
m22 = m22; ret.
m23 = 0;
877 ret.
m30 = m30; ret.
m31 = m31; ret.
m32 = m32; ret.
m33 = m33;
881 template<
typename T >
885 ret.
m00 = m00; ret.
m01 = m01; ret.
m02 = m02; ret.
m03 = m03;
886 ret.
m10 = 0; ret.
m11 = m11; ret.
m12 = m12; ret.
m13 = m13;
892 template<
typename T >
896 t = m01; m01 = m10; m10 =
t;
897 t = m02; m02 = m20; m20 =
t;
898 t = m03; m03 = m30; m30 =
t;
899 t = m12; m12 = m21; m21 =
t;
900 t = m13; m13 = m31; m31 =
t;
901 t = m23; m23 = m32; m32 =
t;
904 template<
typename T >
908 m[ 0], m[ 4], m[ 8], m[12],
909 m[ 1], m[ 5], m[ 9], m[13],
910 m[ 2], m[ 6], m[10], m[14],
911 m[ 3], m[ 7], m[11], m[15]
915 template<
typename T >
920 T a0 =
m[ 0]*
m[ 5] -
m[ 1]*
m[ 4];
921 T a1 = m[ 0]*m[ 6] - m[ 2]*m[ 4];
922 T a2 = m[ 0]*m[ 7] - m[ 3]*m[ 4];
923 T a3 = m[ 1]*m[ 6] - m[ 2]*m[ 5];
924 T a4 = m[ 1]*m[ 7] - m[ 3]*m[ 5];
925 T a5 = m[ 2]*m[ 7] - m[ 3]*m[ 6];
926 T b0 = m[ 8]*m[13] - m[ 9]*m[12];
927 T b1 = m[ 8]*m[14] - m[10]*m[12];
928 T b2 = m[ 8]*m[15] - m[11]*m[12];
929 T b3 = m[ 9]*m[14] - m[10]*m[13];
930 T b4 = m[ 9]*m[15] - m[11]*m[13];
931 T b5 = m[10]*m[15] - m[11]*m[14];
933 T det = a0*b5 - a1*b4 + a2*b3 + a3*b2 - a4*b1 + a5*b0;
935 if( fabs( det ) > epsilon ) {
936 inv.
m[ 0] = + m[ 5]*b5 - m[ 6]*b4 + m[ 7]*b3;
937 inv.
m[ 4] = - m[ 4]*b5 + m[ 6]*b2 - m[ 7]*b1;
938 inv.
m[ 8] = + m[ 4]*b4 - m[ 5]*b2 + m[ 7]*b0;
939 inv.
m[12] = - m[ 4]*b3 + m[ 5]*b1 - m[ 6]*b0;
940 inv.
m[ 1] = - m[ 1]*b5 + m[ 2]*b4 - m[ 3]*b3;
941 inv.
m[ 5] = + m[ 0]*b5 - m[ 2]*b2 + m[ 3]*b1;
942 inv.
m[ 9] = - m[ 0]*b4 + m[ 1]*b2 - m[ 3]*b0;
943 inv.
m[13] = + m[ 0]*b3 - m[ 1]*b1 + m[ 2]*b0;
944 inv.
m[ 2] = + m[13]*a5 - m[14]*a4 + m[15]*a3;
945 inv.
m[ 6] = - m[12]*a5 + m[14]*a2 - m[15]*a1;
946 inv.
m[10] = + m[12]*a4 - m[13]*a2 + m[15]*a0;
947 inv.
m[14] = - m[12]*a3 + m[13]*a1 - m[14]*a0;
948 inv.
m[ 3] = - m[ 9]*a5 + m[10]*a4 - m[11]*a3;
949 inv.
m[ 7] = + m[ 8]*a5 - m[10]*a2 + m[11]*a1;
950 inv.
m[11] = - m[ 8]*a4 + m[ 9]*a2 - m[11]*a0;
951 inv.
m[15] = + m[ 8]*a3 - m[ 9]*a1 + m[10]*a0;
953 T invDet = ((T)1)/det;
975 template<
typename T >
979 v.
x*m00 + v.
y*m10 + v.
z*m20,
980 v.
x*m01 + v.
y*m11 + v.
z*m21,
981 v.
x*m02 + v.
y*m12 + v.
z*m22
985 template<
typename T >
989 v.
x*m00 + v.
y*m10 + v.
z*m20 + v.
w*m30,
990 v.
x*m01 + v.
y*m11 + v.
z*m21 + v.
w*m31,
991 v.
x*m02 + v.
y*m12 + v.
z*m22 + v.
w*m32,
992 v.
x*m03 + v.
y*m13 + v.
z*m23 + v.
w*m33
996 template<
typename T >
1000 m00*v.
x + m01*v.
y + m02*v.
z,
1001 m10*v.
x + m11*v.
y + m12*v.
z,
1002 m20*v.
x + m21*v.
y + m22*v.
z
1006 template<
typename T >
1010 m00*v.
x + m01*v.
y + m02*v.
z + m03*v.
w,
1011 m10*v.
x + m11*v.
y + m12*v.
z + m13*v.
w,
1012 m20*v.
x + m21*v.
y + m22*v.
z + m23*v.
w,
1013 m30*v.
x + m31*v.
y + m32*v.
z + m33*v.
w
1017 template<
typename T >
1023 T cofactor0 =
m[ 5]*
m[10] -
m[6]*
m[ 9];
1024 T cofactor4 = m[ 2]*m[ 9] - m[1]*m[10];
1025 T cofactor8 = m[ 1]*m[ 6] - m[2]*m[ 5];
1026 T det = m[0]*cofactor0 + m[4]*cofactor4 + m[8]*cofactor8;
1027 if( fabs( det ) <=
EPSILON ) {
1032 T invDet = ((T)1.0) / det;
1033 ret.
m[ 0] = invDet*cofactor0;
1034 ret.
m[ 1] = invDet*cofactor4;
1035 ret.
m[ 2] = invDet*cofactor8;
1037 ret.
m[ 4] = invDet*(m[ 6]*m[ 8] - m[ 4]*m[10]);
1038 ret.
m[ 5] = invDet*(m[ 0]*m[10] - m[ 2]*m[ 8]);
1039 ret.
m[ 6] = invDet*(m[ 2]*m[ 4] - m[ 0]*m[ 6]);
1041 ret.
m[ 8] = invDet*(m[ 4]*m[ 9] - m[ 5]*m[ 8]);
1042 ret.
m[ 9] = invDet*(m[ 1]*m[ 8] - m[ 0]*m[ 9]);
1043 ret.
m[10] = invDet*(m[ 0]*m[ 5] - m[ 1]*m[ 4]);
1046 ret.
m[12] = -ret.
m[ 0]*m[12] - ret.
m[ 4]*m[13] - ret.
m[ 8]*m[14];
1047 ret.
m[13] = -ret.
m[ 1]*m[12] - ret.
m[ 5]*m[13] - ret.
m[ 9]*m[14];
1048 ret.
m[14] = -ret.
m[ 2]*m[12] - ret.
m[ 6]*m[13] - ret.
m[10]*m[14];
1053 template<
typename T >
1056 T
x = m00*rhs.
x + m01*rhs.
y + m02*rhs.
z + m03;
1057 T
y = m10*rhs.
x + m11*rhs.
y + m12*rhs.
z + m13;
1058 T
z = m20*rhs.
x + m21*rhs.
y + m22*rhs.
z + m23;
1059 T
w = m30*rhs.
x + m31*rhs.
y + m32*rhs.
z + m33;
1064 template<
typename T >
1067 T
x = m00*rhs.
x + m01*rhs.
y + m02*rhs.
z + m03;
1068 T
y = m10*rhs.
x + m11*rhs.
y + m12*rhs.
z + m13;
1069 T
z = m20*rhs.
x + m21*rhs.
y + m22*rhs.
z + m23;
1074 template<
typename T >
1077 T
x = m00*rhs.
x + m01*rhs.
y + m02*rhs.
z;
1078 T
y = m10*rhs.
x + m11*rhs.
y + m12*rhs.
z;
1079 T
z = m20*rhs.
x + m21*rhs.
y + m22*rhs.
z;
1084 template<
typename T >
1088 std::swap( at(0,1), at(1,0) );
1089 std::swap( at(0,2), at(2,0) );
1090 std::swap( at(1,2), at(2,1) );
1093 Vec3f newT( transformVec(
Vec3f(-at(0,3),-at(1,3),-at(2,3)) ) );
1099 template<
typename T>
1113 template<
typename T>
1129 Matrix44<T> zAxis2ToDir = alignZAxisWithTarget( to, worldUp );
1130 return fromDir2zAxis * zAxis2ToDir;
1134 template<
typename T>
1143 ret.
m[ 0] = unit.x * unit.x * (1 - cosine) + cosine;
1144 ret.
m[ 1] = unit.x * unit.y * (1 - cosine) + unit.z * sine;
1145 ret.
m[ 2] = unit.x * unit.z * (1 - cosine) - unit.y * sine;
1148 ret.
m[ 4] = unit.x * unit.y * (1 - cosine) - unit.z * sine;
1149 ret.
m[ 5] = unit.y * unit.y * (1 - cosine) + cosine;
1150 ret.
m[ 6] = unit.y * unit.z * (1 - cosine) + unit.x * sine;
1153 ret.
m[ 8] = unit.x * unit.z * (1 - cosine) + unit.y * sine;
1154 ret.
m[ 9] = unit.y * unit.z * (1 - cosine) - unit.x * sine;
1155 ret.
m[10] = unit.z * unit.z * (1 - cosine) + cosine;
1166 template<
typename T>
1179 T cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx;
1189 ret.
m[ 0] = cos_rz*cos_ry;
1190 ret.
m[ 1] = sin_rz*cos_ry;
1191 ret.
m[ 2] = -sin_ry;
1194 ret.
m[ 4] = -sin_rz*cos_rx + cos_rz*sin_ry*sin_rx;
1195 ret.
m[ 5] = cos_rz*cos_rx + sin_rz*sin_ry*sin_rx;
1196 ret.
m[ 6] = cos_ry*sin_rx;
1199 ret.
m[ 8] = sin_rz*sin_rx + cos_rz*sin_ry*cos_rx;
1200 ret.
m[ 9] = -cos_rz*sin_rx + sin_rz*sin_ry*cos_rx;
1201 ret.
m[10] = cos_ry*cos_rx;
1212 template<
typename T>
1223 template<
typename T>
1235 template<
typename T>
1247 template<
typename T>
1259 template<
typename T>
1271 template<
typename T>
1285 if( upDir.
cross( targetDir ).lengthSquared() == 0 ) {
1293 Vec3<T> targetUpDir = targetDir.
cross( targetPerpDir );
1305 row[1].x, row[1].y, row[1].z, 0,
1306 row[2].x, row[2].y, row[2].z, 0,
GLdouble GLdouble GLdouble r
Definition: GLee.h:1474
T x
Definition: Vector.h:694
Matrix44< T > & operator=(const Matrix44< T > &rhs)
Definition: Matrix44.h:378
void rotate(const Vec3< T > &from, const Vec3< T > &to, const Vec3< T > &worldUp)
Definition: Matrix44.h:231
T m22
Definition: Matrix33.h:67
GLenum GLint GLint y
Definition: GLee.h:987
T lengthSquared() const
Definition: Vector.h:443
Definition: CinderMath.h:40
static Matrix44< T > createRotation(const Vec4< T > &from, const Vec4< T > &to, const Vec4< T > &worldUp)
Definition: Matrix44.h:258
Matrix44< T > & operator/=(T rhs)
Definition: Matrix44.h:504
Matrix44< T > lowerTriangular() const
Definition: Matrix44.h:871
static T cos(T x)
Definition: CinderMath.h:46
Matrix33< T > subMatrix33(int row, int col) const
Definition: Matrix44.h:791
void rotate(const Vec4< T > &eulerRadians)
Definition: Matrix44.h:229
void rotate(const Vec4< T > &axis, T radians)
Definition: Matrix44.h:226
T value_type
Definition: Matrix44.h:45
Matrix44< T > upperTriangular() const
Definition: Matrix44.h:882
void setTranslate(const Vec3< T > &v)
Definition: Matrix44.h:217
void getColumns(Vec4< T > *c0, Vec4< T > *c1, Vec4< T > *c2, Vec4< T > *c3) const
Definition: Matrix44.h:732
T m30
Definition: Matrix44.h:71
void scale(T s)
Definition: Matrix44.h:235
static Matrix44< T > createRotationOnb(const Vec4< T > &u, const Vec4< T > &v, const Vec4< T > &w)
Definition: Matrix44.h:264
Vec3< T > transformPoint(const Vec3< T > &rhs) const
Definition: Matrix44.h:1054
void scale(const Vec4< T > &v)
Definition: Matrix44.h:238
T m11
Definition: Matrix44.h:72
static T sin(T x)
Definition: CinderMath.h:47
static Matrix44< T > createRotation(const Vec4< T > &axis, T radians)
Definition: Matrix44.h:256
Matrix44< T > invertTransform() const
bool equalCompare(const Matrix44< T > &rhs, T epsilon) const
Definition: Matrix44.h:435
T & at(int row, int col)
Definition: Matrix33.h:501
T y
Definition: Vector.h:694
const Matrix44< T > operator+(const Matrix44< T > &rhs) const
Definition: Matrix44.h:560
T m01
Definition: Matrix22.h:64
Matrix44()
Definition: Matrix44.h:290
T mcols[4][4]
Definition: Matrix44.h:77
#define EPSILON
Definition: CinderMath.h:125
T z
Definition: Vector.h:694
Vec4< T > getColumn(int col) const
Definition: Matrix44.h:690
T m31
Definition: Matrix44.h:72
T z
Definition: Vector.h:321
T w
Definition: Vector.h:694
static Matrix44< T > createTranslation(const Vec3< T > &v, T w=1)
Definition: Matrix44.h:1100
void setToNull()
Definition: Matrix22.h:553
GLuint src
Definition: GLee.h:10873
T x
Definition: Vector.h:321
void scale(const Vec3< T > &v)
Definition: Matrix44.h:237
Matrix44< T > diagonal() const
Definition: Matrix44.h:860
bool operator==(const Matrix44< T > &rhs) const
Definition: Matrix44.h:118
Matrix44< T > orthonormalInverted() const
Definition: Matrix44.h:202
T x
Definition: Vector.h:71
GLfloat angle
Definition: GLee.h:13523
void transpose()
Definition: Matrix44.h:893
T y
Definition: Vector.h:321
T m32
Definition: Matrix44.h:73
void rotate(const Vec4< T > &from, const Vec4< T > &to, const Vec4< T > &worldUp)
Definition: Matrix44.h:232
static const size_t DIM_SQ
Definition: Matrix44.h:48
T m[16]
Definition: Matrix44.h:66
void setTranslate(const Vec4< T > &v)
Definition: Matrix44.h:218
void getRows(Vec4< T > *r0, Vec4< T > *r1, Vec4< T > *r2, Vec4< T > *r3) const
Definition: Matrix44.h:750
void rotate(const Vec3< T > &axis, T radians)
Definition: Matrix44.h:225
T trace(bool fullTrace=false) const
Definition: Matrix44.h:850
static Matrix44< T > alignZAxisWithTarget(Vec3< T > targetDir, Vec3< T > upDir)
Definition: Matrix44.h:1272
void setColumn(int col, const Vec4< T > &v)
Definition: Matrix44.h:702
T m12
Definition: Matrix33.h:67
static Matrix44< T > zero()
Definition: Matrix44.h:248
static const size_t MEM_LEN
Definition: Matrix44.h:49
void scale(const Vec2< T > &v)
Definition: Matrix44.h:236
T m20
Definition: Matrix44.h:71
static Matrix44< T > alignZAxisWithTarget(Vec4< T > targetDir, Vec4< T > upDir)
Definition: Matrix44.h:274
Matrix44< T > & operator*=(const Matrix44< T > &rhs)
Definition: Matrix44.h:445
T m10
Definition: Matrix22.h:63
Matrix44< T > & operator+=(const Matrix44< T > &rhs)
Definition: Matrix44.h:477
Vec4< T > getRow(int row) const
Definition: Matrix44.h:712
T m20
Definition: Matrix33.h:65
GLenum GLenum GLvoid * row
Definition: GLee.h:1089
Vec3< T > preMultiply(const Vec3< T > &v) const
Definition: Matrix44.h:976
Matrix22< T > subMatrix22(int row, int col) const
Definition: Matrix44.h:768
Vec3< float > Vec3f
Definition: Vector.h:1317
T m11
Definition: Matrix33.h:66
void setRow(int row, const Vec4< T > &v)
Definition: Matrix44.h:723
T m00
Definition: Matrix33.h:65
const Matrix44< T > operator/(T rhs) const
Definition: Matrix44.h:612
T m10
Definition: Matrix44.h:71
T m21
Definition: Matrix33.h:66
T m10
Definition: Matrix33.h:65
Vec3< T > postMultiply(const Vec3< T > &v) const
Definition: Matrix44.h:997
Vec3< T > transformVec(const Vec3< T > &rhs) const
Definition: Matrix44.h:1075
Vec4< T > getTranslate() const
Definition: Matrix44.h:215
void rotate(const Vec3< T > &eulerRadians)
Definition: Matrix44.h:228
GLenum GLint x
Definition: GLee.h:987
T m23
Definition: Matrix44.h:74
Matrix44< T > affineInverted() const
Definition: Matrix44.h:1018
T & at(int row, int col)
Definition: Matrix44.h:643
T m01
Definition: Matrix33.h:66
static const size_t DIM
Definition: Matrix44.h:47
T & at(int row, int col)
Definition: Matrix22.h:450
void setToNull()
Definition: Matrix44.h:814
Vec3< T > xyz() const
Definition: Vector.h:973
const GLdouble * v
Definition: GLee.h:1384
GLdouble GLdouble z
Definition: GLee.h:1911
T y
Definition: Vector.h:71
static Matrix44< T > createRotationOnb(const Vec3< T > &u, const Vec3< T > &v, const Vec3< T > &w)
Definition: Matrix44.h:1213
const Matrix44< T > operator-(const Matrix44< T > &rhs) const
Definition: Matrix44.h:570
T m13
Definition: Matrix44.h:74
const GLubyte * c
Definition: GLee.h:8491
Matrix44< float > Matrix44f
Definition: Matrix44.h:1314
void setRows(const Vec4< T > &r0, const Vec4< T > &r1, const Vec4< T > &r2, const Vec4< T > &r3)
Definition: Matrix44.h:759
bool operator!=(const Matrix44< T > &rhs) const
Definition: Matrix44.h:119
Represents a two dimensional affine transformation.
Definition: MatrixAffine2.h:38
const Matrix44< T > operator*(const Matrix44< T > &rhs) const
Definition: Matrix44.h:532
Matrix44< T > inverted(T epsilon=FLT_MIN) const
Definition: Matrix44.h:916
Definition: Matrix44.h:41
void affineInvert()
Computes inverse; assumes the matrix is affine, i.e. the bottom row is [0 0 0 1]. ...
Definition: Matrix44.h:197
T TYPE
Definition: Matrix44.h:44
Vec3< T > cross(const Vec3< T > &rhs) const
Definition: Vector.h:423
T m00
Definition: Matrix44.h:71
T m00
Definition: Matrix22.h:63
void setToNull()
Definition: Matrix33.h:638
void translate(const Vec3< T > &tr)
Definition: Matrix44.h:221
void orthonormalInvert()
Computes inverse; assumes the matrix is orthonormal.
Definition: Matrix44.h:1085
T m03
Definition: Matrix44.h:74
Definition: Matrix22.h:37
void invert(T epsilon=FLT_MIN)
Definition: Matrix44.h:185
Matrix44< T > transposed() const
Definition: Matrix44.h:905
T m21
Definition: Matrix44.h:72
T m33
Definition: Matrix44.h:74
static Matrix44< T > identity()
Definition: Matrix44.h:244
Vec4< T > transformVec(const Vec4< T > &rhs) const
Definition: Matrix44.h:212
void set(const T *dt, bool srcIsRowMajor=false)
Definition: Matrix44.h:659
T m[6]
Definition: MatrixAffine2.h:61
T m11
Definition: Matrix22.h:64
GLubyte GLubyte GLubyte GLubyte w
Definition: GLee.h:2685
static Matrix44< T > one()
Definition: Matrix44.h:246
static Matrix44< T > createScale(T s)
Definition: Matrix44.h:1224
static Matrix44< T > createRotation(const Vec4< T > &eulerRadians)
Definition: Matrix44.h:261
Vec3< T > transformPointAffine(const Vec3< T > &rhs) const
Definition: Matrix44.h:1065
T m02
Definition: Matrix33.h:67
T determinant() const
Definition: Matrix44.h:829
const GLfloat * m
Definition: GLee.h:13493
Matrix44< T > & operator-=(const Matrix44< T > &rhs)
Definition: Matrix44.h:486
GLdouble GLdouble t
Definition: GLee.h:1426
GLdouble s
Definition: GLee.h:1378
static Matrix44< T > createRotation(const Vec3< T > &axis, T radians)
Definition: Matrix44.h:1135
T m02
Definition: Matrix44.h:73
void setToIdentity()
Definition: Matrix44.h:820
Matrix44< double > Matrix44d
Definition: Matrix44.h:1315
Definition: Matrix33.h:37
static Matrix44< T > createTranslation(const Vec4< T > &v)
Definition: Matrix44.h:252
void translate(const Vec4< T > &tr)
Definition: Matrix44.h:222
T m01
Definition: Matrix44.h:72
void setColumns(const Vec4< T > &c0, const Vec4< T > &c1, const Vec4< T > &c2, const Vec4< T > &c3)
Definition: Matrix44.h:741
Vec3< T > normalized() const
Definition: Vector.h:492
T m22
Definition: Matrix44.h:73
T m12
Definition: Matrix44.h:73