| 648 | } |
| 649 | |
| 650 | bool Mat4::inverse() |
| 651 | { |
| 652 | float a0 = m[0] * m[5] - m[1] * m[4]; |
| 653 | float a1 = m[0] * m[6] - m[2] * m[4]; |
| 654 | float a2 = m[0] * m[7] - m[3] * m[4]; |
| 655 | float a3 = m[1] * m[6] - m[2] * m[5]; |
| 656 | float a4 = m[1] * m[7] - m[3] * m[5]; |
| 657 | float a5 = m[2] * m[7] - m[3] * m[6]; |
| 658 | float b0 = m[8] * m[13] - m[9] * m[12]; |
| 659 | float b1 = m[8] * m[14] - m[10] * m[12]; |
| 660 | float b2 = m[8] * m[15] - m[11] * m[12]; |
| 661 | float b3 = m[9] * m[14] - m[10] * m[13]; |
| 662 | float b4 = m[9] * m[15] - m[11] * m[13]; |
| 663 | float b5 = m[10] * m[15] - m[11] * m[14]; |
| 664 | |
| 665 | // Calculate the determinant. |
| 666 | float det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0; |
| 667 | |
| 668 | // Close to zero, can't invert. |
| 669 | if (std::abs(det) <= MATH_TOLERANCE) |
| 670 | return false; |
| 671 | |
| 672 | // Support the case where m == dst. |
| 673 | Mat4 inverse; |
| 674 | inverse.m[0] = m[5] * b5 - m[6] * b4 + m[7] * b3; |
| 675 | inverse.m[1] = -m[1] * b5 + m[2] * b4 - m[3] * b3; |
| 676 | inverse.m[2] = m[13] * a5 - m[14] * a4 + m[15] * a3; |
| 677 | inverse.m[3] = -m[9] * a5 + m[10] * a4 - m[11] * a3; |
| 678 | |
| 679 | inverse.m[4] = -m[4] * b5 + m[6] * b2 - m[7] * b1; |
| 680 | inverse.m[5] = m[0] * b5 - m[2] * b2 + m[3] * b1; |
| 681 | inverse.m[6] = -m[12] * a5 + m[14] * a2 - m[15] * a1; |
| 682 | inverse.m[7] = m[8] * a5 - m[10] * a2 + m[11] * a1; |
| 683 | |
| 684 | inverse.m[8] = m[4] * b4 - m[5] * b2 + m[7] * b0; |
| 685 | inverse.m[9] = -m[0] * b4 + m[1] * b2 - m[3] * b0; |
| 686 | inverse.m[10] = m[12] * a4 - m[13] * a2 + m[15] * a0; |
| 687 | inverse.m[11] = -m[8] * a4 + m[9] * a2 - m[11] * a0; |
| 688 | |
| 689 | inverse.m[12] = -m[4] * b3 + m[5] * b1 - m[6] * b0; |
| 690 | inverse.m[13] = m[0] * b3 - m[1] * b1 + m[2] * b0; |
| 691 | inverse.m[14] = -m[12] * a3 + m[13] * a1 - m[14] * a0; |
| 692 | inverse.m[15] = m[8] * a3 - m[9] * a1 + m[10] * a0; |
| 693 | |
| 694 | multiply(inverse, 1.0f / det, this); |
| 695 | |
| 696 | return true; |
| 697 | } |
| 698 | |
| 699 | bool Mat4::isIdentity() const |
| 700 | { |
no test coverage detected