diff options
author | andrew <xdotftw@gmail.com> | 2014-03-11 15:01:17 +0100 |
---|---|---|
committer | andrew <xdotftw@gmail.com> | 2014-03-11 15:02:25 +0100 |
commit | b4bf13aa4f004a7819e262679a295d8ca886557b (patch) | |
tree | 8c1b0d89d4c23c78dd65899d4a2c2c31bde869a5 /src/Vector3.h | |
parent | Merge pull request #791 from mc-server/PieceGenerator (diff) | |
download | cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.tar cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.tar.gz cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.tar.bz2 cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.tar.lz cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.tar.xz cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.tar.zst cuberite-b4bf13aa4f004a7819e262679a295d8ca886557b.zip |
Diffstat (limited to 'src/Vector3.h')
-rw-r--r-- | src/Vector3.h | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/src/Vector3.h b/src/Vector3.h new file mode 100644 index 000000000..0be52248d --- /dev/null +++ b/src/Vector3.h @@ -0,0 +1,264 @@ + +#pragma once + + + + +#include <math.h> + + + + + + + + + +template <typename T> +// tolua_begin +class Vector3 +{ + + TOLUA_TEMPLATE_BIND((T, int, float, double)) + +public: + + T x, y, z; + + + inline Vector3() : x(0), y(0), z(0) {} + inline Vector3(T a_x, T a_y, T a_z) : x(a_x), y(a_y), z(a_z) {} + + + // tolua_end + template <typename _T> + Vector3(const Vector3<_T> & a_Rhs) : x(a_Rhs.x), y(a_Rhs.y), z(a_Rhs.z) {} + + template <typename _T> + Vector3(const Vector3<_T> * a_Rhs) : x(a_Rhs->x), y(a_Rhs->y), z(a_Rhs->z) {} + // tolua_begin + + + inline void Set(T a_x, T a_y, T a_z) + { + x = a_x; + y = a_y; + z = a_z; + } + + inline void Normalize(void) + { + T Len = 1.0 / Length(); + + x *= Len; + y *= Len; + z *= Len; + } + + inline Vector3<T> NormalizeCopy(void) const + { + T Len = 1.0 / Length(); + + return Vector3<T>( + x * Len, + y * Len, + z * Len + ); + } + + inline void NormalizeCopy(Vector3<T> & a_Rhs) const + { + T Len = 1.0 / Length(); + + a_Rhs.Set( + x * Len, + y * Len, + z * Len + ); + } + + inline T Length(void) const + { + return sqrt(x * x + y * y + z * z); + } + + inline T SqrLength(void) const + { + return x * x + y * y + z * z; + } + + inline T Dot(const Vector3<T> & a_Rhs) const + { + return x * a_Rhs.x + y * a_Rhs.y + z * a_Rhs.z; + } + + inline Vector3<T> Cross(const Vector3<T> & a_Rhs) const + { + return Vector3<T>( + y * a_Rhs.z - z * a_Rhs.y, + z * a_Rhs.x - x * a_Rhs.z, + x * a_Rhs.y - y * a_Rhs.x + ); + } + + inline bool Equals(const Vector3<T> & a_Rhs) const + { + return x == a_Rhs.x && y == a_Rhs.y && z == a_Rhs.z; + } + + inline bool operator < (const Vector3<T> & a_Rhs) + { + // return (x < a_Rhs.x) && (y < a_Rhs.y) && (z < a_Rhs.z); ? + return (x < a_Rhs.x) || (x == a_Rhs.x && y < a_Rhs.y) || (x == a_Rhs.x && y == a_Rhs.y && z < a_Rhs.z); + } + + inline void Move(T a_X, T a_Y, T a_Z) + { + x += a_X; + y += a_Y; + z += a_Z; + } + + // tolua_end + + inline void operator += (const Vector3<T> & a_Rhs) + { + x += a_Rhs.x; + y += a_Rhs.y; + z += a_Rhs.z; + } + + inline void operator -= (const Vector3<T> & a_Rhs) + { + x -= a_Rhs.x; + y -= a_Rhs.y; + z -= a_Rhs.z; + } + + inline void operator *= (const Vector3<T> & a_Rhs) + { + x *= a_Rhs.x; + y *= a_Rhs.y; + z *= a_Rhs.z; + } + + inline void operator *= (T a_v) + { + x *= a_v; + y *= a_v; + z *= a_v; + } + + // tolua_begin + + inline Vector3<T> operator + (const Vector3<T>& a_Rhs) const + { + return Vector3<T>( + x + a_Rhs.x, + y + a_Rhs.y, + z + a_Rhs.z + ); + } + + inline Vector3<T> operator - (const Vector3<T>& a_Rhs) const + { + return Vector3<T>( + x - a_Rhs.x, + y - a_Rhs.y, + z - a_Rhs.z + ); + } + + inline Vector3<T> operator * (const Vector3<T>& a_Rhs) const + { + return Vector3<T>( + x * a_Rhs.x, + y * a_Rhs.y, + z * a_Rhs.z + ); + } + + inline Vector3<T> operator * (T a_v) const + { + return Vector3<T>( + x * a_v, + y * a_v, + z * a_v + ); + } + + inline Vector3<T> operator / (T a_v) const + { + return Vector3<T>( + x / a_v, + y / a_v, + z / a_v + ); + } + + inline double LineCoeffToXYPlane(const Vector3<T> & a_OtherEnd, T a_Z) const + { + if (abs(z - a_OtherEnd.z) < EPS) + { + return NO_INTERSECTION; + } + + return (a_Z - z) / (a_OtherEnd.z - z); + } + + inline double LineCoeffToXZPlane(const Vector3<T> & a_OtherEnd, T a_Y) const + { + if (abs(y - a_OtherEnd.y) < EPS) + { + return NO_INTERSECTION; + } + + return (a_Y - y) / (a_OtherEnd.y - y); + } + + inline double LineCoeffToYZPlane(const Vector3<T> & a_OtherEnd, T a_X) const + { + if (abs(x - a_OtherEnd.x) < EPS) + { + return NO_INTERSECTION; + } + + return (a_X - x) / (a_OtherEnd.x - x); + } + + /** The max difference between two coords for which the coords are assumed equal. */ + static const double EPS; + + /** Return value of LineCoeffToPlane() if the line is parallel to the plane. */ + static const double NO_INTERSECTION; +}; +// tolua_end + +template <typename T> +const double Vector3<T>::EPS = 0.000001; + +template <typename T> +const double Vector3<T>::NO_INTERSECTION = 1e70; + + + + + +// tolua_begin +typedef Vector3<double> Vector3d; +typedef Vector3<float> Vector3f; +typedef Vector3<int> Vector3i; +// tolua_end + + + + + +typedef std::list<Vector3i> cVector3iList; +typedef std::vector<Vector3i> cVector3iArray; + + + + + + |