Ignore:
Timestamp:
Dec 22, 2014, 5:24:33 PM (5 years ago)
Author:
ldelgass
Message:

merge matrix classes from trunk

Location:
nanovis/branches/1.1/vrmath
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • nanovis/branches/1.1/vrmath/Matrix4x4d.cpp

    r4890 r4906  
    229229void Matrix4x4d::multiply(const Matrix4x4d& m1, const Matrix4x4d& m2)
    230230{
    231     double mat[16];
    232     const double *mat1 = m1._data;
    233     const double *mat2 = m2._data;
    234 
    235     // 1 row
    236     mat[0] = mat1[0] * mat2[0] + mat1[4] * mat2[1] +
    237              mat1[8] * mat2[2] + mat1[12] * mat2[3];
    238     mat[4] = mat1[0] * mat2[4] + mat1[4] * mat2[5] +
    239              mat1[8] * mat2[6] + mat1[12] * mat2[7];
    240     mat[8] = mat1[0] * mat2[8] + mat1[4] * mat2[9] +
    241              mat1[8] * mat2[10] + mat1[12] * mat2[11];
    242     mat[12] = mat1[0] * mat2[12] + mat1[4] * mat2[13] +
    243               mat1[8] * mat2[14] + mat1[12] * mat2[15];
    244 
    245     // 2 row
    246     mat[1] = mat1[1] * mat2[0] + mat1[5] * mat2[1] +
    247              mat1[9] * mat2[2] + mat1[13] * mat2[3];
    248     mat[5] = mat1[1] * mat2[4] + mat1[5] * mat2[5] +
    249              mat1[9] * mat2[6] + mat1[13] * mat2[7];
    250     mat[9] = mat1[1] * mat2[8] + mat1[5] * mat2[9] +
    251              mat1[9] * mat2[10] + mat1[13] * mat2[11];
    252     mat[13] = mat1[1] * mat2[12] + mat1[5] * mat2[13] +
    253               mat1[9] * mat2[14] + mat1[13] * mat2[15];
    254 
    255     // 3 row
    256     mat[2] = mat1[2] * mat2[0] + mat1[6] * mat2[1] +
    257              mat1[10] * mat2[2] + mat1[14] * mat2[3];
    258     mat[6] = mat1[2] * mat2[4] + mat1[6] * mat2[5] +
    259              mat1[10] * mat2[6] + mat1[14] * mat2[7];
    260     mat[10] = mat1[2] * mat2[8] + mat1[6] * mat2[9] +
    261               mat1[10] * mat2[10] + mat1[14] * mat2[11];
    262     mat[14] = mat1[2] * mat2[12] + mat1[6] * mat2[13] +
    263               mat1[10] * mat2[14] + mat1[14] * mat2[15];
    264 
    265     // 4 row
    266     mat[3] = mat1[3] * mat2[0] + mat1[7] * mat2[1] +
    267              mat1[11] * mat2[2] + mat1[15] * mat2[3];
    268     mat[7] = mat1[3] * mat2[4] + mat1[7] * mat2[5] +
    269              mat1[11] * mat2[6] + mat1[15] * mat2[7];
    270     mat[11] = mat1[3] * mat2[8] + mat1[7] * mat2[9] +
    271               mat1[11] * mat2[10] + mat1[15] * mat2[11];
    272     mat[15] = mat1[3] * mat2[12] + mat1[7] * mat2[13] +
    273               mat1[11] * mat2[14] + mat1[15] * mat2[15];
    274 
    275     // set matrix
    276     set(mat);
     231    if (&m1 == this && &m2 != this) {
     232        multiply(m2);
     233    } else if (&m1 != this && &m2 != this) {
     234        multiplyFast(m1, m2);
     235    } else {
     236        double mat[16];
     237        const double *mat1 = m1._data;
     238        const double *mat2 = m2._data;
     239
     240        // 1 row
     241        mat[0] = mat1[0] * mat2[0] + mat1[4] * mat2[1] +
     242            mat1[8] * mat2[2] + mat1[12] * mat2[3];
     243        mat[4] = mat1[0] * mat2[4] + mat1[4] * mat2[5] +
     244            mat1[8] * mat2[6] + mat1[12] * mat2[7];
     245        mat[8] = mat1[0] * mat2[8] + mat1[4] * mat2[9] +
     246            mat1[8] * mat2[10] + mat1[12] * mat2[11];
     247        mat[12] = mat1[0] * mat2[12] + mat1[4] * mat2[13] +
     248            mat1[8] * mat2[14] + mat1[12] * mat2[15];
     249
     250        // 2 row
     251        mat[1] = mat1[1] * mat2[0] + mat1[5] * mat2[1] +
     252            mat1[9] * mat2[2] + mat1[13] * mat2[3];
     253        mat[5] = mat1[1] * mat2[4] + mat1[5] * mat2[5] +
     254            mat1[9] * mat2[6] + mat1[13] * mat2[7];
     255        mat[9] = mat1[1] * mat2[8] + mat1[5] * mat2[9] +
     256            mat1[9] * mat2[10] + mat1[13] * mat2[11];
     257        mat[13] = mat1[1] * mat2[12] + mat1[5] * mat2[13] +
     258            mat1[9] * mat2[14] + mat1[13] * mat2[15];
     259
     260        // 3 row
     261        mat[2] = mat1[2] * mat2[0] + mat1[6] * mat2[1] +
     262            mat1[10] * mat2[2] + mat1[14] * mat2[3];
     263        mat[6] = mat1[2] * mat2[4] + mat1[6] * mat2[5] +
     264            mat1[10] * mat2[6] + mat1[14] * mat2[7];
     265        mat[10] = mat1[2] * mat2[8] + mat1[6] * mat2[9] +
     266            mat1[10] * mat2[10] + mat1[14] * mat2[11];
     267        mat[14] = mat1[2] * mat2[12] + mat1[6] * mat2[13] +
     268            mat1[10] * mat2[14] + mat1[14] * mat2[15];
     269
     270        // 4 row
     271        mat[3] = mat1[3] * mat2[0] + mat1[7] * mat2[1] +
     272            mat1[11] * mat2[2] + mat1[15] * mat2[3];
     273        mat[7] = mat1[3] * mat2[4] + mat1[7] * mat2[5] +
     274            mat1[11] * mat2[6] + mat1[15] * mat2[7];
     275        mat[11] = mat1[3] * mat2[8] + mat1[7] * mat2[9] +
     276            mat1[11] * mat2[10] + mat1[15] * mat2[11];
     277        mat[15] = mat1[3] * mat2[12] + mat1[7] * mat2[13] +
     278            mat1[11] * mat2[14] + mat1[15] * mat2[15];
     279
     280        // set matrix
     281        set(mat);
     282    }
    277283}
    278284
     
    499505void Matrix4x4d::invert(const Matrix4x4d& mat)
    500506{
    501     const double *data = mat._data;
    502 
    503     double det =
    504         data[12] * data[9] * data[6] * data[3]-
    505         data[8] * data[13] * data[6] * data[3]-
    506         data[12] * data[5] * data[10] * data[3]+
    507         data[4] * data[13] * data[10] * data[3]+
    508         data[8] * data[5] * data[14] * data[3]-
    509         data[4] * data[9] * data[14] * data[3]-
    510         data[12] * data[9] * data[2] * data[7]+
    511         data[8] * data[13] * data[2] * data[7]+
    512         data[12] * data[1] * data[10] * data[7]-
    513         data[0] * data[13] * data[10] * data[7]-
    514         data[8] * data[1] * data[14] * data[7]+
    515         data[0] * data[9] * data[14] * data[7]+
    516         data[12] * data[5] * data[2] * data[11]-
    517         data[4] * data[13] * data[2] * data[11]-
    518         data[12] * data[1] * data[6] * data[11]+
    519         data[0] * data[13] * data[6] * data[11]+
    520         data[4] * data[1] * data[14] * data[11]-
    521         data[0] * data[5] * data[14] * data[11]-
    522         data[8] * data[5] * data[2] * data[15]+
    523         data[4] * data[9] * data[2] * data[15]+
    524         data[8] * data[1] * data[6] * data[15]-
    525         data[0] * data[9] * data[6] * data[15]-
    526         data[4] * data[1] * data[10] * data[15]+
    527         data[0] * data[5] * data[10] * data[15];
    528 
    529     if ( det == 0.0 ) return;
    530     det = 1.0 / det;
    531 
    532     double dstData[16];
    533 
    534     dstData[0] = (data[9]*data[14]*data[7] -
    535                   data[13]*data[10]*data[7] +
    536                   data[13]*data[6]*data[11] -
    537                   data[5]*data[14]*data[11] -
    538                   data[9]*data[6]*data[15] +
    539                   data[5]*data[10]*data[15]) * det;
    540 
    541     dstData[4] = (data[12]*data[10]*data[7] -
    542                   data[8]*data[14]*data[7] -
    543                   data[12]*data[6]*data[11] +
    544                   data[4]*data[14]*data[11] +
    545                   data[8]*data[6]*data[15] -
    546                   data[4]*data[10]*data[15]) * det;
    547 
    548     dstData[8] = (data[8]*data[13]*data[7] -
    549                   data[12]*data[9]*data[7] +
    550                   data[12]*data[5]*data[11] -
    551                   data[4]*data[13]*data[11] -
    552                   data[8]*data[5]*data[15] +
    553                   data[4]*data[9]*data[15]) * det;
    554 
    555     dstData[12] = (data[12]*data[9]*data[6] -
    556                    data[8]*data[13]*data[6] -
    557                    data[12]*data[5]*data[10] +
    558                    data[4]*data[13]*data[10] +
    559                    data[8]*data[5]*data[14] -
    560                    data[4]*data[9]*data[14]) * det;
    561 
    562     dstData[1] = (data[13]*data[10]*data[3] -
    563                   data[9]*data[14]*data[3] -
    564                   data[13]*data[2]*data[11] +
    565                   data[1]*data[14]*data[11] +
    566                   data[9]*data[2]*data[15] -
    567                   data[1]*data[10]*data[15]) * det;
    568 
    569     dstData[5] = (data[8]*data[14]*data[3] -
    570                   data[12]*data[10]*data[3] +
    571                   data[12]*data[2]*data[11] -
    572                   data[0]*data[14]*data[11] -
    573                   data[8]*data[2]*data[15] +
    574                   data[0]*data[10]*data[15]) * det;
    575 
    576     dstData[9] = (data[12]*data[9]*data[3] -
    577                   data[8]*data[13]*data[3] -
    578                   data[12]*data[1]*data[11] +
    579                   data[0]*data[13]*data[11] +
    580                   data[8]*data[1]*data[15] -
    581                   data[0]*data[9]*data[15]) * det;
    582 
    583     dstData[13] = (data[8]*data[13]*data[2] -
    584                    data[12]*data[9]*data[2] +
    585                    data[12]*data[1]*data[10] -
    586                    data[0]*data[13]*data[10] -
    587                    data[8]*data[1]*data[14] +
    588                    data[0]*data[9]*data[14]) * det;
    589 
    590     dstData[2] = (data[5]*data[14]*data[3] -
    591                   data[13]*data[6]*data[3] +
    592                   data[13]*data[2]*data[7] -
    593                   data[1]*data[14]*data[7] -
    594                   data[5]*data[2]*data[15] +
    595                   data[1]*data[6]*data[15]) * det;
    596 
    597     dstData[6] = (data[12]*data[6]*data[3] -
    598                   data[4]*data[14]*data[3] -
    599                   data[12]*data[2]*data[7] +
    600                   data[0]*data[14]*data[7] +
    601                   data[4]*data[2]*data[15] -
    602                   data[0]*data[6]*data[15]) * det;
    603 
    604     dstData[10] = (data[4]*data[13]*data[3] -
    605                    data[12]*data[5]*data[3] +
    606                    data[12]*data[1]*data[7] -
    607                    data[0]*data[13]*data[7] -
    608                    data[4]*data[1]*data[15] +
    609                    data[0]*data[5]*data[15]) * det;
    610 
    611     dstData[14] = (data[12]*data[5]*data[2] -
    612                    data[4]*data[13]*data[2] -
    613                    data[12]*data[1]*data[6] +
    614                    data[0]*data[13]*data[6] +
    615                    data[4]*data[1]*data[14] -
    616                    data[0]*data[5]*data[14]) * det;
    617 
    618     dstData[3] = (data[9]*data[6]*data[3] -
    619                   data[5]*data[10]*data[3] -
    620                   data[9]*data[2]*data[7] +
    621                   data[1]*data[10]*data[7] +
    622                   data[5]*data[2]*data[11] -
    623                   data[1]*data[6]*data[11]) * det;
    624 
    625     dstData[7] = (data[4]*data[10]*data[3] -
    626                   data[8]*data[6]*data[3] +
    627                   data[8]*data[2]*data[7] -
    628                   data[0]*data[10]*data[7] -
    629                   data[4]*data[2]*data[11] +
    630                   data[0]*data[6]*data[11]) * det;
    631 
    632     dstData[11] = (data[8]*data[5]*data[3] -
    633                    data[4]*data[9]*data[3] -
    634                    data[8]*data[1]*data[7] +
    635                    data[0]*data[9]*data[7] +
    636                    data[4]*data[1]*data[11] -
    637                    data[0]*data[5]*data[11]) * det;
    638 
    639     dstData[15] = (data[4]*data[9]*data[2] -
    640                    data[8]*data[5]*data[2] +
    641                    data[8]*data[1]*data[6] -
    642                    data[0]*data[9]*data[6] -
    643                    data[4]*data[1]*data[10] +
    644                    data[0]*data[5]*data[10]) * det;
    645 
    646     set(dstData);
     507    if (&mat == this) {
     508        invert();
     509    } else {
     510        invertFast(mat);
     511    }
    647512}
    648513
     
    921786void Matrix4x4d::transpose(const Matrix4x4d& mat)
    922787{
    923     double m[16];
    924 
    925     m[0] = mat._data[0];
    926     m[1] = mat._data[4];
    927     m[2] = mat._data[8];
    928     m[3] = mat._data[12];
    929 
    930     m[4] = mat._data[1];
    931     m[5] = mat._data[5];
    932     m[6] = mat._data[9];
    933     m[7] = mat._data[13];
    934 
    935     m[8] = mat._data[2];
    936     m[9] = mat._data[6];
    937     m[10] = mat._data[10];
    938     m[11] = mat._data[14];
    939 
    940     m[12] = mat._data[3];
    941     m[13] = mat._data[7];
    942     m[14] = mat._data[11];
    943     m[15] = mat._data[15];
    944 
    945     set(m);
     788    if (&mat == this) {
     789        transpose();
     790    } else {
     791        transposeFast(mat);
     792    }
    946793}
    947794
  • nanovis/branches/1.1/vrmath/Matrix4x4f.cpp

    r4890 r4906  
    230230void Matrix4x4f::multiply(const Matrix4x4f& m1, const Matrix4x4f& m2)
    231231{
    232     float mat[16];
    233     const float *mat1 = m1._data;
    234     const float *mat2 = m2._data;
    235 
    236     // 1 row
    237     mat[0] = float(mat1[0] * mat2[0] + mat1[4] * mat2[1] +
    238                    mat1[8] * mat2[2] + mat1[12] * mat2[3]);
    239     mat[4] = float(mat1[0] * mat2[4] + mat1[4] * mat2[5] +
    240                    mat1[8] * mat2[6] + mat1[12] * mat2[7]);
    241     mat[8] = float(mat1[0] * mat2[8] + mat1[4] * mat2[9] +
    242                    mat1[8] * mat2[10] + mat1[12] * mat2[11]);
    243     mat[12] = float(mat1[0] * mat2[12] + mat1[4] * mat2[13] +
    244                     mat1[8] * mat2[14] + mat1[12] * mat2[15]);
    245 
    246     // 2 row
    247     mat[1] = float(mat1[1] * mat2[0] + mat1[5] * mat2[1] +
    248                    mat1[9] * mat2[2] + mat1[13] * mat2[3]);
    249     mat[5] = float(mat1[1] * mat2[4] + mat1[5] * mat2[5] +
    250                    mat1[9] * mat2[6] + mat1[13] * mat2[7]);
    251     mat[9] = float(mat1[1] * mat2[8] + mat1[5] * mat2[9] +
    252                    mat1[9] * mat2[10] + mat1[13] * mat2[11]);
    253     mat[13] = float(mat1[1] * mat2[12] + mat1[5] * mat2[13] +
    254                     mat1[9] * mat2[14] + mat1[13] * mat2[15]);
    255 
    256     // 3 row
    257     mat[2] = float(mat1[2] * mat2[0] + mat1[6] * mat2[1] +
    258                    mat1[10] * mat2[2] + mat1[14] * mat2[3]);
    259     mat[6] = float(mat1[2] * mat2[4] + mat1[6] * mat2[5] +
    260                    mat1[10] * mat2[6] + mat1[14] * mat2[7]);
    261     mat[10] = float(mat1[2] * mat2[8] + mat1[6] * mat2[9] +
    262                     mat1[10] * mat2[10] + mat1[14] * mat2[11]);
    263     mat[14] = float(mat1[2] * mat2[12] + mat1[6] * mat2[13] +
    264                     mat1[10] * mat2[14] + mat1[14] * mat2[15]);
    265 
    266     // 4 row
    267     mat[3] = float(mat1[3] * mat2[0] + mat1[7] * mat2[1] +
    268                    mat1[11] * mat2[2] + mat1[15] * mat2[3]);
    269     mat[7] = float(mat1[3] * mat2[4] + mat1[7] * mat2[5] +
    270                    mat1[11] * mat2[6] + mat1[15] * mat2[7]);
    271     mat[11] = float(mat1[3] * mat2[8] + mat1[7] * mat2[9] +
    272                     mat1[11] * mat2[10] + mat1[15] * mat2[11]);
    273     mat[15] = float(mat1[3] * mat2[12] + mat1[7] * mat2[13] +
    274                     mat1[11] * mat2[14] + mat1[15] * mat2[15]);
    275 
    276     // set matrix
    277     set(mat);
     232    if (&m1 == this && &m2 != this) {
     233        multiply(m2);
     234    } else if (&m1 != this && &m2 != this) {
     235        multiplyFast(m1, m2);
     236    } else {
     237        float mat[16];
     238        const float *mat1 = m1._data;
     239        const float *mat2 = m2._data;
     240
     241        // 1 row
     242        mat[0] = float(mat1[0] * mat2[0] + mat1[4] * mat2[1] +
     243                       mat1[8] * mat2[2] + mat1[12] * mat2[3]);
     244        mat[4] = float(mat1[0] * mat2[4] + mat1[4] * mat2[5] +
     245                       mat1[8] * mat2[6] + mat1[12] * mat2[7]);
     246        mat[8] = float(mat1[0] * mat2[8] + mat1[4] * mat2[9] +
     247                       mat1[8] * mat2[10] + mat1[12] * mat2[11]);
     248        mat[12] = float(mat1[0] * mat2[12] + mat1[4] * mat2[13] +
     249                        mat1[8] * mat2[14] + mat1[12] * mat2[15]);
     250
     251        // 2 row
     252        mat[1] = float(mat1[1] * mat2[0] + mat1[5] * mat2[1] +
     253                       mat1[9] * mat2[2] + mat1[13] * mat2[3]);
     254        mat[5] = float(mat1[1] * mat2[4] + mat1[5] * mat2[5] +
     255                       mat1[9] * mat2[6] + mat1[13] * mat2[7]);
     256        mat[9] = float(mat1[1] * mat2[8] + mat1[5] * mat2[9] +
     257                       mat1[9] * mat2[10] + mat1[13] * mat2[11]);
     258        mat[13] = float(mat1[1] * mat2[12] + mat1[5] * mat2[13] +
     259                        mat1[9] * mat2[14] + mat1[13] * mat2[15]);
     260
     261        // 3 row
     262        mat[2] = float(mat1[2] * mat2[0] + mat1[6] * mat2[1] +
     263                       mat1[10] * mat2[2] + mat1[14] * mat2[3]);
     264        mat[6] = float(mat1[2] * mat2[4] + mat1[6] * mat2[5] +
     265                       mat1[10] * mat2[6] + mat1[14] * mat2[7]);
     266        mat[10] = float(mat1[2] * mat2[8] + mat1[6] * mat2[9] +
     267                        mat1[10] * mat2[10] + mat1[14] * mat2[11]);
     268        mat[14] = float(mat1[2] * mat2[12] + mat1[6] * mat2[13] +
     269                        mat1[10] * mat2[14] + mat1[14] * mat2[15]);
     270
     271        // 4 row
     272        mat[3] = float(mat1[3] * mat2[0] + mat1[7] * mat2[1] +
     273                       mat1[11] * mat2[2] + mat1[15] * mat2[3]);
     274        mat[7] = float(mat1[3] * mat2[4] + mat1[7] * mat2[5] +
     275                       mat1[11] * mat2[6] + mat1[15] * mat2[7]);
     276        mat[11] = float(mat1[3] * mat2[8] + mat1[7] * mat2[9] +
     277                        mat1[11] * mat2[10] + mat1[15] * mat2[11]);
     278        mat[15] = float(mat1[3] * mat2[12] + mat1[7] * mat2[13] +
     279                        mat1[11] * mat2[14] + mat1[15] * mat2[15]);
     280
     281        // set matrix
     282        set(mat);
     283    }
    278284}
    279285
     
    500506void Matrix4x4f::invert(const Matrix4x4f& mat)
    501507{
    502     float *data = (float *)mat._data;
    503 
    504     float det =
    505         data[12] * data[9] * data[6] * data[3]-
    506         data[8] * data[13] * data[6] * data[3]-
    507         data[12] * data[5] * data[10] * data[3]+
    508         data[4] * data[13] * data[10] * data[3]+
    509         data[8] * data[5] * data[14] * data[3]-
    510         data[4] * data[9] * data[14] * data[3]-
    511         data[12] * data[9] * data[2] * data[7]+
    512         data[8] * data[13] * data[2] * data[7]+
    513         data[12] * data[1] * data[10] * data[7]-
    514         data[0] * data[13] * data[10] * data[7]-
    515         data[8] * data[1] * data[14] * data[7]+
    516         data[0] * data[9] * data[14] * data[7]+
    517         data[12] * data[5] * data[2] * data[11]-
    518         data[4] * data[13] * data[2] * data[11]-
    519         data[12] * data[1] * data[6] * data[11]+
    520         data[0] * data[13] * data[6] * data[11]+
    521         data[4] * data[1] * data[14] * data[11]-
    522         data[0] * data[5] * data[14] * data[11]-
    523         data[8] * data[5] * data[2] * data[15]+
    524         data[4] * data[9] * data[2] * data[15]+
    525         data[8] * data[1] * data[6] * data[15]-
    526         data[0] * data[9] * data[6] * data[15]-
    527         data[4] * data[1] * data[10] * data[15]+
    528         data[0] * data[5] * data[10] * data[15];
    529 
    530     if ( det == 0.0f ) return;
    531     det = 1 / det;
    532 
    533     float dstData[16];
    534 
    535     dstData[0] = (data[9]*data[14]*data[7] -
    536                   data[13]*data[10]*data[7] +
    537                   data[13]*data[6]*data[11] -
    538                   data[5]*data[14]*data[11] -
    539                   data[9]*data[6]*data[15] +
    540                   data[5]*data[10]*data[15]) * det;
    541 
    542     dstData[4] = (data[12]*data[10]*data[7] -
    543                   data[8]*data[14]*data[7] -
    544                   data[12]*data[6]*data[11] +
    545                   data[4]*data[14]*data[11] +
    546                   data[8]*data[6]*data[15] -
    547                   data[4]*data[10]*data[15]) * det;
    548 
    549     dstData[8] = (data[8]*data[13]*data[7] -
    550                   data[12]*data[9]*data[7] +
    551                   data[12]*data[5]*data[11] -
    552                   data[4]*data[13]*data[11] -
    553                   data[8]*data[5]*data[15] +
    554                   data[4]*data[9]*data[15]) * det;
    555 
    556     dstData[12] = (data[12]*data[9]*data[6] -
    557                    data[8]*data[13]*data[6] -
    558                    data[12]*data[5]*data[10] +
    559                    data[4]*data[13]*data[10] +
    560                    data[8]*data[5]*data[14] -
    561                    data[4]*data[9]*data[14]) * det;
    562 
    563     dstData[1] = (data[13]*data[10]*data[3] -
    564                   data[9]*data[14]*data[3] -
    565                   data[13]*data[2]*data[11] +
    566                   data[1]*data[14]*data[11] +
    567                   data[9]*data[2]*data[15] -
    568                   data[1]*data[10]*data[15]) * det;
    569 
    570     dstData[5] = (data[8]*data[14]*data[3] -
    571                   data[12]*data[10]*data[3] +
    572                   data[12]*data[2]*data[11] -
    573                   data[0]*data[14]*data[11] -
    574                   data[8]*data[2]*data[15] +
    575                   data[0]*data[10]*data[15]) * det;
    576 
    577     dstData[9] = (data[12]*data[9]*data[3] -
    578                   data[8]*data[13]*data[3] -
    579                   data[12]*data[1]*data[11] +
    580                   data[0]*data[13]*data[11] +
    581                   data[8]*data[1]*data[15] -
    582                   data[0]*data[9]*data[15]) * det;
    583 
    584     dstData[13] = (data[8]*data[13]*data[2] -
    585                    data[12]*data[9]*data[2] +
    586                    data[12]*data[1]*data[10] -
    587                    data[0]*data[13]*data[10] -
    588                    data[8]*data[1]*data[14] +
    589                    data[0]*data[9]*data[14]) * det;
    590 
    591     dstData[2] = (data[5]*data[14]*data[3] -
    592                   data[13]*data[6]*data[3] +
    593                   data[13]*data[2]*data[7] -
    594                   data[1]*data[14]*data[7] -
    595                   data[5]*data[2]*data[15] +
    596                   data[1]*data[6]*data[15]) * det;
    597 
    598     dstData[6] = (data[12]*data[6]*data[3] -
    599                   data[4]*data[14]*data[3] -
    600                   data[12]*data[2]*data[7] +
    601                   data[0]*data[14]*data[7] +
    602                   data[4]*data[2]*data[15] -
    603                   data[0]*data[6]*data[15]) * det;
    604 
    605     dstData[10] = (data[4]*data[13]*data[3] -
    606                    data[12]*data[5]*data[3] +
    607                    data[12]*data[1]*data[7] -
    608                    data[0]*data[13]*data[7] -
    609                    data[4]*data[1]*data[15] +
    610                    data[0]*data[5]*data[15]) * det;
    611 
    612     dstData[14] = (data[12]*data[5]*data[2] -
    613                    data[4]*data[13]*data[2] -
    614                    data[12]*data[1]*data[6] +
    615                    data[0]*data[13]*data[6] +
    616                    data[4]*data[1]*data[14] -
    617                    data[0]*data[5]*data[14]) * det;
    618 
    619     dstData[3] = (data[9]*data[6]*data[3] -
    620                   data[5]*data[10]*data[3] -
    621                   data[9]*data[2]*data[7] +
    622                   data[1]*data[10]*data[7] +
    623                   data[5]*data[2]*data[11] -
    624                   data[1]*data[6]*data[11]) * det;
    625 
    626     dstData[7] = (data[4]*data[10]*data[3] -
    627                   data[8]*data[6]*data[3] +
    628                   data[8]*data[2]*data[7] -
    629                   data[0]*data[10]*data[7] -
    630                   data[4]*data[2]*data[11] +
    631                   data[0]*data[6]*data[11]) * det;
    632 
    633     dstData[11] = (data[8]*data[5]*data[3] -
    634                    data[4]*data[9]*data[3] -
    635                    data[8]*data[1]*data[7] +
    636                    data[0]*data[9]*data[7] +
    637                    data[4]*data[1]*data[11] -
    638                    data[0]*data[5]*data[11]) * det;
    639 
    640     dstData[15] = (data[4]*data[9]*data[2] -
    641                    data[8]*data[5]*data[2] +
    642                    data[8]*data[1]*data[6] -
    643                    data[0]*data[9]*data[6] -
    644                    data[4]*data[1]*data[10] +
    645                    data[0]*data[5]*data[10]) * det;
    646 
    647     set(dstData);
     508    if (&mat == this) {
     509        invert();
     510    } else {
     511        invertFast(mat);
     512    }
    648513}
    649514
     
    846711void Matrix4x4f::transpose(const Matrix4x4f& mat)
    847712{
    848     float m[16];
    849 
    850     m[0] = mat._data[0];
    851     m[1] = mat._data[4];
    852     m[2] = mat._data[8];
    853     m[3] = mat._data[12];
    854 
    855     m[4] = mat._data[1];
    856     m[5] = mat._data[5];
    857     m[6] = mat._data[9];
    858     m[7] = mat._data[13];
    859 
    860     m[8] = mat._data[2];
    861     m[9] = mat._data[6];
    862     m[10] = mat._data[10];
    863     m[11] = mat._data[14];
    864 
    865     m[12] = mat._data[3];
    866     m[13] = mat._data[7];
    867     m[14] = mat._data[11];
    868     m[15] = mat._data[15];
    869 
    870     set(m);
     713    if (&mat == this) {
     714        transpose();
     715    } else {
     716        transposeFast(mat);
     717    }
    871718}
    872719
Note: See TracChangeset for help on using the changeset viewer.