Matrix::Matrix() { SetIdentity(); }
Matrix& Matrix::SetInverse(const Matrix& mStart) { const int size = 4; bool bSwap = false; Matrix m(mStart); SetIdentity(); for (int row = 0; row < size; row++) { // // pick the largest row in the rowth column // float max = abs(m.m_m[row][row]); int rowMax = row; for (int rowIndex = row + 1; rowIndex < size; rowIndex++) { if (abs(m.m_m[rowIndex][row]) > max) { max = abs(m.m_m[rowIndex][row]); rowMax = rowIndex; } } // // swap this row with the largest row // if (rowMax != row) { // // swap rows // bSwap = true; for (int col = 0; col < size; col++) { Swap(m.m_m[row][col], m.m_m[rowMax][col]); Swap( m_m[row][col], m_m[rowMax][col]); } } // // scale to get a one in the diagonal // float scale = m.m_m[row][row]; if (scale != 1.0f) { float rscale = 1.0f / scale; int col; m.m_m[row][row] = 1; for (col = row + 1; col < size; col++) { m.m_m[row][col] *= rscale; } if (bSwap) { for (col = 0; col < size; col++) { m_m[row][col] *= rscale; } } else { m_m[row][row] = rscale; for (col = 0; col < row; col++) { m_m[row][col] *= rscale; } } } // // get zeros in the rowth column of each row // by subtracting a multiple of row from row2 // for (int row2 = 0; row2 < size; row2++) { if (row2 != row) { float scale = m.m_m[row2][row]; if (scale != 0) { int col; m.m_m[row2][row] = 0; for (col = row + 1; col < size; col++) { m.m_m[row2][col] -= scale * m.m_m[row][col]; } if (bSwap) { for (col = 0; col < size; col++) { m_m[row2][col] -= scale * m_m[row][col]; } } else { for (col = 0; col <= row; col++) { m_m[row2][col] -= scale * m_m[row][col]; } } } } } } m_type = TransformUnknown; return *this; }