rem: m1.transform(v1, v2); m1.transform(p1, p2);
add: m1.mult(v1, v2); m1.mult(p1, p2);
context: void matrixTest(void){    Vec3f pVec3Array[4];    pVec3Array[0].setValues(11., 12., 13.);    pVec3Array[1].setValues(21., 22., 23.);    pVec3Array[2].setValues(31., 32., 33.);    pVec3Array[3].setValues(41., 42., 43.);    Vec4f pVec4Array[4];    UInt32 i;    pVec4Array[0].setValues(11., 12., 13., 14.);    pVec4Array[1].setValues(21., 22., 23., 24.);    pVec4Array[2].setValues(31., 32., 33., 34.);    pVec4Array[3].setValues(41., 42., 43., 44.);    Real32 pValArray[16] = { 11., 21., 31., 41.,                                12., 22., 32., 42.,                                13., 23., 33., 43.,                                14., 24., 34., 44.};    Real32 pValArrayT[16] = { 11., 12., 13., 14.,                                 21., 22., 23., 24.,                                 31., 32., 33., 34.,                                 41., 42., 34., 44.};    Vec3f v1(11., 12., 13.);    Vec3f v2(21., 22., 23.);    Vec3f v3(31., 32., 33.);    Vec3f v4(41., 42., 43.);    Quaternion q1;    Quaternion q2;    Quaternion q3;    Matrix m1;    Matrix m2(v1, v2, v3);    Matrix m3(v1, v2, v3, v4);    Matrix m4(m3);    Matrix m5(11., 21., 31., 41.,                 12., 22., 32., 42,                 13., 23., 33., 43.,                 14., 24., 34., 44.);    Pnt3f p1(1., 0., 0.);    Pnt3f p2;    Matrix m6;    Matrix m7;    Matrix m8;    Matrix m9;    cout << endl << "Matrix math test " << endl;    cout << endl << "========================================" << endl << endl;    cout << "Identity               : " << endl         << Matrix::identity()   << endl;    cout << endl << "========================================" << endl << endl;    cout << "Default constructor    : " << endl << m1 << endl;    cout << "3 vector3f constructor : " << endl << m2 << endl;    cout << "4 vector3f constructor : " << endl << m3 << endl;    cout << "Copy consructor        : " << endl << m4 << endl;    cout << "16f values construtor  : " << endl << m5 << endl;    cout << endl << "========================================" << endl << endl;    m1.setValue(v4, v3, v2);    m2.setIdentity();    m2.setValue(v1, v2, v3, v4);    m3.setIdentity();    m3.setValue(11., 21., 31., 41.,                12., 22,  32., 42.,                13., 23., 33., 43.,                14., 24., 34., 44.);    m4.setIdentity();    m4.setValue(m3);    m5.setValue(pValArrayT);    m8.setValue(pValArray, false);    m6.setValue(pVec4Array);//    m7.setValue(pVec3Array);    cout << "Set      matrix  : " << endl << m4 << endl;    cout << "Set 3 3f vectors : " << endl << m1 << endl;    cout << "Set 4 3f vectors : " << endl << m2 << endl;    cout << "Set 16 f values  : " << endl << m3 << endl;    cout << "Set valT array   : " << endl << m5 << endl;    cout << "Set val array    : " << endl << m8 << endl;    cout << "Set vec4 array   : " << endl << m6 << endl;    cout << "Set vec3 array   : " << endl << m7 << endl;    cout << endl << "========================================" << endl << endl;    cout << "Get Values : " << endl;    for(i = 0; i < 4; i++)    {        for(UInt32 j = 0; j < 4; j++)        {            fprintf(stderr, "% 5.3f ", (m5.getValues())[j * 4 + i]);        }        fprintf(stderr, "\n");    }    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m1.setScale(10.);    m2.setIdentity();    m2.setScale(v3);    m3.setIdentity();    m3.setTranslate(v4);    m4.setIdentity();    m4.setTranslate(41., 42., 43.);    cout << "Set scale val       : " << endl << m1 << endl;    cout << "Set scale vec3f     : " << endl << m2 << endl;    cout << "Set translate val   : " << endl << m4 << endl;    cout << "Set translate vec3f : " << endl << m3 << endl;    cout << endl << "========================================" << endl << endl;    q1.setValueAsAxisDeg(1., 0., 0., 60.);    q2.setValueAsAxisDeg(0., 1., 0., 60.);    q3.setValueAsAxisDeg(0., 0., 1., 60.);    m1.setRotate(q1);    m2.setRotate(q2);    m3.setRotate(q3);    cout << "Set rotate X/60     : " << endl << m1 << endl;    cout << "Set rotate Y/60     : " << endl << m2 << endl;    cout << "Set rotate Z/60     : " << endl << m3 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m1.setTranslate(41., 42., 43);    cout << m1 << endl;    m2.setIdentity();    m2.setRotate(q1);    m1.mult(m2);    cout << "mult trans * rot : " << endl << m1 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m1.setTranslate(41., 42., 43);    m2.setIdentity();    m2.setRotate(q1);    m1.multLeft(m2);    cout << "multLeft rot * trans : " << endl << m1 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m1.setTranslate(41., 42., 43);    m2.setIdentity();    m2.setRotate(q1);    m1.mult(m2);    m4 = m1;    cout << m1.inverse(m3) << endl;    cout << "Inverse trans * rot : " << endl << m3 << endl;    cout << m3.invertFrom(m1) << endl;    cout << "InverseFrom trans * rot : " << endl << m3 << endl;    m3 = m1;    cout << m3.invert();    cout << "Invert trans * rot : " << endl << m3 << endl;    m4.mult(m3);    cout << "Invert m-1 * m : " << endl << m4 << endl;    m4 = m1;    m3.mult(m4);    cout << "Invert m * m-1 : " << endl << m3 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m1.setTranslate(41., 42., 43);    m2.setIdentity();    m2.setRotate(q1);    m1.mult(m2);    m4 = m1;    cout << m1.inverse3(m3) << endl;    cout << "Inverse trans * rot : " << endl << m3 << endl;    cout << m3.invertFrom3(m1) << endl;    cout << "InverseFrom trans * rot : " << endl << m3 << endl;    m3 = m1;    cout << m3.invert3() << endl;    cout << "Invert trans * rot : " << endl << m3 << endl;    m4.mult(m3);    cout << "Invert m * m-1 : " << endl << m4 << endl;    m4 = m1;    m3.mult(m4);    cout << "Invert m-1 * m : " << endl << m3 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m1.setTranslate(41., 42., 43);    m2.setIdentity();    m2.setRotate(q1);    m1.mult(m2);    v1.setValues(0., 0., 1.);    p1.setValues(0., 1., 0.);    m1.transform(v1, v2);    m1.transform(p1, p2);    cout << "Transform P : " << endl << p2 << endl;    cout << "Transform V : " << endl << v2 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m2.setIdentity();    m3.setIdentity();    v1.setValues(41., 42., 43);    q1.setValueAsAxisDeg(1., 0., 1., 60.);    v2.setValues(5., 6., 7.);    m1.setTranslate(v1);    m2.setRotate(q1);    m3.setScale(v2);    m4 = m1;    m4.mult(m2);    m4.mult(m3);    m5.setTransform(v1);    m5.setTransform(q1);    m5.setTransform(v1, q1);    m5.setTransform(v1, q1, v2);    cout << "Set Transform t*r*s : " << endl << m4 << endl;    cout << "Set Transform trs   : " << endl << m5 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m2.setIdentity();    m3.setIdentity();    m4.setIdentity();    m5.setIdentity();    m6.setIdentity();    m7.setIdentity();    v1.setValues(41., 42., 43);    q1.setValueAsAxisDeg(1., 0., 1., 60.);    v2.setValues(10., 10., 10.);    q2.setValueAsAxisDeg(0., 1., 0., 90.);    v3.setValues(11., 12., 13.);    m1.setTranslate(v1);    m2.setRotate(q1);    m3.setScale(v2);    m4.setRotate(q2);    m5.invertFrom(m4);//    m6.setTranslate(v3);//    m7.invertFrom(m6);    m8 = m1;    m8.mult(m6); // Center    m8.mult(m2); // R    m8.mult(m4); // SO    m8.mult(m3); // S    m8.mult(m5); // -SO    m8.mult(m7); // -Center    m9.setTransform(v1, q1, v2, q2);    cout << "Set Transform t*r*s*so : " << endl << m8 << endl;    cout << "Set Transform t r s so : " << endl << m9 << endl;    cout << endl << "========================================" << endl << endl;    m1.setIdentity();    m2.setIdentity();    m3.setIdentity();    m4.setIdentity();    m5.setIdentity();    m6.setIdentity();    m7.setIdentity();    v1.setValues(41., 42., 43);    q1.setValueAsAxisDeg(1., 0., 1., 60.);    v2.setValues(11., 12., 13.);    q2.setValueAsAxisDeg(0., 1., 0., 90.);    v3.setValues(11., 12., 13.);    m1.setTranslate(v1);    m2.setRotate(q1);    m3.setScale(v2);    m4.setRotate(q2);    m5.invertFrom(m4);    m6.setTranslate(v3);    m7.invertFrom(m6);    m8 = m1;    m8.mult(m6); // Center    m8.mult(m2); // R    m8.mult(m4); // SO    m8.mult(m3); // S    m8.mult(m5); // -SO    m8.mult(m7); // -Center    m9.setTransform(v1, q1, v2, q2, v3);    cout << "Set Transform t*r*s*so*c : " << endl << m8 << endl;    cout << "Set Transform t r s so c : " << endl << m9 << endl;}