| |
| |
| |
| |
|
|
| #pragma once |
|
|
| #include "Vector.h" |
|
|
| namespace Math |
| { |
| class alignas(16) Quaternion |
| { |
| public: |
|
|
| static Quaternion const Identity; |
|
|
| |
| static Quaternion FromRotationBetweenNormalizedVectors(const Vector& sourceVector, const Vector& targetVector); |
|
|
| |
| static Quaternion FromRotationBetweenNormalizedVectors(const Vector& sourceVector, const Vector& targetVector, const Vector& fallbackRotationAxis); |
|
|
| |
| static Quaternion FromRotationBetweenVectors(const Vector& sourceVector, const Vector& targetVector); |
|
|
| |
| static Quaternion NLerp(const Quaternion& from, const Quaternion& to, float t); |
|
|
| |
| static Quaternion SLerp(const Quaternion& from, const Quaternion& to, float t); |
|
|
| |
| static Quaternion FastSLerp(const Quaternion& from, const Quaternion& to, float t); |
|
|
| |
| static Quaternion SQuad(const Quaternion& q0, const Quaternion& q1, const Quaternion& q2, const Quaternion& q3, float t); |
|
|
| |
| static Quaternion Delta(const Quaternion& from, const Quaternion& to); |
|
|
| |
| static Vector Dot(const Quaternion& q0, const Quaternion& q1); |
|
|
| |
| static Radians Distance(const Quaternion& q0, const Quaternion& q1); |
|
|
| |
| static Quaternion LookRotation(const Vector& forward, const Vector& up); |
|
|
| public: |
|
|
| Quaternion() = default; |
| explicit Quaternion(NoInit_t); |
| explicit Quaternion(IdentityInit_t); |
| explicit Quaternion(const Vector& v); |
| explicit Quaternion(float ix, float iy, float iz, float iw); |
| explicit Quaternion(const Float4& v); |
|
|
| explicit Quaternion(const Vector& axis, Radians angle); |
| explicit Quaternion(AxisAngle axisAngle); |
|
|
| explicit Quaternion(const EulerAngles& eulerAngles); |
| explicit Quaternion(Radians rotX, Radians rotY, Radians rotZ); |
|
|
| operator __m128& (); |
| operator const __m128& () const; |
|
|
| Float4 ToFloat4() const; |
| Vector ToVector() const; |
|
|
| Vector Length(); |
| float GetLength() const; |
|
|
| |
| Radians GetAngle() const; |
|
|
| AxisAngle ToAxisAngle() const; |
| EulerAngles ToEulerAngles() const; |
|
|
| Vector RotateVector(const Vector& vector) const; |
| Vector RotateVectorInverse(const Vector& vector) const; |
|
|
| Quaternion& Conjugate(); |
| Quaternion GetConjugate() const; |
|
|
| Quaternion& Negate(); |
| Quaternion GetNegated() const; |
|
|
| Quaternion& Invert(); |
| Quaternion GetInverse() const; |
|
|
| Quaternion& Normalize(); |
| Quaternion GetNormalized() const; |
|
|
| Vector XAxis() const noexcept; |
| Vector YAxis() const noexcept; |
| Vector ZAxis() const noexcept; |
|
|
| |
| Quaternion& MakeShortestPath(); |
|
|
| |
| Quaternion GetShortestPath() const; |
|
|
| |
| Quaternion& NormalizeInaccurate(); |
|
|
| |
| Quaternion GetNormalizedInaccurate() const; |
|
|
| bool IsNormalized() const; |
| bool IsIdentity() const; |
|
|
| |
| |
| Quaternion operator*(const Quaternion& rhs) const; |
| Quaternion& operator*=(const Quaternion& rhs); |
|
|
| |
| bool IsNearEqual(const Quaternion& rhs, Radians const threshold = Math::DegreesToRadians) const; |
|
|
| |
| bool operator==(const Quaternion& rhs) const; |
|
|
| |
| bool operator!=(const Quaternion& rhs) const; |
|
|
| private: |
|
|
| Vector GetSplatW() const; |
| float GetW() const; |
|
|
| Quaternion& operator=(const Vector& v) = delete; |
|
|
| public: |
|
|
| __m128 m_data; |
| }; |
|
|
| static_assert(sizeof(Vector) == 16, "Quaternion size must be 16 bytes!"); |
| } |
|
|
| #include "Quaternion.inl" |
|
|