aboutsummaryrefslogtreecommitdiff
path: root/include/cru/platform/Matrix.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/platform/Matrix.hpp')
-rw-r--r--include/cru/platform/Matrix.hpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/include/cru/platform/Matrix.hpp b/include/cru/platform/Matrix.hpp
index 7985af0e..72459b79 100644
--- a/include/cru/platform/Matrix.hpp
+++ b/include/cru/platform/Matrix.hpp
@@ -2,6 +2,7 @@
#include "GraphicsBase.hpp"
#include <cmath>
+#include <optional>
namespace cru::platform {
struct Matrix {
@@ -80,6 +81,18 @@ struct Matrix {
a.m31 * b.m12 + a.m32 * b.m22 + b.m32};
}
+ std::optional<Matrix> Inverted() const {
+ if (m11 * m22 == m12 * m21) return std::nullopt;
+ Matrix result;
+ result.m11 = m22 / (m11 * m22 - m12 * m21);
+ result.m12 = m12 / (m12 * m21 - m11 * m22);
+ result.m21 = m21 / (m12 * m21 - m11 * m22);
+ result.m22 = m11 / (m11 * m22 - m12 * m21);
+ result.m31 = (m21 * m32 - m22 * m31) / (m11 * m22 - m12 * m21);
+ result.m32 = (m31 * m12 - m11 * m32) / (m11 * m22 - m12 * m21);
+ return result;
+ }
+
private:
static constexpr float PI = 3.1415926535f;