void Transformation::product(const Transformation& a,const Transformation& b) { if (a.isIdentity()) { *this = b; return; } if (b.isIdentity()) { *this = a; return; } if (a.isUniformScales()) { _rot = a.getRotate()*b.getRotate(); _trans = ((a.getRotate() * b.getTranslate()) + a.getTranslate()) * a.getUniformScale(); if ( b.isUniformScales()) setUniformScale(a.getUniformScale()*b.getUniformScale()); else setScale(b.getScale()*a.getUniformScale()); return; } // In all remaining cases, the matrix cannot be written as R*S*X+T. Matrix3 mA; Vector3 aS = a.getScale(); mA[0][0] = mA[0][0] * aS.x; mA[1][1] = mA[1][1] * aS.y; mA[2][2] = mA[2][2] * aS.z; Matrix3 mB; Vector3 bS = b.getScale(); mB[0][0] = mB[0][0] * bS.x; mB[1][1] = mB[1][1] * bS.y; mB[2][2] = mB[2][2] * bS.z; setRotate(mA*mB); setTranslate(mA*b.getTranslate()+a.getTranslate()); }
void Stream::write( const Transformation &t ) { write( t.getTranslate() ); write( t.getRotate() ); write( t.getScale() ); }