summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorgerman <german@thesoftwareartisans.com>2020-08-24 02:26:47 +0200
committergerman <german@thesoftwareartisans.com>2020-08-28 00:19:21 +0200
commit2d207ec609d1280bbfcdb822cceb8adc42afac3a (patch)
tree2990f7f63b3f6847636c85d6e00aac323f6856de /src/common
parentMerge pull request #4530 from Morph1984/mjolnir-p1 (diff)
downloadyuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.tar
yuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.tar.gz
yuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.tar.bz2
yuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.tar.lz
yuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.tar.xz
yuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.tar.zst
yuzu-2d207ec609d1280bbfcdb822cceb8adc42afac3a.zip
Diffstat (limited to 'src/common')
-rw-r--r--src/common/quaternion.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/common/quaternion.h b/src/common/quaternion.h
index da44f35cd..4d0871eb4 100644
--- a/src/common/quaternion.h
+++ b/src/common/quaternion.h
@@ -36,6 +36,36 @@ public:
T length = std::sqrt(xyz.Length2() + w * w);
return {xyz / length, w / length};
}
+
+ [[nodiscard]] std::array<decltype(-T{}), 16> ToMatrix() const {
+ const T x2 = xyz[0] * xyz[0];
+ const T y2 = xyz[1] * xyz[1];
+ const T z2 = xyz[2] * xyz[2];
+
+ const T xy = xyz[0] * xyz[1];
+ const T wz = w * xyz[2];
+ const T xz = xyz[0] * xyz[2];
+ const T wy = w * xyz[1];
+ const T yz = xyz[1] * xyz[2];
+ const T wx = w * xyz[0];
+
+ return {1.0f - 2.0f * (y2 + z2),
+ 2.0f * (xy + wz),
+ 2.0f * (xz - wy),
+ 0.0f,
+ 2.0f * (xy - wz),
+ 1.0f - 2.0f * (x2 + z2),
+ 2.0f * (yz + wx),
+ 0.0f,
+ 2.0f * (xz + wy),
+ 2.0f * (yz - wx),
+ 1.0f - 2.0f * (x2 + y2),
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 0.0f,
+ 1.0f};
+ }
};
template <typename T>