better rage::vector3 class (#165)
This commit is contained in:
parent
a3031a8978
commit
28539bed96
194
rage/vector.hpp
194
rage/vector.hpp
@ -2,62 +2,200 @@
|
||||
|
||||
namespace rage
|
||||
{
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
union vector2
|
||||
{
|
||||
T data[2];
|
||||
struct { T x, y; };
|
||||
struct
|
||||
{
|
||||
T x, y;
|
||||
};
|
||||
|
||||
vector2(T x, T y) :
|
||||
x(x),
|
||||
vector2(T x, T y) : x(x),
|
||||
y(y)
|
||||
{
|
||||
}
|
||||
|
||||
vector2() :
|
||||
x(),
|
||||
vector2() : x(),
|
||||
y()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
union vector3
|
||||
{
|
||||
T data[3];
|
||||
struct { T x, y, z; };
|
||||
struct
|
||||
{
|
||||
T x, y, z;
|
||||
};
|
||||
|
||||
vector3(T x, T y, T z) :
|
||||
x(x),
|
||||
vector3(T x, T y, T z) noexcept : x(x),
|
||||
y(y),
|
||||
z(z)
|
||||
{
|
||||
}
|
||||
|
||||
vector3() :
|
||||
x(),
|
||||
vector3() noexcept : x(),
|
||||
y(),
|
||||
z()
|
||||
{
|
||||
}
|
||||
|
||||
vector3 operator+(const vector3 &rhs) const
|
||||
{
|
||||
return vector3(x + rhs.x, y + rhs.y, z + rhs.z);
|
||||
}
|
||||
|
||||
vector3 operator-(const vector3 &rhs) const
|
||||
{
|
||||
return vector3(x - rhs.x, y - rhs.y, z - rhs.z);
|
||||
}
|
||||
|
||||
vector3 operator*(const vector3 &rhs) const
|
||||
{
|
||||
return vector3(x * rhs.x, y * rhs.y, z * rhs.z);
|
||||
}
|
||||
|
||||
vector3 operator/(const vector3 &rhs) const
|
||||
{
|
||||
return vector3(x / rhs.x, y / rhs.y, z / rhs.z);
|
||||
}
|
||||
|
||||
vector3 operator+(const float &rhs) const
|
||||
{
|
||||
return vector3(x + rhs, y + rhs, z + rhs);
|
||||
}
|
||||
|
||||
vector3 operator-(const float &rhs) const
|
||||
{
|
||||
return vector3(x - rhs, y - rhs, z - rhs);
|
||||
}
|
||||
|
||||
vector3 operator*(const float &rhs) const
|
||||
{
|
||||
return vector3(x * rhs, y * rhs, z * rhs);
|
||||
}
|
||||
|
||||
vector3 operator/(const float &rhs) const
|
||||
{
|
||||
return vector3(x / rhs, y / rhs, z / rhs);
|
||||
}
|
||||
|
||||
bool operator==(const vector3 &rhs) const
|
||||
{
|
||||
return x == rhs.x && y == rhs.y && z == rhs.z;
|
||||
}
|
||||
|
||||
vector3 &operator+=(const vector3 &rhs)
|
||||
{
|
||||
return *this = *this + rhs;
|
||||
}
|
||||
|
||||
vector3 &operator-=(const vector3 &rhs)
|
||||
{
|
||||
return *this = *this - rhs;
|
||||
}
|
||||
|
||||
vector3 &operator*=(const vector3 &rhs)
|
||||
{
|
||||
return *this = *this * rhs;
|
||||
}
|
||||
|
||||
vector3 &operator/=(const vector3 &rhs)
|
||||
{
|
||||
return *this = *this / rhs;
|
||||
}
|
||||
|
||||
vector3 &operator+=(const float &rhs)
|
||||
{
|
||||
return *this = *this + rhs;
|
||||
}
|
||||
|
||||
vector3 &operator-=(const float &rhs)
|
||||
{
|
||||
return *this = *this - rhs;
|
||||
}
|
||||
|
||||
vector3 &operator*=(const float &rhs)
|
||||
{
|
||||
return *this = *this * rhs;
|
||||
}
|
||||
|
||||
vector3 &operator/=(const float &rhs)
|
||||
{
|
||||
return *this = *this / rhs;
|
||||
}
|
||||
|
||||
T length() const
|
||||
{
|
||||
return sqrt(x * x + y * y + z * z);
|
||||
}
|
||||
|
||||
T magnitude() const
|
||||
{
|
||||
return length();
|
||||
}
|
||||
|
||||
// This doesn't modify the vector inline.
|
||||
vector3 normalize() const
|
||||
{
|
||||
T len = length();
|
||||
if (len)
|
||||
{
|
||||
return *this * (1 / len);
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// This doesn't modify the vector inline.
|
||||
vector3 multiply(const vector3 rhs) const
|
||||
{
|
||||
return vector3(x * rhs.x, y * rhs.y, z * rhs.z);
|
||||
}
|
||||
|
||||
// This doesn't modify the vector inline.
|
||||
vector3 invert() const
|
||||
{
|
||||
return *this * -1;
|
||||
}
|
||||
|
||||
// This doesn't modify the vector inline.
|
||||
vector3 cross_product(const vector3 &rhs) const
|
||||
{
|
||||
return vector3(y * rhs.z - z * rhs.y, z * rhs.x - x * rhs.z, x * rhs.y - y * rhs.x);
|
||||
}
|
||||
|
||||
float dot_product(const vector3 &rhs) const
|
||||
{
|
||||
return x * rhs.x + y * rhs.y + z * rhs.z;
|
||||
}
|
||||
|
||||
float distance(const vector3 &rhs) const
|
||||
{
|
||||
return (*this - rhs).length();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
union vector4
|
||||
{
|
||||
T data[4];
|
||||
struct { T x, y, z, w; };
|
||||
struct
|
||||
{
|
||||
T x, y, z, w;
|
||||
};
|
||||
|
||||
vector4(T x, T y, T z, T w) :
|
||||
x(x),
|
||||
vector4(T x, T y, T z, T w) : x(x),
|
||||
y(y),
|
||||
z(z),
|
||||
w(w)
|
||||
{
|
||||
}
|
||||
|
||||
vector4() :
|
||||
x(),
|
||||
vector4() : x(),
|
||||
y(),
|
||||
z(),
|
||||
w()
|
||||
@ -65,18 +203,30 @@ namespace rage
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
union matrix34
|
||||
{
|
||||
T data[3][4];
|
||||
struct { struct { T x, y, z, w; } rows[3]; };
|
||||
struct
|
||||
{
|
||||
struct
|
||||
{
|
||||
T x, y, z, w;
|
||||
} rows[3];
|
||||
};
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
union matrix44
|
||||
{
|
||||
T data[4][4];
|
||||
struct { struct { T x, y, z, w; } rows[4]; };
|
||||
struct
|
||||
{
|
||||
struct
|
||||
{
|
||||
T x, y, z, w;
|
||||
} rows[4];
|
||||
};
|
||||
};
|
||||
|
||||
typedef vector2<float> fvector2;
|
||||
|
Loading…
Reference in New Issue
Block a user