5 #ifndef __IRR_MATRIX_H_INCLUDED__
6 #define __IRR_MATRIX_H_INCLUDED__
24 #if defined( USE_MATRIX_TEST_DEBUG )
29 MatrixTest () : ID(0), Calls(0) {}
34 static MatrixTest MTest;
72 #if defined ( USE_MATRIX_TEST )
73 definitelyIdentityMatrix=
false;
75 return M[ row * 4 + col ];
84 #if defined ( USE_MATRIX_TEST )
85 definitelyIdentityMatrix=
false;
103 #if defined ( USE_MATRIX_TEST )
104 definitelyIdentityMatrix=
false;
392 #if defined ( USE_MATRIX_TEST )
394 mutable u32 definitelyIdentityMatrix;
396 #if defined ( USE_MATRIX_TEST_DEBUG )
406 #if defined ( USE_MATRIX_TEST )
407 : definitelyIdentityMatrix(BIT_UNTESTED)
409 #if defined ( USE_MATRIX_TEST_DEBUG )
410 ,id ( MTest.ID++), calls ( 0 )
413 switch ( constructor )
415 case EM4CONST_NOTHING:
418 case EM4CONST_IDENTITY:
419 case EM4CONST_INVERSE:
429 #if defined ( USE_MATRIX_TEST )
430 : definitelyIdentityMatrix(BIT_UNTESTED)
432 #if defined ( USE_MATRIX_TEST_DEBUG )
433 ,id ( MTest.ID++), calls ( 0 )
436 switch ( constructor )
438 case EM4CONST_IDENTITY:
441 case EM4CONST_NOTHING:
446 case EM4CONST_TRANSPOSED:
449 case EM4CONST_INVERSE:
451 memset(M, 0, 16*
sizeof(T));
453 case EM4CONST_INVERSE_TRANSPOSED:
455 memset(M, 0, 16*
sizeof(T));
457 *
this=getTransposed();
468 temp[0] = M[0]+other[0];
469 temp[1] = M[1]+other[1];
470 temp[2] = M[2]+other[2];
471 temp[3] = M[3]+other[3];
472 temp[4] = M[4]+other[4];
473 temp[5] = M[5]+other[5];
474 temp[6] = M[6]+other[6];
475 temp[7] = M[7]+other[7];
476 temp[8] = M[8]+other[8];
477 temp[9] = M[9]+other[9];
478 temp[10] = M[10]+other[10];
479 temp[11] = M[11]+other[11];
480 temp[12] = M[12]+other[12];
481 temp[13] = M[13]+other[13];
482 temp[14] = M[14]+other[14];
483 temp[15] = M[15]+other[15];
518 temp[0] = M[0]-other[0];
519 temp[1] = M[1]-other[1];
520 temp[2] = M[2]-other[2];
521 temp[3] = M[3]-other[3];
522 temp[4] = M[4]-other[4];
523 temp[5] = M[5]-other[5];
524 temp[6] = M[6]-other[6];
525 temp[7] = M[7]-other[7];
526 temp[8] = M[8]-other[8];
527 temp[9] = M[9]-other[9];
528 temp[10] = M[10]-other[10];
529 temp[11] = M[11]-other[11];
530 temp[12] = M[12]-other[12];
531 temp[13] = M[13]-other[13];
532 temp[14] = M[14]-other[14];
533 temp[15] = M[15]-other[15];
568 temp[0] = M[0]*scalar;
569 temp[1] = M[1]*scalar;
570 temp[2] = M[2]*scalar;
571 temp[3] = M[3]*scalar;
572 temp[4] = M[4]*scalar;
573 temp[5] = M[5]*scalar;
574 temp[6] = M[6]*scalar;
575 temp[7] = M[7]*scalar;
576 temp[8] = M[8]*scalar;
577 temp[9] = M[9]*scalar;
578 temp[10] = M[10]*scalar;
579 temp[11] = M[11]*scalar;
580 temp[12] = M[12]*scalar;
581 temp[13] = M[13]*scalar;
582 temp[14] = M[14]*scalar;
583 temp[15] = M[15]*scalar;
616 #if defined ( USE_MATRIX_TEST )
620 if ( this->isIdentity() )
622 return (*
this = other);
627 return setbyproduct_nocheck( temp, other );
633 return setbyproduct_nocheck( temp, other );
643 const T *m1 = other_a.M;
644 const T *m2 = other_b.M;
646 M[0] = m1[0]*m2[0] + m1[4]*m2[1] + m1[8]*m2[2] + m1[12]*m2[3];
647 M[1] = m1[1]*m2[0] + m1[5]*m2[1] + m1[9]*m2[2] + m1[13]*m2[3];
648 M[2] = m1[2]*m2[0] + m1[6]*m2[1] + m1[10]*m2[2] + m1[14]*m2[3];
649 M[3] = m1[3]*m2[0] + m1[7]*m2[1] + m1[11]*m2[2] + m1[15]*m2[3];
651 M[4] = m1[0]*m2[4] + m1[4]*m2[5] + m1[8]*m2[6] + m1[12]*m2[7];
652 M[5] = m1[1]*m2[4] + m1[5]*m2[5] + m1[9]*m2[6] + m1[13]*m2[7];
653 M[6] = m1[2]*m2[4] + m1[6]*m2[5] + m1[10]*m2[6] + m1[14]*m2[7];
654 M[7] = m1[3]*m2[4] + m1[7]*m2[5] + m1[11]*m2[6] + m1[15]*m2[7];
656 M[8] = m1[0]*m2[8] + m1[4]*m2[9] + m1[8]*m2[10] + m1[12]*m2[11];
657 M[9] = m1[1]*m2[8] + m1[5]*m2[9] + m1[9]*m2[10] + m1[13]*m2[11];
658 M[10] = m1[2]*m2[8] + m1[6]*m2[9] + m1[10]*m2[10] + m1[14]*m2[11];
659 M[11] = m1[3]*m2[8] + m1[7]*m2[9] + m1[11]*m2[10] + m1[15]*m2[11];
661 M[12] = m1[0]*m2[12] + m1[4]*m2[13] + m1[8]*m2[14] + m1[12]*m2[15];
662 M[13] = m1[1]*m2[12] + m1[5]*m2[13] + m1[9]*m2[14] + m1[13]*m2[15];
663 M[14] = m1[2]*m2[12] + m1[6]*m2[13] + m1[10]*m2[14] + m1[14]*m2[15];
664 M[15] = m1[3]*m2[12] + m1[7]*m2[13] + m1[11]*m2[14] + m1[15]*m2[15];
665 #if defined ( USE_MATRIX_TEST )
666 definitelyIdentityMatrix=
false;
678 #if defined ( USE_MATRIX_TEST )
680 return (*
this = other_b);
683 return (*
this = other_a);
685 return setbyproduct_nocheck(other_a,other_b);
687 return setbyproduct_nocheck(other_a,other_b);
695 #if defined ( USE_MATRIX_TEST )
697 if ( this->isIdentity() )
707 m3[0] = m1[0]*m2[0] + m1[4]*m2[1] + m1[8]*m2[2] + m1[12]*m2[3];
708 m3[1] = m1[1]*m2[0] + m1[5]*m2[1] + m1[9]*m2[2] + m1[13]*m2[3];
709 m3[2] = m1[2]*m2[0] + m1[6]*m2[1] + m1[10]*m2[2] + m1[14]*m2[3];
710 m3[3] = m1[3]*m2[0] + m1[7]*m2[1] + m1[11]*m2[2] + m1[15]*m2[3];
712 m3[4] = m1[0]*m2[4] + m1[4]*m2[5] + m1[8]*m2[6] + m1[12]*m2[7];
713 m3[5] = m1[1]*m2[4] + m1[5]*m2[5] + m1[9]*m2[6] + m1[13]*m2[7];
714 m3[6] = m1[2]*m2[4] + m1[6]*m2[5] + m1[10]*m2[6] + m1[14]*m2[7];
715 m3[7] = m1[3]*m2[4] + m1[7]*m2[5] + m1[11]*m2[6] + m1[15]*m2[7];
717 m3[8] = m1[0]*m2[8] + m1[4]*m2[9] + m1[8]*m2[10] + m1[12]*m2[11];
718 m3[9] = m1[1]*m2[8] + m1[5]*m2[9] + m1[9]*m2[10] + m1[13]*m2[11];
719 m3[10] = m1[2]*m2[8] + m1[6]*m2[9] + m1[10]*m2[10] + m1[14]*m2[11];
720 m3[11] = m1[3]*m2[8] + m1[7]*m2[9] + m1[11]*m2[10] + m1[15]*m2[11];
722 m3[12] = m1[0]*m2[12] + m1[4]*m2[13] + m1[8]*m2[14] + m1[12]*m2[15];
723 m3[13] = m1[1]*m2[12] + m1[5]*m2[13] + m1[9]*m2[14] + m1[13]*m2[15];
724 m3[14] = m1[2]*m2[12] + m1[6]*m2[13] + m1[10]*m2[14] + m1[14]*m2[15];
725 m3[15] = m1[3]*m2[12] + m1[7]*m2[13] + m1[11]*m2[14] + m1[15]*m2[15];
741 M[12] = translation.
X;
742 M[13] = translation.
Y;
743 M[14] = translation.
Z;
744 #if defined ( USE_MATRIX_TEST )
745 definitelyIdentityMatrix=
false;
753 M[12] = -translation.
X;
754 M[13] = -translation.
Y;
755 M[14] = -translation.
Z;
756 #if defined ( USE_MATRIX_TEST )
757 definitelyIdentityMatrix=
false;
768 #if defined ( USE_MATRIX_TEST )
769 definitelyIdentityMatrix=
false;
795 return vector3d<T>(sqrtf(M[0] * M[0] + M[1] * M[1] + M[2] * M[2]),
796 sqrtf(M[4] * M[4] + M[5] * M[5] + M[6] * M[6]),
797 sqrtf(M[8] * M[8] + M[9] * M[9] + M[10] * M[10]));
815 const f64 cr = cos( rotation.
X );
816 const f64 sr = sin( rotation.
X );
817 const f64 cp = cos( rotation.
Y );
818 const f64 sp = sin( rotation.
Y );
819 const f64 cy = cos( rotation.
Z );
820 const f64 sy = sin( rotation.
Z );
826 const f64 srsp = sr*sp;
827 const f64 crsp = cr*sp;
829 M[4] = (T)( srsp*cy-cr*sy );
830 M[5] = (T)( srsp*sy+cr*cy );
833 M[8] = (T)( crsp*cy+sr*sy );
834 M[9] = (T)( crsp*sy-sr*cy );
835 M[10] = (T)( cr*cp );
836 #if defined ( USE_MATRIX_TEST )
837 definitelyIdentityMatrix=
false;
854 f64 Y = -asin(mat[2]*invScale.
X);
855 const f64 C = cos(Y);
858 f64 rotx, roty, X, Z;
863 rotx = mat[10] * invC * invScale.
Z;
864 roty = mat[6] * invC * invScale.
Y;
866 rotx = mat[0] * invC * invScale.
X;
867 roty = mat[1] * invC * invScale.
X;
873 rotx = mat[5] * invScale.
Y;
874 roty = -mat[4] * invScale.
Y;
881 if (X < 0.0) X += 360.0;
882 if (Y < 0.0) Y += 360.0;
883 if (Z < 0.0) Z += 360.0;
892 f64 cr = cos( rotation.
X );
893 f64 sr = sin( rotation.
X );
894 f64 cp = cos( rotation.
Y );
895 f64 sp = sin( rotation.
Y );
896 f64 cy = cos( rotation.
Z );
897 f64 sy = sin( rotation.
Z );
906 M[1] = (T)( srsp*cy-cr*sy );
907 M[5] = (T)( srsp*sy+cr*cy );
910 M[2] = (T)( crsp*cy+sr*sy );
911 M[6] = (T)( crsp*sy-sr*cy );
912 M[10] = (T)( cr*cp );
913 #if defined ( USE_MATRIX_TEST )
914 definitelyIdentityMatrix=
false;
925 memset(M, 0, 16*
sizeof(T));
926 M[0] = M[5] = M[10] = M[15] = (T)1;
927 #if defined ( USE_MATRIX_TEST )
928 definitelyIdentityMatrix=
true;
941 #if defined ( USE_MATRIX_TEST )
942 if (definitelyIdentityMatrix)
951 for (
s32 i=0; i<4; ++i)
952 for (
s32 j=0; j<4; ++j)
953 if ((j != i) && (!
iszero((*
this)(i,j))))
956 #if defined ( USE_MATRIX_TEST )
957 definitelyIdentityMatrix=
true;
967 T dp=M[0] * M[4 ] + M[1] * M[5 ] + M[2 ] * M[6 ] + M[3 ] * M[7 ];
970 dp = M[0] * M[8 ] + M[1] * M[9 ] + M[2 ] * M[10] + M[3 ] * M[11];
973 dp = M[0] * M[12] + M[1] * M[13] + M[2 ] * M[14] + M[3 ] * M[15];
976 dp = M[4] * M[8 ] + M[5] * M[9 ] + M[6 ] * M[10] + M[7 ] * M[11];
979 dp = M[4] * M[12] + M[5] * M[13] + M[6 ] * M[14] + M[7 ] * M[15];
982 dp = M[8] * M[12] + M[9] * M[13] + M[10] * M[14] + M[11] * M[15];
996 #if defined ( USE_MATRIX_TEST )
997 if (definitelyIdentityMatrix)
1001 if(
IR(M[1])!=0)
return false;
1002 if(
IR(M[2])!=0)
return false;
1003 if(
IR(M[3])!=0)
return false;
1005 if(
IR(M[4])!=0)
return false;
1007 if(
IR(M[6])!=0)
return false;
1008 if(
IR(M[7])!=0)
return false;
1010 if(
IR(M[8])!=0)
return false;
1011 if(
IR(M[9])!=0)
return false;
1013 if(
IR(M[11])!=0)
return false;
1015 if(
IR(M[12])!=0)
return false;
1016 if(
IR(M[13])!=0)
return false;
1017 if(
IR(M[13])!=0)
return false;
1020 #if defined ( USE_MATRIX_TEST )
1021 definitelyIdentityMatrix=
true;
1031 vect.
X = tmp.
X*M[0] + tmp.
Y*M[4] + tmp.
Z*M[8];
1032 vect.
Y = tmp.
X*M[1] + tmp.
Y*M[5] + tmp.
Z*M[9];
1033 vect.
Z = tmp.
X*M[2] + tmp.
Y*M[6] + tmp.
Z*M[10];
1040 out.
X = in.
X*M[0] + in.
Y*M[4] + in.
Z*M[8];
1041 out.
Y = in.
X*M[1] + in.
Y*M[5] + in.
Z*M[9];
1042 out.
Z = in.
X*M[2] + in.
Y*M[6] + in.
Z*M[10];
1049 out[0] = in.
X*M[0] + in.
Y*M[4] + in.
Z*M[8];
1050 out[1] = in.
X*M[1] + in.
Y*M[5] + in.
Z*M[9];
1051 out[2] = in.
X*M[2] + in.
Y*M[6] + in.
Z*M[10];
1058 vect.
X = tmp.
X*M[0] + tmp.
Y*M[1] + tmp.
Z*M[2];
1059 vect.
Y = tmp.
X*M[4] + tmp.
Y*M[5] + tmp.
Z*M[6];
1060 vect.
Z = tmp.
X*M[8] + tmp.
Y*M[9] + tmp.
Z*M[10];
1068 vector[0] = vect.
X*M[0] + vect.
Y*M[4] + vect.
Z*M[8] + M[12];
1069 vector[1] = vect.
X*M[1] + vect.
Y*M[5] + vect.
Z*M[9] + M[13];
1070 vector[2] = vect.
X*M[2] + vect.
Y*M[6] + vect.
Z*M[10] + M[14];
1080 out.
X = in.
X*M[0] + in.
Y*M[4] + in.
Z*M[8] + M[12];
1081 out.
Y = in.
X*M[1] + in.
Y*M[5] + in.
Z*M[9] + M[13];
1082 out.
Z = in.
X*M[2] + in.
Y*M[6] + in.
Z*M[10] + M[14];
1089 out[0] = in.
X*M[0] + in.
Y*M[4] + in.
Z*M[8] + M[12];
1090 out[1] = in.
X*M[1] + in.
Y*M[5] + in.
Z*M[9] + M[13];
1091 out[2] = in.
X*M[2] + in.
Y*M[6] + in.
Z*M[10] + M[14];
1092 out[3] = in.
X*M[3] + in.
Y*M[7] + in.
Z*M[11] + M[15];
1105 CMatrix4<T> transposedInverse(*
this, EM4CONST_INVERSE_TRANSPOSED);
1107 transposedInverse.transformVect(normal);
1117 transformPlane( out );
1124 #if defined ( USE_MATRIX_TEST )
1138 #if defined ( USE_MATRIX_TEST )
1149 Bmin[0] = Bmax[0] = M[12];
1150 Bmin[1] = Bmax[1] = M[13];
1151 Bmin[2] = Bmax[2] = M[14];
1155 for (
u32 i = 0; i < 3; ++i)
1157 for (
u32 j = 0; j < 3; ++j)
1159 const f32 a = m(j,i) * Amin[j];
1160 const f32 b = m(j,i) * Amax[j];
1202 matrix[0] = M[0]*mat[0] + M[4]*mat[1] + M[8]*mat[2] + M[12]*mat[3];
1203 matrix[1] = M[1]*mat[0] + M[5]*mat[1] + M[9]*mat[2] + M[13]*mat[3];
1204 matrix[2] = M[2]*mat[0] + M[6]*mat[1] + M[10]*mat[2] + M[14]*mat[3];
1205 matrix[3] = M[3]*mat[0] + M[7]*mat[1] + M[11]*mat[2] + M[15]*mat[3];
1211 vect.
X = vect.
X-M[12];
1212 vect.
Y = vect.
Y-M[13];
1213 vect.
Z = vect.
Z-M[14];
1219 vect.
X = vect.
X+M[12];
1220 vect.
Y = vect.
Y+M[13];
1221 vect.
Z = vect.
Z+M[14];
1232 #if defined ( USE_MATRIX_TEST )
1233 if ( this->isIdentity() )
1241 f32 d = (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0)) * (m(2, 2) * m(3, 3) - m(2, 3) * m(3, 2)) -
1242 (m(0, 0) * m(1, 2) - m(0, 2) * m(1, 0)) * (m(2, 1) * m(3, 3) - m(2, 3) * m(3, 1)) +
1243 (m(0, 0) * m(1, 3) - m(0, 3) * m(1, 0)) * (m(2, 1) * m(3, 2) - m(2, 2) * m(3, 1)) +
1244 (m(0, 1) * m(1, 2) - m(0, 2) * m(1, 1)) * (m(2, 0) * m(3, 3) - m(2, 3) * m(3, 0)) -
1245 (m(0, 1) * m(1, 3) - m(0, 3) * m(1, 1)) * (m(2, 0) * m(3, 2) - m(2, 2) * m(3, 0)) +
1246 (m(0, 2) * m(1, 3) - m(0, 3) * m(1, 2)) * (m(2, 0) * m(3, 1) - m(2, 1) * m(3, 0));
1253 out(0, 0) = d * (m(1, 1) * (m(2, 2) * m(3, 3) - m(2, 3) * m(3, 2)) +
1254 m(1, 2) * (m(2, 3) * m(3, 1) - m(2, 1) * m(3, 3)) +
1255 m(1, 3) * (m(2, 1) * m(3, 2) - m(2, 2) * m(3, 1)));
1256 out(0, 1) = d * (m(2, 1) * (m(0, 2) * m(3, 3) - m(0, 3) * m(3, 2)) +
1257 m(2, 2) * (m(0, 3) * m(3, 1) - m(0, 1) * m(3, 3)) +
1258 m(2, 3) * (m(0, 1) * m(3, 2) - m(0, 2) * m(3, 1)));
1259 out(0, 2) = d * (m(3, 1) * (m(0, 2) * m(1, 3) - m(0, 3) * m(1, 2)) +
1260 m(3, 2) * (m(0, 3) * m(1, 1) - m(0, 1) * m(1, 3)) +
1261 m(3, 3) * (m(0, 1) * m(1, 2) - m(0, 2) * m(1, 1)));
1262 out(0, 3) = d * (m(0, 1) * (m(1, 3) * m(2, 2) - m(1, 2) * m(2, 3)) +
1263 m(0, 2) * (m(1, 1) * m(2, 3) - m(1, 3) * m(2, 1)) +
1264 m(0, 3) * (m(1, 2) * m(2, 1) - m(1, 1) * m(2, 2)));
1265 out(1, 0) = d * (m(1, 2) * (m(2, 0) * m(3, 3) - m(2, 3) * m(3, 0)) +
1266 m(1, 3) * (m(2, 2) * m(3, 0) - m(2, 0) * m(3, 2)) +
1267 m(1, 0) * (m(2, 3) * m(3, 2) - m(2, 2) * m(3, 3)));
1268 out(1, 1) = d * (m(2, 2) * (m(0, 0) * m(3, 3) - m(0, 3) * m(3, 0)) +
1269 m(2, 3) * (m(0, 2) * m(3, 0) - m(0, 0) * m(3, 2)) +
1270 m(2, 0) * (m(0, 3) * m(3, 2) - m(0, 2) * m(3, 3)));
1271 out(1, 2) = d * (m(3, 2) * (m(0, 0) * m(1, 3) - m(0, 3) * m(1, 0)) +
1272 m(3, 3) * (m(0, 2) * m(1, 0) - m(0, 0) * m(1, 2)) +
1273 m(3, 0) * (m(0, 3) * m(1, 2) - m(0, 2) * m(1, 3)));
1274 out(1, 3) = d * (m(0, 2) * (m(1, 3) * m(2, 0) - m(1, 0) * m(2, 3)) +
1275 m(0, 3) * (m(1, 0) * m(2, 2) - m(1, 2) * m(2, 0)) +
1276 m(0, 0) * (m(1, 2) * m(2, 3) - m(1, 3) * m(2, 2)));
1277 out(2, 0) = d * (m(1, 3) * (m(2, 0) * m(3, 1) - m(2, 1) * m(3, 0)) +
1278 m(1, 0) * (m(2, 1) * m(3, 3) - m(2, 3) * m(3, 1)) +
1279 m(1, 1) * (m(2, 3) * m(3, 0) - m(2, 0) * m(3, 3)));
1280 out(2, 1) = d * (m(2, 3) * (m(0, 0) * m(3, 1) - m(0, 1) * m(3, 0)) +
1281 m(2, 0) * (m(0, 1) * m(3, 3) - m(0, 3) * m(3, 1)) +
1282 m(2, 1) * (m(0, 3) * m(3, 0) - m(0, 0) * m(3, 3)));
1283 out(2, 2) = d * (m(3, 3) * (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0)) +
1284 m(3, 0) * (m(0, 1) * m(1, 3) - m(0, 3) * m(1, 1)) +
1285 m(3, 1) * (m(0, 3) * m(1, 0) - m(0, 0) * m(1, 3)));
1286 out(2, 3) = d * (m(0, 3) * (m(1, 1) * m(2, 0) - m(1, 0) * m(2, 1)) +
1287 m(0, 0) * (m(1, 3) * m(2, 1) - m(1, 1) * m(2, 3)) +
1288 m(0, 1) * (m(1, 0) * m(2, 3) - m(1, 3) * m(2, 0)));
1289 out(3, 0) = d * (m(1, 0) * (m(2, 2) * m(3, 1) - m(2, 1) * m(3, 2)) +
1290 m(1, 1) * (m(2, 0) * m(3, 2) - m(2, 2) * m(3, 0)) +
1291 m(1, 2) * (m(2, 1) * m(3, 0) - m(2, 0) * m(3, 1)));
1292 out(3, 1) = d * (m(2, 0) * (m(0, 2) * m(3, 1) - m(0, 1) * m(3, 2)) +
1293 m(2, 1) * (m(0, 0) * m(3, 2) - m(0, 2) * m(3, 0)) +
1294 m(2, 2) * (m(0, 1) * m(3, 0) - m(0, 0) * m(3, 1)));
1295 out(3, 2) = d * (m(3, 0) * (m(0, 2) * m(1, 1) - m(0, 1) * m(1, 2)) +
1296 m(3, 1) * (m(0, 0) * m(1, 2) - m(0, 2) * m(1, 0)) +
1297 m(3, 2) * (m(0, 1) * m(1, 0) - m(0, 0) * m(1, 1)));
1298 out(3, 3) = d * (m(0, 0) * (m(1, 1) * m(2, 2) - m(1, 2) * m(2, 1)) +
1299 m(0, 1) * (m(1, 2) * m(2, 0) - m(1, 0) * m(2, 2)) +
1300 m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0)));
1302 #if defined ( USE_MATRIX_TEST )
1303 out.definitelyIdentityMatrix = definitelyIdentityMatrix;
1329 out.M[12] = (T)-(M[12]*M[0] + M[13]*M[1] + M[14]*M[2]);
1330 out.M[13] = (T)-(M[12]*M[4] + M[13]*M[5] + M[14]*M[6]);
1331 out.M[14] = (T)-(M[12]*M[8] + M[13]*M[9] + M[14]*M[10]);
1334 #if defined ( USE_MATRIX_TEST )
1335 out.definitelyIdentityMatrix = definitelyIdentityMatrix;
1345 #if defined ( USE_MATRIX_TEST )
1346 if (definitelyIdentityMatrix)
1351 if (getInverse(temp))
1366 memcpy(M, other.M, 16*
sizeof(T));
1367 #if defined ( USE_MATRIX_TEST )
1368 definitelyIdentityMatrix=other.definitelyIdentityMatrix;
1377 for (
s32 i = 0; i < 16; ++i)
1380 #if defined ( USE_MATRIX_TEST )
1381 definitelyIdentityMatrix=
false;
1390 #if defined ( USE_MATRIX_TEST )
1391 if (definitelyIdentityMatrix && other.definitelyIdentityMatrix)
1394 for (
s32 i = 0; i < 16; ++i)
1395 if (M[i] != other.M[i])
1405 return !(*
this == other);
1412 f32 fieldOfViewRadians,
f32 aspectRatio,
f32 zNear,
f32 zFar)
1416 const T w = h / aspectRatio;
1431 M[10] = (T)(zFar/(zNear-zFar));
1437 M[14] = (T)(zNear*zFar/(zNear-zFar));
1441 #if defined ( USE_MATRIX_TEST )
1442 definitelyIdentityMatrix=
false;
1451 f32 fieldOfViewRadians,
f32 aspectRatio,
f32 zNear,
f32 zFar)
1455 const T w = (T)(h / aspectRatio);
1470 M[10] = (T)(zFar/(zFar-zNear));
1475 M[14] = (T)(-zNear*zFar/(zFar-zNear));
1478 #if defined ( USE_MATRIX_TEST )
1479 definitelyIdentityMatrix=
false;
1488 f32 widthOfViewVolume,
f32 heightOfViewVolume,
f32 zNear,
f32 zFar)
1493 M[0] = (T)(2/widthOfViewVolume);
1499 M[5] = (T)(2/heightOfViewVolume);
1505 M[10] = (T)(1/(zFar-zNear));
1510 M[14] = (T)(zNear/(zNear-zFar));
1513 #if defined ( USE_MATRIX_TEST )
1514 definitelyIdentityMatrix=
false;
1523 f32 widthOfViewVolume,
f32 heightOfViewVolume,
f32 zNear,
f32 zFar)
1528 M[0] = (T)(2/widthOfViewVolume);
1534 M[5] = (T)(2/heightOfViewVolume);
1540 M[10] = (T)(1/(zNear-zFar));
1545 M[14] = (T)(zNear/(zNear-zFar));
1548 #if defined ( USE_MATRIX_TEST )
1549 definitelyIdentityMatrix=
false;
1558 f32 widthOfViewVolume,
f32 heightOfViewVolume,
f32 zNear,
f32 zFar)
1563 M[0] = (T)(2*zNear/widthOfViewVolume);
1569 M[5] = (T)(2*zNear/heightOfViewVolume);
1575 M[10] = (T)(zFar/(zNear-zFar));
1580 M[14] = (T)(zNear*zFar/(zNear-zFar));
1583 #if defined ( USE_MATRIX_TEST )
1584 definitelyIdentityMatrix=
false;
1593 f32 widthOfViewVolume,
f32 heightOfViewVolume,
f32 zNear,
f32 zFar)
1598 M[0] = (T)(2*zNear/widthOfViewVolume);
1604 M[5] = (T)(2*zNear/heightOfViewVolume);
1610 M[10] = (T)(zFar/(zFar-zNear));
1615 M[14] = (T)(zNear*zFar/(zNear-zFar));
1617 #if defined ( USE_MATRIX_TEST )
1618 definitelyIdentityMatrix=
false;
1631 M[ 0] = (T)(-plane.
Normal.
X * light.
X + d);
1632 M[ 1] = (T)(-plane.
Normal.
X * light.
Y);
1633 M[ 2] = (T)(-plane.
Normal.
X * light.
Z);
1634 M[ 3] = (T)(-plane.
Normal.
X * point);
1636 M[ 4] = (T)(-plane.
Normal.
Y * light.
X);
1637 M[ 5] = (T)(-plane.
Normal.
Y * light.
Y + d);
1638 M[ 6] = (T)(-plane.
Normal.
Y * light.
Z);
1639 M[ 7] = (T)(-plane.
Normal.
Y * point);
1641 M[ 8] = (T)(-plane.
Normal.
Z * light.
X);
1642 M[ 9] = (T)(-plane.
Normal.
Z * light.
Y);
1643 M[10] = (T)(-plane.
Normal.
Z * light.
Z + d);
1644 M[11] = (T)(-plane.
Normal.
Z * point);
1646 M[12] = (T)(-plane.
D * light.
X);
1647 M[13] = (T)(-plane.
D * light.
Y);
1648 M[14] = (T)(-plane.
D * light.
Z);
1649 M[15] = (T)(-plane.
D * point + d);
1650 #if defined ( USE_MATRIX_TEST )
1651 definitelyIdentityMatrix=
false;
1690 #if defined ( USE_MATRIX_TEST )
1691 definitelyIdentityMatrix=
false;
1731 #if defined ( USE_MATRIX_TEST )
1732 definitelyIdentityMatrix=
false;
1744 for (
u32 i=0; i < 16; i += 4)
1746 mat.M[i+0] = (T)(M[i+0] + ( b.M[i+0] - M[i+0] ) * time);
1747 mat.M[i+1] = (T)(M[i+1] + ( b.M[i+1] - M[i+1] ) * time);
1748 mat.M[i+2] = (T)(M[i+2] + ( b.M[i+2] - M[i+2] ) * time);
1749 mat.M[i+3] = (T)(M[i+3] + ( b.M[i+3] - M[i+3] ) * time);
1760 getTransposed ( t );
1788 #if defined ( USE_MATRIX_TEST )
1789 o.definitelyIdentityMatrix=definitelyIdentityMatrix;
1798 const f32 scaleX = (viewport.
getWidth() - 0.75f ) * 0.5f;
1799 const f32 scaleY = -(viewport.
getHeight() - 0.75f ) * 0.5f;
1837 M[0] = vt.
X * v.X + ca;
1838 M[5] = vt.
Y * v.Y + ca;
1839 M[10] = vt.
Z * v.Z + ca;
1903 M[0] = vt.
X * up.
X + ca;
1904 M[5] = vt.
Y * up.
Y + ca;
1905 M[10] = vt.
Z * up.
Z + ca;
1923 setRotationCenter ( center, translation );
1932 M[12] = -M[0]*center.
X - M[4]*center.
Y - M[8]*center.
Z + (center.
X - translation.
X );
1933 M[13] = -M[1]*center.
X - M[5]*center.
Y - M[9]*center.
Z + (center.
Y - translation.
Y );
1934 M[14] = -M[2]*center.
X - M[6]*center.
Y - M[10]*center.
Z + (center.
Z - translation.
Z );
1936 #if defined ( USE_MATRIX_TEST )
1937 definitelyIdentityMatrix=
false;
1959 const f32 c = cosf(rotateRad);
1960 const f32 s = sinf(rotateRad);
1962 M[0] = (T)(c * scale.
X);
1963 M[1] = (T)(s * scale.
Y);
1967 M[4] = (T)(-s * scale.
X);
1968 M[5] = (T)(c * scale.
Y);
1972 M[8] = (T)(c * scale.
X * rotatecenter.
X + -s * rotatecenter.
Y + translate.
X);
1973 M[9] = (T)(s * scale.
Y * rotatecenter.
X + c * rotatecenter.
Y + translate.
Y);
1981 #if defined ( USE_MATRIX_TEST )
1982 definitelyIdentityMatrix=
false;
1992 const f32 c = cosf(rotateRad);
1993 const f32 s = sinf(rotateRad);
2000 M[8] = (T)(0.5f * ( s - c) + 0.5f);
2001 M[9] = (T)(-0.5f * ( s + c) + 0.5f);
2003 #if defined ( USE_MATRIX_TEST )
2004 definitelyIdentityMatrix = definitelyIdentityMatrix && (rotateRad==0.0f);
2016 #if defined ( USE_MATRIX_TEST )
2017 definitelyIdentityMatrix = definitelyIdentityMatrix && (x==0.0f) && (y==0.0f);
2029 #if defined ( USE_MATRIX_TEST )
2030 definitelyIdentityMatrix = definitelyIdentityMatrix && (x==0.0f) && (y==0.0f) ;
2040 #if defined ( USE_MATRIX_TEST )
2041 definitelyIdentityMatrix = definitelyIdentityMatrix && (sx==1.0f) && (sy==1.0f);
2052 M[8] = (T)(0.5f - 0.5f * sx);
2053 M[9] = (T)(0.5f - 0.5f * sy);
2055 #if defined ( USE_MATRIX_TEST )
2056 definitelyIdentityMatrix = definitelyIdentityMatrix && (sx==1.0f) && (sy==1.0f);
2066 memcpy(M,data, 16*
sizeof(T));
2068 #if defined ( USE_MATRIX_TEST )
2069 definitelyIdentityMatrix=
false;
2079 #if defined ( USE_MATRIX_TEST )
2080 definitelyIdentityMatrix = isDefinitelyIdentityMatrix;
2089 #if defined ( USE_MATRIX_TEST )
2090 return definitelyIdentityMatrix;
2101 #if defined ( USE_MATRIX_TEST )
2102 if (definitelyIdentityMatrix && other.definitelyIdentityMatrix)
2105 for (
s32 i = 0; i < 16; ++i)