vec4 is constexpr

This commit is contained in:
2024-09-03 21:10:28 +03:00
parent 311d38be02
commit ecd053c066
2 changed files with 116 additions and 147 deletions

View File

@@ -4,59 +4,152 @@
#pragma once
#include <omath/Vector3.h>
#include <algorithm>
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;
}
};
}

View File

@@ -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;
}
}