Changeset 4905


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

Apply matrix changes from double to float version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • nanovis/trunk/vrmath/Matrix4x4f.cpp

    r3628 r4905  
    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.