From ecd053c066a40778d92e11bc5ab8dd9529525413 Mon Sep 17 00:00:00 2001 From: Orange Date: Tue, 3 Sep 2024 21:10:28 +0300 Subject: [PATCH] vec4 is constexpr --- include/omath/Vector4.h | 139 +++++++++++++++++++++++++++++++++------- source/Vector4.cpp | 124 ----------------------------------- 2 files changed, 116 insertions(+), 147 deletions(-) diff --git a/include/omath/Vector4.h b/include/omath/Vector4.h index 32fa324..0daec48 100644 --- a/include/omath/Vector4.h +++ b/include/omath/Vector4.h @@ -4,59 +4,152 @@ #pragma once #include +#include + namespace omath { class Vector4 : public Vector3 { public: - float w = 0.f; + float w; - Vector4(const float x = 0.f, const float y = 0.f, const float z = 0.f, const float w = 0.f) : Vector3(x, y, z), w(w) {} - Vector4(); + constexpr Vector4(float x = 0.f, float y = 0.f, float z = 0.f, float w = 0.f) : Vector3(x, y, z), w(w) {} + constexpr Vector4() : Vector3(), w(0.f) {}; [[nodiscard]] - bool operator==(const Vector4& src) const; + constexpr bool operator==(const Vector4& src) const + { + return Vector3::operator==(src) && w == src.w; + } [[nodiscard]] - bool operator!=(const Vector4& src) const; + constexpr bool operator!=(const Vector4& src) const + { + return !(*this == src); + } - Vector4& operator+=(const Vector4& v); - Vector4& operator-=(const Vector4& v); - Vector4& operator*=(float scalar); - Vector4& operator*=(const Vector4& v); - Vector4& operator/=(float scalar); - Vector4& operator/=(const Vector4& v); + constexpr Vector4& operator+=(const Vector4& v) + { + Vector3::operator+=(v); + w += v.w; + + return *this; + } + + constexpr Vector4& operator-=(const Vector4& v) + { + Vector3::operator-=(v); + w -= v.w; + + return *this; + } + + constexpr Vector4& operator*=(float scalar) + { + Vector3::operator*=(scalar); + w *= scalar; + + return *this; + } + + constexpr Vector4& operator*=(const Vector4& v) + { + Vector3::operator*=(v); + w *= v.w; + + return *this; + } + + constexpr Vector4& operator/=(float scalar) + { + Vector3::operator/=(scalar); + w /= scalar; + + return *this; + } + + constexpr Vector4& operator/=(const Vector4& v) + { + Vector3::operator/=(v); + w /= v.w; + return *this; + } + + [[nodiscard]] constexpr float LengthSqr() const + { + return Vector3::LengthSqr() + w * w; + } + + [[nodiscard]] constexpr float Dot(const Vector4& vOther) const + { + return Vector3::Dot(vOther) + w * vOther.w; + } [[nodiscard]] float Length() const; - [[nodiscard]] float LengthSqr() const; - [[nodiscard]] float Dot(const Vector4& vOther) const; - Vector4& Abs(); - Vector4& Clamp(float min, float max); + constexpr Vector4& Abs() + { + Vector3::Abs(); + w = w < 0.f ? -w : w; + + return *this; + } + constexpr Vector4& Clamp(float min, float max) + { + x = std::clamp(x, min, max); + y = std::clamp(y, min, max); + z = std::clamp(z, min, max); + + return *this; + } [[nodiscard]] - Vector4 operator-() const; + constexpr Vector4 operator-() const + { + return {-x, -y, -z, -w}; + } [[nodiscard]] - Vector4 operator+(const Vector4& v) const; + constexpr Vector4 operator+(const Vector4& v) const + { + return {x + v.x, y + v.y, z + v.z, w + v.w}; + } [[nodiscard]] - Vector4 operator-(const Vector4& v) const; + constexpr Vector4 operator-(const Vector4& v) const + { + return {x - v.x, y - v.y, z - v.z, w - v.w}; + } [[nodiscard]] - Vector4 operator*(float scalar) const; + constexpr Vector4 operator*(float scalar) const + { + return {x * scalar, y * scalar, z * scalar, w * scalar}; + } [[nodiscard]] - Vector4 operator*(const Vector4& v) const; + constexpr Vector4 operator*(const Vector4& v) const + { + return {x * v.x, y * v.y, z * v.z, w * v.w}; + } [[nodiscard]] - Vector4 operator/(float scalar) const; + constexpr Vector4 operator/(float scalar) const + { + return {x / scalar, y / scalar, z / scalar, w / scalar}; + } [[nodiscard]] - Vector4 operator/(const Vector4& v) const; + constexpr Vector4 operator/(const Vector4& v) const + { + return {x / v.x, y / v.y, z / v.z, w / v.w}; + } [[nodiscard]] - float Sum() const; + constexpr float Sum() const + { + return Vector3::Sum() + w; + } }; } diff --git a/source/Vector4.cpp b/source/Vector4.cpp index 43ee175..6d3ae82 100644 --- a/source/Vector4.cpp +++ b/source/Vector4.cpp @@ -9,133 +9,9 @@ namespace omath { - bool Vector4::operator==(const Vector4& src) const - { - return Vector3::operator==(src) && w == src.w; - } - - bool Vector4::operator!=(const Vector4& src) const - { - return !(*this == src); - } - - Vector4& Vector4::operator+=(const Vector4& v) - { - Vector3::operator+=(v); - w += v.w; - return *this; - } - - Vector4& Vector4::operator-=(const Vector4& v) - { - Vector3::operator-=(v); - w -= v.w; - return *this; - } - - Vector4& Vector4::operator*=(float scalar) - { - Vector3::operator*=(scalar); - w *= scalar; - return *this; - } - - Vector4& Vector4::operator*=(const Vector4& v) - { - Vector3::operator*=(v); - w *= v.w; - return *this; - } - - Vector4& Vector4::operator/=(float scalar) - { - Vector3::operator/=(scalar); - w /= scalar; - return *this; - } - - Vector4& Vector4::operator/=(const Vector4& v) - { - Vector3::operator/=(v); - w /= v.w; - return *this; - } float Vector4::Length() const { return std::sqrt(LengthSqr()); } - - float Vector4::LengthSqr() const - { - return Vector3::LengthSqr() + w * w; - } - - float Vector4::Dot(const Vector4& vOther) const - { - return Vector3::Dot(vOther) + w * vOther.w; - } - - Vector4& Vector4::Abs() - { - Vector3::Abs(); - w = std::abs(w); - return *this; - } - - Vector4& Vector4::Clamp(const float min, const float max) - { - x = std::clamp(x, min, max); - y = std::clamp(y, min, max); - z = std::clamp(z, min, max); - - return *this; - } - - Vector4 Vector4::operator-() const - { - return {-x, -y, -z, -w}; - } - - Vector4 Vector4::operator+(const Vector4& v) const - { - return {x + v.x, y + v.y, z + v.z, w + v.w}; - } - - Vector4 Vector4::operator-(const Vector4& v) const - { - return {x - v.x, y - v.y, z - v.z, w - v.w}; - } - - Vector4 Vector4::operator*(float scalar) const - { - return {x * scalar, y * scalar, z * scalar, w * scalar}; - } - - Vector4 Vector4::operator*(const Vector4& v) const - { - return {x * v.x, y * v.y, z * v.z, w * v.w}; - } - - Vector4 Vector4::operator/(float scalar) const - { - return {x / scalar, y / scalar, z / scalar, w / scalar}; - } - - Vector4 Vector4::operator/(const Vector4& v) const - { - return {x / v.x, y / v.y, z / v.z, w / v.w}; - } - - float Vector4::Sum() const - { - return x + y + z + w; - } - - Vector4::Vector4() - { - x = 0.f; - y = 0.f; - z = 0.f; - } }