diff options
author | Mattes D <github@xoft.cz> | 2014-05-10 21:27:57 +0200 |
---|---|---|
committer | Mattes D <github@xoft.cz> | 2014-05-10 21:27:57 +0200 |
commit | 28815252e6ff086c0fab7cf56be4839f3d8612a3 (patch) | |
tree | 4532e85cbcc873a2616147713e9f899ecf84d111 /src/Vector3.h | |
parent | Client cert is not requested. (diff) | |
parent | Merge pull request #993 from mc-server/GridStructGen (diff) | |
download | cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.tar cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.tar.gz cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.tar.bz2 cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.tar.lz cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.tar.xz cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.tar.zst cuberite-28815252e6ff086c0fab7cf56be4839f3d8612a3.zip |
Diffstat (limited to 'src/Vector3.h')
-rw-r--r-- | src/Vector3.h | 55 |
1 files changed, 40 insertions, 15 deletions
diff --git a/src/Vector3.h b/src/Vector3.h index 2c79f9ff1..fed776018 100644 --- a/src/Vector3.h +++ b/src/Vector3.h @@ -40,7 +40,6 @@ public: 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; @@ -105,18 +104,18 @@ public: 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) const - { - return Equals(a_Rhs); + // Perform a bitwise comparison of the contents - we want to know whether this object is exactly equal + // To perform EPS-based comparison, use the EqualsEps() function + return ( + (memcmp(&x, &a_Rhs.x, sizeof(x)) == 0) && + (memcmp(&y, &a_Rhs.y, sizeof(y)) == 0) && + (memcmp(&z, &a_Rhs.z, sizeof(z)) == 0) + ); } - - inline bool operator < (const Vector3<T> & a_Rhs) + + inline bool EqualsEps(const Vector3<T> & a_Rhs, T a_Eps) const { - // 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); + return (Abs(x - a_Rhs.x) < a_Eps) && (Abs(y - a_Rhs.y) < a_Eps) && (Abs(z - a_Rhs.z) < a_Eps); } inline void Move(T a_X, T a_Y, T a_Z) @@ -135,6 +134,16 @@ public: // tolua_end + inline bool operator != (const Vector3<T> & a_Rhs) const + { + return !Equals(a_Rhs); + } + + inline bool operator == (const Vector3<T> & a_Rhs) const + { + return Equals(a_Rhs); + } + inline void operator += (const Vector3<T> & a_Rhs) { x += a_Rhs.x; @@ -163,8 +172,16 @@ public: z *= a_v; } - // tolua_begin + inline Vector3<T> & operator = (const Vector3<T> & a_Rhs) + { + x = a_Rhs.x; + y = a_Rhs.y; + z = a_Rhs.z; + return *this; + } + // tolua_begin + inline Vector3<T> operator + (const Vector3<T>& a_Rhs) const { return Vector3<T>( @@ -217,7 +234,7 @@ public: */ inline double LineCoeffToXYPlane(const Vector3<T> & a_OtherEnd, T a_Z) const { - if (abs(z - a_OtherEnd.z) < EPS) + if (Abs(z - a_OtherEnd.z) < EPS) { return NO_INTERSECTION; } @@ -232,7 +249,7 @@ public: */ inline double LineCoeffToXZPlane(const Vector3<T> & a_OtherEnd, T a_Y) const { - if (abs(y - a_OtherEnd.y) < EPS) + if (Abs(y - a_OtherEnd.y) < EPS) { return NO_INTERSECTION; } @@ -247,7 +264,7 @@ public: */ inline double LineCoeffToYZPlane(const Vector3<T> & a_OtherEnd, T a_X) const { - if (abs(x - a_OtherEnd.x) < EPS) + if (Abs(x - a_OtherEnd.x) < EPS) { return NO_INTERSECTION; } @@ -260,7 +277,15 @@ public: /** Return value of LineCoeffToPlane() if the line is parallel to the plane. */ static const double NO_INTERSECTION; + +protected: + /** Returns the absolute value of the given argument. + Templatized because the standard library differentiates between abs() and fabs(). */ + static T Abs(T a_Value) + { + return (a_Value < 0) ? -a_Value : a_Value; + } }; // tolua_end |