diff options
-rw-r--r-- | maths.cpp | 72 | ||||
-rw-r--r-- | maths.hpp | 12 |
2 files changed, 84 insertions, 0 deletions
@@ -2,6 +2,78 @@ #include <algorithm> +namespace quat { + v4f identity() { + return v4f(0.0f, 0.0f, 0.0f, 1.0f); + } + + v4f scale(const v4f& q, float s) { + return v4f(q.xyz() * s, q.w); + } + + v4f normalised(const v4f& q) { + float l = v4f::mag(q); + return v4f(q.xyz() / l, q.w); + } + + v4f conjugate(const v4f& q) { + return v4f(-q.xyz(), q.w); + } + + template <> + v4f mul<false>(const v4f& a, const v4f& b) { + return v4f( + a.x * b.w + + a.y * b.z - + a.z * b.y + + a.w * b.x, + + -a.x * b.z + + a.y * b.w + + a.z * b.x + + a.w * b.y, + + a.x * b.y - + a.y * b.x + + a.z * b.w + + a.w * b.z, + + -a.x * b.x - + a.y * b.y - + a.z * b.z + + a.w * b.w + ); + } + + template <> + v4f mul<true>(const v4f& a, const v4f& b) { + return normalised(mul<false>(a, b)); + } + + v4f mul(const v4f& a, const v4f& b) { + return mul<true>(a, b); + } + + v4f rotate(float angle, const v3f& axis) { + float h = to_rad(angle) * 0.5f; + float s = sinf(h); + return v4f( + cosf(h), + s * axis.x, + s * axis.y, + s * axis.z + ); + } + + v4f euler(const v3f& a) { + return mul(mul( + rotate(a.x, v3f(1.0f, 0.0f, 0.0f)), + rotate(a.y, v3f(0.0f, 1.0f, 0.0f))), + rotate(a.z, v3f(0.0f, 0.0f, 1.0f)) + ); + } +} + m4f::m4f() {} m4f::m4f(float d) { @@ -469,6 +469,18 @@ struct AABB { v3f min, max; }; +namespace quat { + v4f identity(); + v4f scale(const v4f& q, float s); + v4f normalised(const v4f& q); + v4f conjugate(const v4f& q); + template <bool normalise> + v4f mul(const v4f& a, const v4f& b); + v4f mul(const v4f& a, const v4f& b); + v4f rotate(float angle, const v3f& axis); + v4f euler(const v3f& a); +} + struct m4f { float m[4][4]; |