diff options
Diffstat (limited to 'thirdparty/b2d_convexdecomp/b2Glue.h')
-rw-r--r-- | thirdparty/b2d_convexdecomp/b2Glue.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/thirdparty/b2d_convexdecomp/b2Glue.h b/thirdparty/b2d_convexdecomp/b2Glue.h new file mode 100644 index 0000000000..425486356e --- /dev/null +++ b/thirdparty/b2d_convexdecomp/b2Glue.h @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef B2GLUE_H +#define B2GLUE_H + +#include "math_2d.h" +#include <limits.h> + +namespace b2ConvexDecomp { + +typedef real_t float32; +typedef int32_t int32; + +static inline float32 b2Sqrt(float32 val) { return Math::sqrt(val); } +#define b2_maxFloat FLT_MAX +#define b2_epsilon CMP_EPSILON +#define b2_pi 3.14159265359f +#define b2_maxPolygonVertices 16 +#define b2Max MAX +#define b2Min MIN +#define b2Clamp CLAMP +#define b2Abs ABS +/// A small length used as a collision and constraint tolerance. Usually it is +/// chosen to be numerically significant, but visually insignificant. +#define b2_linearSlop 0.005f + +/// A small angle used as a collision and constraint tolerance. Usually it is +/// chosen to be numerically significant, but visually insignificant. +#define b2_angularSlop (2.0f / 180.0f * b2_pi) + +/// A 2D column vector. +struct b2Vec2 +{ + /// Default constructor does nothing (for performance). + b2Vec2() {} + + /// Construct using coordinates. + b2Vec2(float32 x, float32 y) : x(x), y(y) {} + + /// Set this vector to all zeros. + void SetZero() { x = 0.0f; y = 0.0f; } + + /// Set this vector to some specified coordinates. + void Set(float32 x_, float32 y_) { x = x_; y = y_; } + + /// Negate this vector. + b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; } + + /// Read from and indexed element. + float32 operator () (int32 i) const + { + return (&x)[i]; + } + + /// Write to an indexed element. + float32& operator () (int32 i) + { + return (&x)[i]; + } + + /// Add a vector to this vector. + void operator += (const b2Vec2& v) + { + x += v.x; y += v.y; + } + + /// Subtract a vector from this vector. + void operator -= (const b2Vec2& v) + { + x -= v.x; y -= v.y; + } + + /// Multiply this vector by a scalar. + void operator *= (float32 a) + { + x *= a; y *= a; + } + + /// Get the length of this vector (the norm). + float32 Length() const + { + return b2Sqrt(x * x + y * y); + } + + /// Get the length squared. For performance, use this instead of + /// b2Vec2::Length (if possible). + float32 LengthSquared() const + { + return x * x + y * y; + } + + bool operator==(const b2Vec2& p_v) const { + return x==p_v.x && y==p_v.y; + } + b2Vec2 operator+(const b2Vec2& p_v) const { + return b2Vec2(x+p_v.x,y+p_v.y); + } + b2Vec2 operator-(const b2Vec2& p_v) const { + return b2Vec2(x-p_v.x,y-p_v.y); + } + + b2Vec2 operator*(float32 f) const { + return b2Vec2(f*x,f*y); + } + + /// Convert this vector into a unit vector. Returns the length. + float32 Normalize() + { + float32 length = Length(); + if (length < b2_epsilon) + { + return 0.0f; + } + float32 invLength = 1.0f / length; + x *= invLength; + y *= invLength; + + return length; + } + + /* + /// Does this vector contain finite coordinates? + bool IsValid() const + { + return b2IsValid(x) && b2IsValid(y); + } + */ + + float32 x, y; +}; + +inline b2Vec2 operator*(float32 f,const b2Vec2& p_v) { + return b2Vec2(f*p_v.x,f*p_v.y); +} + +/// Perform the dot product on two vectors. +inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b) +{ + return a.x * b.x + a.y * b.y; +} + +/// Perform the cross product on two vectors. In 2D this produces a scalar. +inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b) +{ + return a.x * b.y - a.y * b.x; +} + +/// Perform the cross product on a vector and a scalar. In 2D this produces +/// a vector. +inline b2Vec2 b2Cross(const b2Vec2& a, float32 s) +{ + return b2Vec2(s * a.y, -s * a.x); +} + +} + +#endif |