Core: Add constexpr constructors/operators to math structs

• Begin integrating `constexpr` on math tests; use `static_assert` where appropriate
This commit is contained in:
Thaddeus Crews
2024-11-01 11:15:21 -05:00
parent 9e6ee9c5c3
commit ea62170dac
56 changed files with 1109 additions and 1159 deletions

View File

@ -36,6 +36,7 @@
struct [[nodiscard]] Quaternion {
union {
// NOLINTBEGIN(modernize-use-default-member-init)
struct {
real_t x;
real_t y;
@ -43,6 +44,7 @@ struct [[nodiscard]] Quaternion {
real_t w;
};
real_t components[4] = { 0, 0, 0, 1.0 };
// NOLINTEND(modernize-use-default-member-init)
};
_FORCE_INLINE_ real_t &operator[](int p_idx) {
@ -84,8 +86,8 @@ struct [[nodiscard]] Quaternion {
r_axis.z = z * r;
}
void operator*=(const Quaternion &p_q);
Quaternion operator*(const Quaternion &p_q) const;
constexpr void operator*=(const Quaternion &p_q);
constexpr Quaternion operator*(const Quaternion &p_q) const;
_FORCE_INLINE_ Vector3 xform(const Vector3 &p_v) const {
#ifdef MATH_CHECKS
@ -100,40 +102,33 @@ struct [[nodiscard]] Quaternion {
return inverse().xform(p_v);
}
_FORCE_INLINE_ void operator+=(const Quaternion &p_q);
_FORCE_INLINE_ void operator-=(const Quaternion &p_q);
_FORCE_INLINE_ void operator*=(real_t p_s);
_FORCE_INLINE_ void operator/=(real_t p_s);
_FORCE_INLINE_ Quaternion operator+(const Quaternion &p_q2) const;
_FORCE_INLINE_ Quaternion operator-(const Quaternion &p_q2) const;
_FORCE_INLINE_ Quaternion operator-() const;
_FORCE_INLINE_ Quaternion operator*(real_t p_s) const;
_FORCE_INLINE_ Quaternion operator/(real_t p_s) const;
constexpr void operator+=(const Quaternion &p_q);
constexpr void operator-=(const Quaternion &p_q);
constexpr void operator*=(real_t p_s);
constexpr void operator/=(real_t p_s);
constexpr Quaternion operator+(const Quaternion &p_q2) const;
constexpr Quaternion operator-(const Quaternion &p_q2) const;
constexpr Quaternion operator-() const;
constexpr Quaternion operator*(real_t p_s) const;
constexpr Quaternion operator/(real_t p_s) const;
_FORCE_INLINE_ bool operator==(const Quaternion &p_quaternion) const;
_FORCE_INLINE_ bool operator!=(const Quaternion &p_quaternion) const;
constexpr bool operator==(const Quaternion &p_quaternion) const;
constexpr bool operator!=(const Quaternion &p_quaternion) const;
operator String() const;
_FORCE_INLINE_ Quaternion() {}
constexpr Quaternion() :
x(0), y(0), z(0), w(1) {}
_FORCE_INLINE_ Quaternion(real_t p_x, real_t p_y, real_t p_z, real_t p_w) :
x(p_x),
y(p_y),
z(p_z),
w(p_w) {
}
constexpr Quaternion(real_t p_x, real_t p_y, real_t p_z, real_t p_w) :
x(p_x), y(p_y), z(p_z), w(p_w) {}
Quaternion(const Vector3 &p_axis, real_t p_angle);
Quaternion(const Quaternion &p_q) :
x(p_q.x),
y(p_q.y),
z(p_q.z),
w(p_q.w) {
}
constexpr Quaternion(const Quaternion &p_q) :
x(p_q.x), y(p_q.y), z(p_q.z), w(p_q.w) {}
void operator=(const Quaternion &p_q) {
constexpr void operator=(const Quaternion &p_q) {
x = p_q.x;
y = p_q.y;
z = p_q.z;
@ -178,62 +173,78 @@ real_t Quaternion::length_squared() const {
return dot(*this);
}
void Quaternion::operator+=(const Quaternion &p_q) {
constexpr void Quaternion::operator+=(const Quaternion &p_q) {
x += p_q.x;
y += p_q.y;
z += p_q.z;
w += p_q.w;
}
void Quaternion::operator-=(const Quaternion &p_q) {
constexpr void Quaternion::operator-=(const Quaternion &p_q) {
x -= p_q.x;
y -= p_q.y;
z -= p_q.z;
w -= p_q.w;
}
void Quaternion::operator*=(real_t p_s) {
constexpr void Quaternion::operator*=(real_t p_s) {
x *= p_s;
y *= p_s;
z *= p_s;
w *= p_s;
}
void Quaternion::operator/=(real_t p_s) {
*this *= 1.0f / p_s;
constexpr void Quaternion::operator/=(real_t p_s) {
*this *= (1 / p_s);
}
Quaternion Quaternion::operator+(const Quaternion &p_q2) const {
constexpr Quaternion Quaternion::operator+(const Quaternion &p_q2) const {
const Quaternion &q1 = *this;
return Quaternion(q1.x + p_q2.x, q1.y + p_q2.y, q1.z + p_q2.z, q1.w + p_q2.w);
}
Quaternion Quaternion::operator-(const Quaternion &p_q2) const {
constexpr Quaternion Quaternion::operator-(const Quaternion &p_q2) const {
const Quaternion &q1 = *this;
return Quaternion(q1.x - p_q2.x, q1.y - p_q2.y, q1.z - p_q2.z, q1.w - p_q2.w);
}
Quaternion Quaternion::operator-() const {
constexpr Quaternion Quaternion::operator-() const {
const Quaternion &q2 = *this;
return Quaternion(-q2.x, -q2.y, -q2.z, -q2.w);
}
Quaternion Quaternion::operator*(real_t p_s) const {
constexpr Quaternion Quaternion::operator*(real_t p_s) const {
return Quaternion(x * p_s, y * p_s, z * p_s, w * p_s);
}
Quaternion Quaternion::operator/(real_t p_s) const {
return *this * (1.0f / p_s);
constexpr Quaternion Quaternion::operator/(real_t p_s) const {
return *this * (1 / p_s);
}
bool Quaternion::operator==(const Quaternion &p_quaternion) const {
constexpr bool Quaternion::operator==(const Quaternion &p_quaternion) const {
return x == p_quaternion.x && y == p_quaternion.y && z == p_quaternion.z && w == p_quaternion.w;
}
bool Quaternion::operator!=(const Quaternion &p_quaternion) const {
constexpr bool Quaternion::operator!=(const Quaternion &p_quaternion) const {
return x != p_quaternion.x || y != p_quaternion.y || z != p_quaternion.z || w != p_quaternion.w;
}
_FORCE_INLINE_ Quaternion operator*(real_t p_real, const Quaternion &p_quaternion) {
constexpr void Quaternion::operator*=(const Quaternion &p_q) {
real_t xx = w * p_q.x + x * p_q.w + y * p_q.z - z * p_q.y;
real_t yy = w * p_q.y + y * p_q.w + z * p_q.x - x * p_q.z;
real_t zz = w * p_q.z + z * p_q.w + x * p_q.y - y * p_q.x;
w = w * p_q.w - x * p_q.x - y * p_q.y - z * p_q.z;
x = xx;
y = yy;
z = zz;
}
constexpr Quaternion Quaternion::operator*(const Quaternion &p_q) const {
Quaternion r = *this;
r *= p_q;
return r;
}
constexpr Quaternion operator*(real_t p_real, const Quaternion &p_quaternion) {
return p_quaternion * p_real;
}