- if(flags==IDENTITY)
- return other;
- else if(other.flags==IDENTITY)
- return *this;
- else if(flags==TRANSLATE && !(other.flags&ARBITARY))
- {
- Matrix result = other;
- result.matrix[12] += matrix[12];
- result.matrix[13] += matrix[13];
- result.matrix[14] += matrix[14];
- result.flags |= flags;
- return result;
- }
- else if(!(flags&ARBITARY) && other.flags==TRANSLATE)
- {
- Matrix result = *this;
- const double *m = other.matrix;
- result.matrix[12] += matrix[0]*m[12]+matrix[4]*m[13]+matrix[8]*m[14];
- result.matrix[13] += matrix[1]*m[12]+matrix[5]*m[13]+matrix[9]*m[14];
- result.matrix[14] += matrix[2]*m[12]+matrix[6]*m[13]+matrix[10]*m[14];
- result.flags |= other.flags;
- return result;
- }
- else
- {
- Matrix result;
- fill(result.matrix, result.matrix+16, 0.0);
- for(unsigned i=0; i<4; ++i)
- for(unsigned j=0; j<4; ++j)
- for(unsigned k=0; k<4; ++k)
- result.matrix[i+j*4] += matrix[i+k*4]*other.matrix[k+j*4];
- result.flags = flags|other.flags;
- return result;
- }