Core: Add constexpr constructors/operators to math structs
• Begin integrating `constexpr` on math tests; use `static_assert` where appropriate
This commit is contained in:
@ -52,13 +52,17 @@ struct [[nodiscard]] Transform2D {
|
||||
// WARNING: Be aware that unlike 3D code, 2D code uses a left-handed coordinate system:
|
||||
// Y-axis points down, and angle is measure from +X to +Y in a clockwise-fashion.
|
||||
|
||||
Vector2 columns[3];
|
||||
Vector2 columns[3] = {
|
||||
{ 1, 0 },
|
||||
{ 0, 1 },
|
||||
{ 0, 0 },
|
||||
};
|
||||
|
||||
_FORCE_INLINE_ real_t tdotx(const Vector2 &p_v) const { return columns[0][0] * p_v.x + columns[1][0] * p_v.y; }
|
||||
_FORCE_INLINE_ real_t tdoty(const Vector2 &p_v) const { return columns[0][1] * p_v.x + columns[1][1] * p_v.y; }
|
||||
|
||||
const Vector2 &operator[](int p_idx) const { return columns[p_idx]; }
|
||||
Vector2 &operator[](int p_idx) { return columns[p_idx]; }
|
||||
constexpr const Vector2 &operator[](int p_idx) const { return columns[p_idx]; }
|
||||
constexpr Vector2 &operator[](int p_idx) { return columns[p_idx]; }
|
||||
|
||||
void invert();
|
||||
Transform2D inverse() const;
|
||||
@ -105,15 +109,15 @@ struct [[nodiscard]] Transform2D {
|
||||
|
||||
Transform2D looking_at(const Vector2 &p_target) const;
|
||||
|
||||
bool operator==(const Transform2D &p_transform) const;
|
||||
bool operator!=(const Transform2D &p_transform) const;
|
||||
constexpr bool operator==(const Transform2D &p_transform) const;
|
||||
constexpr bool operator!=(const Transform2D &p_transform) const;
|
||||
|
||||
void operator*=(const Transform2D &p_transform);
|
||||
Transform2D operator*(const Transform2D &p_transform) const;
|
||||
void operator*=(real_t p_val);
|
||||
Transform2D operator*(real_t p_val) const;
|
||||
void operator/=(real_t p_val);
|
||||
Transform2D operator/(real_t p_val) const;
|
||||
constexpr void operator*=(real_t p_val);
|
||||
constexpr Transform2D operator*(real_t p_val) const;
|
||||
constexpr void operator/=(real_t p_val);
|
||||
constexpr Transform2D operator/(real_t p_val) const;
|
||||
|
||||
Transform2D interpolate_with(const Transform2D &p_transform, real_t p_c) const;
|
||||
|
||||
@ -128,31 +132,67 @@ struct [[nodiscard]] Transform2D {
|
||||
|
||||
operator String() const;
|
||||
|
||||
Transform2D(real_t p_xx, real_t p_xy, real_t p_yx, real_t p_yy, real_t p_ox, real_t p_oy) {
|
||||
columns[0][0] = p_xx;
|
||||
columns[0][1] = p_xy;
|
||||
columns[1][0] = p_yx;
|
||||
columns[1][1] = p_yy;
|
||||
columns[2][0] = p_ox;
|
||||
columns[2][1] = p_oy;
|
||||
}
|
||||
constexpr Transform2D(real_t p_xx, real_t p_xy, real_t p_yx, real_t p_yy, real_t p_ox, real_t p_oy) :
|
||||
columns{
|
||||
{ p_xx, p_xy },
|
||||
{ p_yx, p_yy },
|
||||
{ p_ox, p_oy },
|
||||
} {}
|
||||
|
||||
Transform2D(const Vector2 &p_x, const Vector2 &p_y, const Vector2 &p_origin) {
|
||||
columns[0] = p_x;
|
||||
columns[1] = p_y;
|
||||
columns[2] = p_origin;
|
||||
}
|
||||
constexpr Transform2D(const Vector2 &p_x, const Vector2 &p_y, const Vector2 &p_origin) :
|
||||
columns{ p_x, p_y, p_origin } {}
|
||||
|
||||
Transform2D(real_t p_rot, const Vector2 &p_pos);
|
||||
|
||||
Transform2D(real_t p_rot, const Size2 &p_scale, real_t p_skew, const Vector2 &p_pos);
|
||||
|
||||
Transform2D() {
|
||||
columns[0][0] = 1.0;
|
||||
columns[1][1] = 1.0;
|
||||
}
|
||||
Transform2D() = default;
|
||||
};
|
||||
|
||||
constexpr bool Transform2D::operator==(const Transform2D &p_transform) const {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (columns[i] != p_transform.columns[i]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
constexpr bool Transform2D::operator!=(const Transform2D &p_transform) const {
|
||||
for (int i = 0; i < 3; i++) {
|
||||
if (columns[i] != p_transform.columns[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
constexpr void Transform2D::operator*=(real_t p_val) {
|
||||
columns[0] *= p_val;
|
||||
columns[1] *= p_val;
|
||||
columns[2] *= p_val;
|
||||
}
|
||||
|
||||
constexpr Transform2D Transform2D::operator*(real_t p_val) const {
|
||||
Transform2D ret(*this);
|
||||
ret *= p_val;
|
||||
return ret;
|
||||
}
|
||||
|
||||
constexpr void Transform2D::operator/=(real_t p_val) {
|
||||
columns[0] /= p_val;
|
||||
columns[1] /= p_val;
|
||||
columns[2] /= p_val;
|
||||
}
|
||||
|
||||
constexpr Transform2D Transform2D::operator/(real_t p_val) const {
|
||||
Transform2D ret(*this);
|
||||
ret /= p_val;
|
||||
return ret;
|
||||
}
|
||||
|
||||
Vector2 Transform2D::basis_xform(const Vector2 &p_vec) const {
|
||||
return Vector2(
|
||||
tdotx(p_vec),
|
||||
|
||||
Reference in New Issue
Block a user