summaryrefslogtreecommitdiff
path: root/thirdparty/b2d_convexdecomp/b2Glue.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/b2d_convexdecomp/b2Glue.h')
-rw-r--r--thirdparty/b2d_convexdecomp/b2Glue.h173
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