diff options
Diffstat (limited to 'src/common/quaternion.h')
| -rw-r--r-- | src/common/quaternion.h | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/common/quaternion.h b/src/common/quaternion.h index 370198ae0..da44f35cd 100644 --- a/src/common/quaternion.h +++ b/src/common/quaternion.h | |||
| @@ -14,35 +14,36 @@ public: | |||
| 14 | Vec3<T> xyz; | 14 | Vec3<T> xyz; |
| 15 | T w{}; | 15 | T w{}; |
| 16 | 16 | ||
| 17 | Quaternion<decltype(-T{})> Inverse() const { | 17 | [[nodiscard]] Quaternion<decltype(-T{})> Inverse() const { |
| 18 | return {-xyz, w}; | 18 | return {-xyz, w}; |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | Quaternion<decltype(T{} + T{})> operator+(const Quaternion& other) const { | 21 | [[nodiscard]] Quaternion<decltype(T{} + T{})> operator+(const Quaternion& other) const { |
| 22 | return {xyz + other.xyz, w + other.w}; | 22 | return {xyz + other.xyz, w + other.w}; |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | Quaternion<decltype(T{} - T{})> operator-(const Quaternion& other) const { | 25 | [[nodiscard]] Quaternion<decltype(T{} - T{})> operator-(const Quaternion& other) const { |
| 26 | return {xyz - other.xyz, w - other.w}; | 26 | return {xyz - other.xyz, w - other.w}; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | Quaternion<decltype(T{} * T{} - T{} * T{})> operator*(const Quaternion& other) const { | 29 | [[nodiscard]] Quaternion<decltype(T{} * T{} - T{} * T{})> operator*( |
| 30 | const Quaternion& other) const { | ||
| 30 | return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz), | 31 | return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz), |
| 31 | w * other.w - Dot(xyz, other.xyz)}; | 32 | w * other.w - Dot(xyz, other.xyz)}; |
| 32 | } | 33 | } |
| 33 | 34 | ||
| 34 | Quaternion<T> Normalized() const { | 35 | [[nodiscard]] Quaternion<T> Normalized() const { |
| 35 | T length = std::sqrt(xyz.Length2() + w * w); | 36 | T length = std::sqrt(xyz.Length2() + w * w); |
| 36 | return {xyz / length, w / length}; | 37 | return {xyz / length, w / length}; |
| 37 | } | 38 | } |
| 38 | }; | 39 | }; |
| 39 | 40 | ||
| 40 | template <typename T> | 41 | template <typename T> |
| 41 | auto QuaternionRotate(const Quaternion<T>& q, const Vec3<T>& v) { | 42 | [[nodiscard]] auto QuaternionRotate(const Quaternion<T>& q, const Vec3<T>& v) { |
| 42 | return v + 2 * Cross(q.xyz, Cross(q.xyz, v) + v * q.w); | 43 | return v + 2 * Cross(q.xyz, Cross(q.xyz, v) + v * q.w); |
| 43 | } | 44 | } |
| 44 | 45 | ||
| 45 | inline Quaternion<float> MakeQuaternion(const Vec3<float>& axis, float angle) { | 46 | [[nodiscard]] inline Quaternion<float> MakeQuaternion(const Vec3<float>& axis, float angle) { |
| 46 | return {axis * std::sin(angle / 2), std::cos(angle / 2)}; | 47 | return {axis * std::sin(angle / 2), std::cos(angle / 2)}; |
| 47 | } | 48 | } |
| 48 | 49 | ||