summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Matrix.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2024-01-26 19:13:38 +0100
committerGitHub <noreply@github.com>2024-01-26 19:13:38 +0100
commitb0491c2ce8213638ca1e2698a00c3405f30197bb (patch)
treef3a6c546a65930545a4f8a9621c79c282c19a03e /Source/Core/Common/Matrix.cpp
parentb09b59c1252fc995b15ffd21e9e45a5f90ba43e0 (diff)
parentb37f096f4bf8a14613d0b3668c41af456c1b94c8 (diff)
Merge pull request #12529 from iwubcode/math_determinant
Common: add determinant functions to Matrix33 and Matrix44
Diffstat (limited to 'Source/Core/Common/Matrix.cpp')
-rw-r--r--Source/Core/Common/Matrix.cpp28
1 files changed, 23 insertions, 5 deletions
diff --git a/Source/Core/Common/Matrix.cpp b/Source/Core/Common/Matrix.cpp
index 57be1a3cc4..fe587de7cb 100644
--- a/Source/Core/Common/Matrix.cpp
+++ b/Source/Core/Common/Matrix.cpp
@@ -250,11 +250,7 @@ Matrix33 Matrix33::Inverted() const
{
const auto m = [this](int x, int y) { return data[y + x * 3]; };
- const auto det = m(0, 0) * (m(1, 1) * m(2, 2) - m(2, 1) * m(1, 2)) -
- m(0, 1) * (m(1, 0) * m(2, 2) - m(1, 2) * m(2, 0)) +
- m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0));
-
- const auto invdet = 1 / det;
+ const auto invdet = 1 / Determinant();
Matrix33 result;
@@ -273,6 +269,15 @@ Matrix33 Matrix33::Inverted() const
return result;
}
+float Matrix33::Determinant() const
+{
+ const auto m = [this](int x, int y) { return data[y + x * 3]; };
+
+ return m(0, 0) * (m(1, 1) * m(2, 2) - m(2, 1) * m(1, 2)) -
+ m(0, 1) * (m(1, 0) * m(2, 2) - m(1, 2) * m(2, 0)) +
+ m(0, 2) * (m(1, 0) * m(2, 1) - m(1, 1) * m(2, 0));
+}
+
Matrix44 Matrix44::Identity()
{
Matrix44 mtx = {};
@@ -360,4 +365,17 @@ void Matrix44::Multiply(const Matrix44& a, const Vec4& vec, Vec4* result)
result->data = MatrixMultiply<4, 4, 1>(a.data, vec.data);
}
+float Matrix44::Determinant() const
+{
+ const auto& m = data;
+ return m[12] * m[9] * m[6] * m[3] - m[8] * m[13] * m[6] * m[3] - m[12] * m[5] * m[10] * m[3] +
+ m[4] * m[13] * m[10] * m[3] + m[8] * m[5] * m[14] * m[3] - m[4] * m[9] * m[14] * m[3] -
+ m[12] * m[9] * m[2] * m[7] + m[8] * m[13] * m[2] * m[7] + m[12] * m[1] * m[10] * m[7] -
+ m[0] * m[13] * m[10] * m[7] - m[8] * m[1] * m[14] * m[7] + m[0] * m[9] * m[14] * m[7] +
+ m[12] * m[5] * m[2] * m[11] - m[4] * m[13] * m[2] * m[11] - m[12] * m[1] * m[6] * m[11] +
+ m[0] * m[13] * m[6] * m[11] + m[4] * m[1] * m[14] * m[11] - m[0] * m[5] * m[14] * m[11] -
+ m[8] * m[5] * m[2] * m[15] + m[4] * m[9] * m[2] * m[15] + m[8] * m[1] * m[6] * m[15] -
+ m[0] * m[9] * m[6] * m[15] - m[4] * m[1] * m[10] * m[15] + m[0] * m[5] * m[10] * m[15];
+}
+
} // namespace Common