#pragma once
Vec4f::Vec4f()
{
}
Vec4f::Vec4f(float _x, float _y, float _z, float _w)
{
x = _x;
y = _y;
z = _z;
w = _w;
}
Vec4f::Vec4f(const Vec3f &V, float _w)
{
x = V.x;
y = V.y;
z = V.z;
w = _w;
}
Vec4f::Vec4f(const Vec4f &V)
{
x = V.x;
y = V.y;
z = V.z;
w = V.w;
}
Vec4f::Vec4f(const RGBColor &c)
{
x = c.r / 255.0f;
y = c.g / 255.0f;
z = c.b / 255.0f;
w = c.a / 255.0f;
}
Vec4f& Vec4f::operator = (const Vec4f &V)
{
x = V.x;
y = V.y;
z = V.z;
w = V.w;
return *this;
}
float Vec4f::Length() const
{
return sqrtf(x * x + y * y + z * z + w * w);
}
float Vec4f::LengthSq() const
{
return x * x + y * y + z * z + w * w;
}
__forceinline Vec4f Vec4f::Normalize(const Vec4f &V)
{
float Len = V.Length();
if(Len == 0.0f)
{
return V;
}
else
{
float Factor = 1.0f / Len;
return Vec4f(V.x * Factor, V.y * Factor, V.z * Factor, V.w * Factor);
}
}
float Vec4f::Dot(const Vec4f &Left, const Vec4f &Right)
{
return (Left.x * Right.x + Left.y * Right.y + Left.z * Right.z + Left.w * Right.w);
}
Vec4f Vec4f::Lerp(const Vec4f &Left, const Vec4f &Right, float s)
{
return (Left + s * (Right - Left));
}
Vec4f Vec4f::Maximize(const Vec4f &Left, const Vec4f &Right)
{
Vec4f Result = Right;
if(Left.x > Right.x) Result.x = Left.x;
if(Left.y > Right.y) Result.y = Left.y;
if(Left.z > Right.z) Result.z = Left.z;
if(Left.w > Right.w) Result.w = Left.w;
return Result;
}
Vec4f Vec4f::Minimize(const Vec4f &Left, const Vec4f &Right)
{
Vec4f Result = Right;
if(Left.x < Right.x) Result.x = Left.x;
if(Left.y < Right.y) Result.y = Left.y;
if(Left.z < Right.z) Result.z = Left.z;
if(Left.w < Right.w) Result.w = Left.w;
return Result;
}
Vec4f Vec4f::Abs(const Vec4f &V)
{
Vec4f Result = V;
if(Result.x < 0.0f)
{
Result.x = -Result.x;
}
if(Result.y < 0.0f)
{
Result.y = -Result.y;
}
if(Result.z < 0.0f)
{
Result.z = -Result.z;
}
if(Result.w < 0.0f)
{
Result.w = -Result.w;
}
return Result;
}
Vec4f operator * (const Vec4f &Left, float Right)
{
Vec4f Return;
Return.x = Left.x * Right;
Return.y = Left.y * Right;
Return.z = Left.z * Right;
Return.w = Left.w * Right;
return Return;
}
Vec4f operator * (float Right, const Vec4f &Left)
{
Vec4f Return;
Return.x = Left.x * Right;
Return.y = Left.y * Right;
Return.z = Left.z * Right;
Return.w = Left.w * Right;
return Return;
}
Vec4f operator / (const Vec4f &Left, float Right)
{
Vec4f Return;
Return.x = Left.x / Right;
Return.y = Left.y / Right;
Return.z = Left.z / Right;
Return.w = Left.w / Right;
return Return;
}
Vec4f operator + (const Vec4f &Left, const Vec4f &Right)
{
Vec4f Return;
Return.x = Left.x + Right.x;
Return.y = Left.y + Right.y;
Return.z = Left.z + Right.z;
Return.w = Left.w + Right.w;
return Return;
}
Vec4f operator - (const Vec4f &Left, const Vec4f &Right)
{
Vec4f Return;
Return.x = Left.x - Right.x;
Return.y = Left.y - Right.y;
Return.z = Left.z - Right.z;
Return.w = Left.w - Right.w;
return Return;
}
Vec4f& Vec4f::operator *= (float Right)
{
x *= Right;
y *= Right;
z *= Right;
w *= Right;
return *this;
}
Vec4f& Vec4f::operator /= (float Right)
{
x /= Right;
y /= Right;
z /= Right;
w /= Right;
return *this;
}
Vec4f& Vec4f::operator += (const Vec4f &Right)
{
x += Right.x;
y += Right.y;
z += Right.z;
w += Right.w;
return *this;
}
Vec4f& Vec4f::operator -= (const Vec4f &Right)
{
x -= Right.x;
y -= Right.y;
z -= Right.z;
w -= Right.w;
return *this;
}
__forceinline Vec4f operator - (const Vec4f &V)
{
Vec4f Result;
Result.x = -V.x;
Result.y = -V.y;
Result.z = -V.z;
Result.w = -V.w;
return Result;
}