31#include <glm/ext/quaternion_geometric.hpp>
32#include <glm/gtx/quaternion.hpp>
34namespace utility::math
56 template<
typename Type>
65 template<CanBeQuaternionComponent QuaternionComponentType>
class Quaternion:
66 public glm::qua<QuaternionComponentType>
73 : glm::qua<QuaternionComponentType>(
74 QuaternionComponentType(1), QuaternionComponentType(0),
75 QuaternionComponentType(0), QuaternionComponentType(0))
92 Quaternion(QuaternionComponentType x, QuaternionComponentType y,
93 QuaternionComponentType z, QuaternionComponentType w)
94 : glm::qua<QuaternionComponentType>(w, x, y, z)
102 explicit Quaternion(
const glm::qua<QuaternionComponentType> &q)
103 : glm::qua<QuaternionComponentType>(q)
146 static_cast<const glm::qua<QuaternionComponentType> &
>(*
this)
147 +
static_cast<const glm::qua<QuaternionComponentType> &
>(rhs));
157 *
static_cast<glm::qua<QuaternionComponentType> *
>(
this) +=
158 static_cast<const glm::qua<QuaternionComponentType> &
>(rhs);
170 static_cast<const glm::qua<QuaternionComponentType> &
>(*
this)
171 -
static_cast<const glm::qua<QuaternionComponentType> &
>(rhs));
181 *
static_cast<glm::qua<QuaternionComponentType> *
>(
this) -=
182 static_cast<const glm::qua<QuaternionComponentType> &
>(rhs);
194 static_cast<const glm::qua<QuaternionComponentType> &
>(*
this)
195 *
static_cast<const glm::qua<QuaternionComponentType> &
>(rhs));
205 *
static_cast<glm::qua<QuaternionComponentType> *
>(
this) =
206 static_cast<const glm::qua<QuaternionComponentType> &
>(*
this)
207 *
static_cast<const glm::qua<QuaternionComponentType> &
>(rhs);
219 static_cast<const glm::qua<QuaternionComponentType> &
>(*
this)
230 *
static_cast<glm::qua<QuaternionComponentType> *
>(
this) *= scalar;
244 return static_cast<const glm::qua<QuaternionComponentType> &
>(*this)
245 ==
static_cast<const glm::qua<QuaternionComponentType> &
>(rhs);
258 QuaternionComponentType epsilon =
259 QuaternionComponentType { 1e-5 })
const
261 return std::abs(this->x - rhs.x) <= epsilon
262 && std::abs(this->y - rhs.y) <= epsilon
263 && std::abs(this->z - rhs.z) <= epsilon
264 && std::abs(this->w - rhs.w) <= epsilon;
274 return !(*
this == rhs);
284 -
static_cast<const glm::qua<QuaternionComponentType> &
>(*
this));
304 using QuaternionF = Quaternion<float>;
309 using QuaternionD = Quaternion<double>;
Quaternion class inheriting from glm::qua.
Quaternion operator*(QuaternionComponentType scalar) const noexcept
Scalar multiplication.
Quaternion operator+(const Quaternion &rhs) const noexcept
Quaternion addition.
bool operator==(const Quaternion &rhs) const noexcept
Equality comparison.
Quaternion & operator-=(const Quaternion &rhs) noexcept
Quaternion subtraction assignment.
Quaternion & operator*=(QuaternionComponentType scalar) noexcept
Scalar multiplication assignment.
Quaternion(QuaternionComponentType x, QuaternionComponentType y, QuaternionComponentType z, QuaternionComponentType w)
Construct from explicit components in (x, y, z, w) order.
~Quaternion()=default
Default destructor for Quaternion.
Quaternion()
Default constructor (identity quaternion).
Quaternion(const glm::qua< QuaternionComponentType > &q)
Construct from a GLM quaternion.
Quaternion & operator*=(const Quaternion &rhs) noexcept
Quaternion multiplication assignment (Hamilton product).
Quaternion & operator=(const Quaternion &other)=default
Copy assignment operator.
Quaternion operator-(void) const noexcept
Unary negation.
friend Quaternion operator*(QuaternionComponentType scalar, const Quaternion &q)
Friend function for scalar multiplication with scalar on the left.
Quaternion & operator+=(const Quaternion &rhs) noexcept
Quaternion addition assignment.
Quaternion & operator=(Quaternion &&other) noexcept=default
Move assignment operator.
Quaternion(const Quaternion &other)=default
Copy constructor.
bool operator!=(const Quaternion &rhs) const noexcept
Inequality comparison.
Quaternion operator-(const Quaternion &rhs) const noexcept
Quaternion subtraction.
Quaternion operator*(const Quaternion &rhs) const noexcept
Quaternion multiplication (Hamilton product).
Quaternion(Quaternion &&other) noexcept=default
Move constructor.
bool equalsEpsilon(const Quaternion &rhs, QuaternionComponentType epsilon=QuaternionComponentType { 1e-5 }) const
Approximate equality using an epsilon threshold.
Concept to constrain quaternion component type.