140 lines
2.8 KiB
C++
140 lines
2.8 KiB
C++
#ifndef VEC_H
|
|
#define VEC_H
|
|
|
|
class Vec2
|
|
{
|
|
public:
|
|
float x, y;
|
|
|
|
public:
|
|
Vec2() : x(0.0f), y(0.0f) {}
|
|
Vec2(float _x, float _y) : x(_x), y(_y) {}
|
|
Vec2(const Vec2 & v) : x(v.x), y(v.y) {}
|
|
};
|
|
|
|
class Vec3
|
|
{
|
|
public:
|
|
float x, y, z;
|
|
|
|
public:
|
|
Vec3() : x(0.0f), y(0.0f), z(0.0f) {}
|
|
Vec3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {}
|
|
Vec3(const Vec3 & v) : x(v.x), y(v.y), z(v.z) {}
|
|
|
|
public:
|
|
Vec3 normalize()
|
|
{
|
|
float l = sqrtf(x * x + y * y + z * z);
|
|
if (l != 0.0f)
|
|
{
|
|
x /= l;
|
|
y /= l;
|
|
z /= l;
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
Vec3 cross(const Vec3 & vec) const
|
|
{
|
|
return Vec3(y * vec.z - z * vec.y, z * vec.x - x * vec.z, x * vec.y - y * vec.x);
|
|
}
|
|
|
|
float dot(const Vec3 & vec) const
|
|
{
|
|
return x * vec.x + y * vec.y + z * vec.z;
|
|
}
|
|
|
|
Vec3 interp(const Vec3 & vec, float coeff) const
|
|
{
|
|
float coeff_1 = 1.0f - coeff;
|
|
return Vec3(x * coeff_1 + vec.x * coeff, y * coeff_1 + vec.y * coeff, z * coeff_1 + vec.z * coeff);
|
|
}
|
|
|
|
float squaredDist() const
|
|
{
|
|
return x * x + y * y + z * z;
|
|
}
|
|
|
|
friend Vec3 operator + (const Vec3 & u, const Vec3 & v)
|
|
{
|
|
return Vec3(u.x + v.x, u.y + v.y, u.z + v.z);
|
|
}
|
|
|
|
friend Vec3 operator - (const Vec3 & u, const Vec3 & v)
|
|
{
|
|
return Vec3(u.x - v.x, u.y - v.y, u.z - v.z);
|
|
}
|
|
|
|
friend Vec3 operator * (const Vec3 & u, const Vec3 & v)
|
|
{
|
|
return Vec3(u.x * v.x, u.y * v.y, u.z * v.z);
|
|
}
|
|
|
|
friend Vec3 operator / (const Vec3 & u, const Vec3 & v)
|
|
{
|
|
return Vec3(u.x / v.x, u.y / v.y, u.z / v.z);
|
|
}
|
|
|
|
friend bool operator == (const Vec3 & u, const Vec3 & v)
|
|
{
|
|
return u.x == v.x && u.y == v.y && u.z == v.z;
|
|
}
|
|
|
|
friend bool operator != (const Vec3 & u, const Vec3 & v)
|
|
{
|
|
return u.x != v.x || u.y != v.y || u.z != v.z;
|
|
}
|
|
|
|
public:
|
|
static const Vec3 Zero()
|
|
{
|
|
return Vec3();
|
|
}
|
|
};
|
|
|
|
class Vec4
|
|
{
|
|
public:
|
|
float x, y, z, w;
|
|
|
|
public:
|
|
Vec4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) {}
|
|
Vec4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) {}
|
|
Vec4(const Vec4 & v) : x(v.x), y(v.y), z(v.z), w(v.w) {}
|
|
|
|
public:
|
|
float dot(const Vec4 & vec) const
|
|
{
|
|
return x * vec.x + y * vec.y + z * vec.z + w * vec.w;
|
|
}
|
|
|
|
Vec4 interp(const Vec4 & vec, float coeff) const
|
|
{
|
|
float coeff_1 = 1.0f - coeff;
|
|
return Vec4(x * coeff_1 + vec.x * coeff, y * coeff_1 + vec.y * coeff, z * coeff_1 + vec.z * coeff, w * coeff_1 + vec.w * coeff);
|
|
}
|
|
|
|
friend Vec4 operator + (const Vec4 & u, const Vec4 & v)
|
|
{
|
|
return Vec4(u.x + v.x, u.y + v.y, u.z + v.z, u.w + v.w);
|
|
}
|
|
|
|
friend Vec4 operator - (const Vec4 & u, const Vec4 & v)
|
|
{
|
|
return Vec4(u.x - v.x, u.y - v.y, u.z - v.z, u.w - v.w);
|
|
}
|
|
|
|
friend Vec4 operator * (const Vec4 & u, const Vec4 & v)
|
|
{
|
|
return Vec4(u.x * v.x, u.y * v.y, u.z * v.z, u.w * v.w);
|
|
}
|
|
|
|
friend Vec4 operator / (const Vec4 & u, const Vec4 & v)
|
|
{
|
|
return Vec4(u.x / v.x, u.y / v.y, u.z / v.z, u.w / v.w);
|
|
}
|
|
};
|
|
|
|
#endif // of VEC_H
|