219 lines
4.9 KiB
JavaScript
219 lines
4.9 KiB
JavaScript
|
/*
|
|||
|
* Copyright (c) 2006-2007 Erin Catto http:
|
|||
|
*
|
|||
|
* 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, and must not be
|
|||
|
* misrepresented the original software.
|
|||
|
* 3. This notice may not be removed or altered from any source distribution.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
var b2Math = Class.create();
|
|||
|
b2Math.prototype = {
|
|||
|
|
|||
|
|
|||
|
/*static public function b2InvSqrt(x)
|
|||
|
{
|
|||
|
float32 xhalf = 0.5f * x;
|
|||
|
int32 i = *(int32*)&x;
|
|||
|
i = 0x5f3759df - (i >> 1);
|
|||
|
x = *(float32*)&i;
|
|||
|
x = x * (1.5f - xhalf * x * x);
|
|||
|
return x;
|
|||
|
}*/
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// A * B
|
|||
|
|
|||
|
// A^T * B
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// b2Math.b2Random number in range [-1,1]
|
|||
|
|
|||
|
/*inline float32 b2Math.b2Random(float32 lo, float32 hi)
|
|||
|
{
|
|||
|
float32 r = (float32)rand();
|
|||
|
r /= RAND_MAX;
|
|||
|
r = (hi - lo) * r + lo;
|
|||
|
return r;
|
|||
|
}*/
|
|||
|
|
|||
|
// "Next Largest Power of 2
|
|||
|
// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm
|
|||
|
// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with
|
|||
|
// the same most significant 1, but all 1's below it. Adding 1 to that value yields the next
|
|||
|
// largest power of 2. For a 32-bit value:"
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// Temp vector functions to reduce calls to 'new'
|
|||
|
/*static public var tempVec = new b2Vec2();
|
|||
|
|
|||
|
|
|||
|
static public var tempAABB = new b2AABB(); */
|
|||
|
|
|||
|
|
|||
|
|
|||
|
initialize: function() {}}
|
|||
|
b2Math.b2IsValid = function(x)
|
|||
|
{
|
|||
|
return isFinite(x);
|
|||
|
};
|
|||
|
b2Math.b2Dot = function(a, b)
|
|||
|
{
|
|||
|
return a.x * b.x + a.y * b.y;
|
|||
|
};
|
|||
|
b2Math.b2CrossVV = function(a, b)
|
|||
|
{
|
|||
|
return a.x * b.y - a.y * b.x;
|
|||
|
};
|
|||
|
b2Math.b2CrossVF = function(a, s)
|
|||
|
{
|
|||
|
var v = new b2Vec2(s * a.y, -s * a.x);
|
|||
|
return v;
|
|||
|
};
|
|||
|
b2Math.b2CrossFV = function(s, a)
|
|||
|
{
|
|||
|
var v = new b2Vec2(-s * a.y, s * a.x);
|
|||
|
return v;
|
|||
|
};
|
|||
|
b2Math.b2MulMV = function(A, v)
|
|||
|
{
|
|||
|
var u = new b2Vec2(A.col1.x * v.x + A.col2.x * v.y, A.col1.y * v.x + A.col2.y * v.y);
|
|||
|
return u;
|
|||
|
};
|
|||
|
b2Math.b2MulTMV = function(A, v)
|
|||
|
{
|
|||
|
var u = new b2Vec2(b2Math.b2Dot(v, A.col1), b2Math.b2Dot(v, A.col2));
|
|||
|
return u;
|
|||
|
};
|
|||
|
b2Math.AddVV = function(a, b)
|
|||
|
{
|
|||
|
var v = new b2Vec2(a.x + b.x, a.y + b.y);
|
|||
|
return v;
|
|||
|
};
|
|||
|
b2Math.SubtractVV = function(a, b)
|
|||
|
{
|
|||
|
var v = new b2Vec2(a.x - b.x, a.y - b.y);
|
|||
|
return v;
|
|||
|
};
|
|||
|
b2Math.MulFV = function(s, a)
|
|||
|
{
|
|||
|
var v = new b2Vec2(s * a.x, s * a.y);
|
|||
|
return v;
|
|||
|
};
|
|||
|
b2Math.AddMM = function(A, B)
|
|||
|
{
|
|||
|
var C = new b2Mat22(0, b2Math.AddVV(A.col1, B.col1), b2Math.AddVV(A.col2, B.col2));
|
|||
|
return C;
|
|||
|
};
|
|||
|
b2Math.b2MulMM = function(A, B)
|
|||
|
{
|
|||
|
var C = new b2Mat22(0, b2Math.b2MulMV(A, B.col1), b2Math.b2MulMV(A, B.col2));
|
|||
|
return C;
|
|||
|
};
|
|||
|
b2Math.b2MulTMM = function(A, B)
|
|||
|
{
|
|||
|
var c1 = new b2Vec2(b2Math.b2Dot(A.col1, B.col1), b2Math.b2Dot(A.col2, B.col1));
|
|||
|
var c2 = new b2Vec2(b2Math.b2Dot(A.col1, B.col2), b2Math.b2Dot(A.col2, B.col2));
|
|||
|
var C = new b2Mat22(0, c1, c2);
|
|||
|
return C;
|
|||
|
};
|
|||
|
b2Math.b2Abs = function(a)
|
|||
|
{
|
|||
|
return a > 0.0 ? a : -a;
|
|||
|
};
|
|||
|
b2Math.b2AbsV = function(a)
|
|||
|
{
|
|||
|
var b = new b2Vec2(b2Math.b2Abs(a.x), b2Math.b2Abs(a.y));
|
|||
|
return b;
|
|||
|
};
|
|||
|
b2Math.b2AbsM = function(A)
|
|||
|
{
|
|||
|
var B = new b2Mat22(0, b2Math.b2AbsV(A.col1), b2Math.b2AbsV(A.col2));
|
|||
|
return B;
|
|||
|
};
|
|||
|
b2Math.b2Min = function(a, b)
|
|||
|
{
|
|||
|
return a < b ? a : b;
|
|||
|
};
|
|||
|
b2Math.b2MinV = function(a, b)
|
|||
|
{
|
|||
|
var c = new b2Vec2(b2Math.b2Min(a.x, b.x), b2Math.b2Min(a.y, b.y));
|
|||
|
return c;
|
|||
|
};
|
|||
|
b2Math.b2Max = function(a, b)
|
|||
|
{
|
|||
|
return a > b ? a : b;
|
|||
|
};
|
|||
|
b2Math.b2MaxV = function(a, b)
|
|||
|
{
|
|||
|
var c = new b2Vec2(b2Math.b2Max(a.x, b.x), b2Math.b2Max(a.y, b.y));
|
|||
|
return c;
|
|||
|
};
|
|||
|
b2Math.b2Clamp = function(a, low, high)
|
|||
|
{
|
|||
|
return b2Math.b2Max(low, b2Math.b2Min(a, high));
|
|||
|
};
|
|||
|
b2Math.b2ClampV = function(a, low, high)
|
|||
|
{
|
|||
|
return b2Math.b2MaxV(low, b2Math.b2MinV(a, high));
|
|||
|
};
|
|||
|
b2Math.b2Swap = function(a, b)
|
|||
|
{
|
|||
|
var tmp = a[0];
|
|||
|
a[0] = b[0];
|
|||
|
b[0] = tmp;
|
|||
|
};
|
|||
|
b2Math.b2Random = function()
|
|||
|
{
|
|||
|
return Math.random() * 2 - 1;
|
|||
|
};
|
|||
|
b2Math.b2NextPowerOfTwo = function(x)
|
|||
|
{
|
|||
|
x |= (x >> 1) & 0x7FFFFFFF;
|
|||
|
x |= (x >> 2) & 0x3FFFFFFF;
|
|||
|
x |= (x >> 4) & 0x0FFFFFFF;
|
|||
|
x |= (x >> 8) & 0x00FFFFFF;
|
|||
|
x |= (x >> 16)& 0x0000FFFF;
|
|||
|
return x + 1;
|
|||
|
};
|
|||
|
b2Math.b2IsPowerOfTwo = function(x)
|
|||
|
{
|
|||
|
var result = x > 0 && (x & (x - 1)) == 0;
|
|||
|
return result;
|
|||
|
};
|
|||
|
b2Math.tempVec2 = new b2Vec2();
|
|||
|
b2Math.tempVec3 = new b2Vec2();
|
|||
|
b2Math.tempVec4 = new b2Vec2();
|
|||
|
b2Math.tempVec5 = new b2Vec2();
|
|||
|
b2Math.tempMat = new b2Mat22();
|