phaser/typescript/box2d.d.ts

3786 lines
154 KiB
TypeScript
Raw Normal View History

declare class box2d {
static DEBUG: boolean;
static ENABLE_ASSERTS: boolean;
static b2Assert(condition: boolean, opt_message?: string, ...var_args: any[]): void;
static b2_maxFloat: number;
static b2_epsilon: number;
static b2_epsilon_sq: number;
static b2_pi: number;
// The maximum number of contact points between two convex
// shapes. Do not change this value.
static b2_maxManifoldPoints: number;
// The maximum number of vertices on a convex polygon. You
// cannot increase this too much because b2BlockAllocator has a
// maximum object size.
static b2_maxPolygonVertices: number;
// This is used to fatten AABBs in the dynamic tree. This allows
// proxies to move by a small amount without triggering a tree
// adjustment.
// This is in meters.
static b2_aabbExtension: number;
// This is used to fatten AABBs in the dynamic tree. This is
// used to predict the future position based on the current
// displacement.
// This is a dimensionless multiplier.
static b2_aabbMultiplier: number;
// A small length used as a collision and constraint tolerance.
// Usually it is chosen to be numerically significant, but
// visually insignificant.
static b2_linearSlop: number;
// A small angle used as a collision and constraint tolerance.
// Usually it is chosen to be numerically significant, but
// visually insignificant.
static b2_angularSlop: number;
// The radius of the polygon/edge shape skin. This should not be
// modified. Making this smaller means polygons will have an
// insufficient buffer for continuous collision.
// Making it larger may create artifacts for vertex collision.
static b2_polygonRadius: number;
// Maximum number of sub-steps per contact in continuous physics
// simulation.
static b2_maxSubSteps: number;
// Maximum number of contacts to be handled to solve a TOI
// impact.
static b2_maxTOIContacts: number;
// A velocity threshold for elastic collisions. Any collision
// with a relative linear velocity below this threshold will be
// treated as inelastic.
static b2_velocityThreshold: number;
// The maximum linear position correction used when solving
// constraints. This helps to prevent overshoot.
static b2_maxLinearCorrection: number;
// The maximum angular position correction used when solving
// constraints. This helps to prevent overshoot.
static b2_maxAngularCorrection: number;
// The maximum linear velocity of a body. This limit is very
// large and is used to prevent numerical problems. You
// shouldn't need to adjust this.
static b2_maxTranslation: number;
static b2_maxTranslationSquared: number;
// The maximum angular velocity of a body. This limit is very
// large and is used to prevent numerical problems. You
// shouldn't need to adjust this.
static b2_maxRotation: number;
static b2_maxRotationSquared: number;
// This scale factor controls how fast overlap is resolved.
// Ideally this would be 1 so that overlap is removed in one
// time step. However using values close to 1 often lead to
// overshoot.
static b2_baumgarte: number;
static b2_toiBaumgarte: number;
// The time that a body must be still before it will go to
// sleep.
static b2_timeToSleep: number;
// A body cannot sleep if its linear velocity is above this
// tolerance.
static b2_linearSleepTolerance: number;
// A body cannot sleep if its angular velocity is above this
// tolerance.
static b2_angularSleepTolerance: number;
// Implement this function to use your own memory allocator.
static b2Alloc(size: number): any;
// If you implement b2Alloc, you should also implement this
// function.
static b2Free(mem: any): void;
// Logging function.
// You can modify this to use your logging facility.
static b2Log(...var_args: any[]): void;
// Current version.
static b2_version: box2d.b2Version;
static b2_changelist: number;
static b2ParseInt(v: string): number;
static b2ParseUInt(v: string): number;
static b2MakeArray(length?: number, init?: (length: number) => any): Array<any>;
static b2MakeNumberArray(length?: number): Array<number>;
static b2_pi_over_180: number;
static b2_180_over_pi: number;
static b2_two_pi: number;
static b2Abs(n: number): number;
static b2Min(a: number, b: number): number;
static b2Max(a: number, b: number): number;
static b2Clamp(a: number, lo: number, hi: number): number;
static b2Swap(a: Array<number>, b: Array<number>): void;
// This function is used to ensure that a floating point number
// is not a NaN or infinity.
static b2IsValid(n: number): boolean;
static b2Sq(n: number): number;
// This is a approximate yet fast inverse square-root.
static b2InvSqrt(n: number): number;
static b2Sqrt(n: number): number;
static b2Pow(x: number, y: number): number;
static b2DegToRad(degrees: number): number;
static b2RadToDeg(radians: number): number;
static b2Cos(radians: number): number;
static b2Sin(radians: number): number;
static b2Acos(n: number): number;
static b2Asin(n: number): number;
static b2Atan2(y: number, x: number): number;
// 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 as x, but all 1's
// below it. Adding 1 to that value yields the next largest
// power of 2. For a 32-bit value:
static b2NextPowerOfTwo(x: number): number;
static b2IsPowerOfTwo(x: number): boolean;
static b2Random(): number;
static b2RandomRange(lo: number, hi: number): number;
static b2Vec2_zero: box2d.b2Vec2;
static b2AbsV(v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2MinV(a: box2d.b2Vec2, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2MaxV(a: box2d.b2Vec2, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2ClampV(v: box2d.b2Vec2, lo: box2d.b2Vec2, hi: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2RotateV(v: box2d.b2Vec2, c: number, s: number, out: box2d.b2Vec2): box2d.b2Vec2;
static b2RotateRadiansV(v: box2d.b2Vec2, radians: number, out: box2d.b2Vec2): box2d.b2Vec2;
static b2RotateDegreesV(v: box2d.b2Vec2, degrees: number, out: box2d.b2Vec2): box2d.b2Vec2;
// Perform the dot product on two vectors.
// a.x * b.x + a.y * b.y
static b2DotVV(a: box2d.b2Vec2, b: box2d.b2Vec2): number;
// Perform the cross product on two vectors. In 2D this produces a scalar.
// a.x * b.y - a.y * b.x
static b2CrossVV(a: box2d.b2Vec2, b: box2d.b2Vec2): number;
// Perform the cross product on a vector and a scalar. In 2D
// this produces a vector.
static b2CrossVS(v: box2d.b2Vec2, s: number, out: box2d.b2Vec2): box2d.b2Vec2;
// box2d.b2CrossVS(v, 1.0, out)
static b2CrossVOne(v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Perform the cross product on a scalar and a vector. In 2D
// this produces a vector.
static b2CrossSV(s: number, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// box2d.b2CrossSV(1.0, v, out)
static b2CrossOneV(v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Add two vectors component-wise.
static b2AddVV(a: box2d.b2Vec2, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Subtract two vectors component-wise.
static b2SubVV(a: box2d.b2Vec2, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2MulSV(s: number, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// out = a + (s * b)
static b2AddVMulSV(a: box2d.b2Vec2, s: number, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// out = a - (s * b)
static b2SubVMulSV(a: box2d.b2Vec2, s: number, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// out = a + b2CrossSV(s, v)
static b2AddVCrossSV(a: box2d.b2Vec2, s: number, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Get the center of two vectors.
static b2MidVV(a: box2d.b2Vec2, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Get the extent of two vectors (half-widths).
static b2ExtVV(a: box2d.b2Vec2, b: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2IsEqualToV(a: box2d.b2Vec2, b: box2d.b2Vec2): boolean;
static b2DistanceVV(a: box2d.b2Vec2, b: box2d.b2Vec2): number;
static b2DistanceSquaredVV(a: box2d.b2Vec2, b: box2d.b2Vec2): number;
static b2NegV(v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Perform the dot product on two vectors.
static b2DotV3V3(a: box2d.b2Vec3, b: box2d.b2Vec3): number;
// Perform the cross product on two vectors.
static b2CrossV3V3(a: box2d.b2Vec3, b: box2d.b2Vec3, out: box2d.b2Vec3): box2d.b2Vec3;
static b2AbsM(M: box2d.b2Mat22, out: box2d.b2Mat22): box2d.b2Mat22;
// Multiply a matrix times a vector. If a rotation matrix is
// provided, then this transforms the vector from one frame to
// another.
static b2MulMV(M: box2d.b2Mat22, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Multiply a matrix transpose times a vector. If a rotation
// matrix is provided, then this transforms the vector from one
// frame to another (inverse transform).
static b2MulTMV(M: box2d.b2Mat22, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2AddMM(A: box2d.b2Mat22, B: box2d.b2Mat22, out: box2d.b2Mat22): box2d.b2Mat22;
static b2MulMM(A: box2d.b2Mat22, B: box2d.b2Mat22, out: box2d.b2Mat22): box2d.b2Mat22;
static b2MulTMM(A: box2d.b2Mat22, B: box2d.b2Mat22, out: box2d.b2Mat22): box2d.b2Mat22;
// Multiply a matrix times a vector.
static b2MulM33V3(A: box2d.b2Mat33, v: box2d.b2Vec3, out: box2d.b2Vec3): box2d.b2Vec3;
static b2MulM33XYZ(A: box2d.b2Mat33, x: number, y: number, z: number, out: box2d.b2Vec3): box2d.b2Vec3;
static b2MulM33V2(A: box2d.b2Mat33, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2MulM33XY(A: box2d.b2Mat33, x: number, y: number, out: box2d.b2Vec2): box2d.b2Vec2;
// Multiply two rotations: q * r
static b2MulRR(q: box2d.b2Rot, r: box2d.b2Rot, out: box2d.b2Rot): box2d.b2Rot;
// Transpose multiply two rotations: qT * r
static b2MulTRR(q: box2d.b2Rot, r: box2d.b2Rot, out: box2d.b2Rot): box2d.b2Rot;
// Rotate a vector
static b2MulRV(q: box2d.b2Rot, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// Inverse rotate a vector
static b2MulTRV(q: box2d.b2Rot, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2MulXV(T: box2d.b2Transform, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
static b2MulTXV(T: box2d.b2Transform, v: box2d.b2Vec2, out: box2d.b2Vec2): box2d.b2Vec2;
// v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p
// = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p
static b2MulXX(A: box2d.b2Transform, B: box2d.b2Transform, out: box2d.b2Transform): box2d.b2Transform;
// v2 = A.q' * (B.q * v1 + B.p - A.p)
// = A.q' * B.q * v1 + A.q' * (B.p - A.p)
static b2MulTXX(A: box2d.b2Transform, B: box2d.b2Transform, out: box2d.b2Transform): box2d.b2Transform;
static b2_gjkCalls: number;
static b2_gjkIters: number;
static b2_gjkMaxIters: number;
// Compute the closest points between two shapes. Supports any combination of:
// box2d.b2CircleShape, box2d.b2PolygonShape, box2d.b2EdgeShape. The simplex cache is input/output.
// On the first call set box2d.b2SimplexCache.count to zero.
static b2Distance(output: box2d.b2DistanceOutput, cache: box2d.b2SimplexCache, input: box2d.b2DistanceInput): void;
// Compute the point states given two manifolds. The states
// pertain to the transition from manifold1 to manifold2. So
// state1 is either persist or remove while state2 is either add
// or persist.
static b2GetPointStates(state1: Array<box2d.b2PointState>, state2: Array<box2d.b2PointState>, manifold1: box2d.b2Manifold, manifold2: box2d.b2Manifold): void;
static b2TestOverlapAABB(a: box2d.b2AABB, b: box2d.b2AABB): boolean;
// Clipping for contact manifolds.
// Sutherland-Hodgman clipping.
static b2ClipSegmentToLine(vOut: Array<box2d.b2ClipVertex>, vIn: Array<box2d.b2ClipVertex>, normal: box2d.b2Vec2, offset: number, vertexIndexA: number): number;
static b2TestOverlapShape(shapeA: box2d.b2Shape, shapeB: box2d.b2Shape, xfA: box2d.b2Transform, xfB: box2d.b2Transform): boolean;
static b2_toiTime: number;
static b2_toiMaxTime: number;
static b2_toiCalls: number;
static b2_toiIters: number;
static b2_toiMaxIters: number;
static b2_toiRootIters: number;
static b2_toiMaxRootIters: number;
// Compute the upper bound on time before two shapes penetrate.
// Time is represented as a fraction between [0,tMax]. This uses
// a swept separating axis and may miss some intermediate,
// non-tunneling collision. If you change the time interval, you
// should call this function again.
// Note: use box2d.b2Distance to compute the contact point and
// normal at the time of impact.
static b2TimeOfImpact(output: box2d.b2TOIOutput, input: box2d.b2TOIInput): void;
// Friction mixing law. The idea is to allow either fixture to
// drive the restitution to zero. For example, anything slides
// on ice.
static b2MixFriction(friction1: number, friction2: number): number;
// Restitution mixing law. The idea is allow for anything to
// bounce off an inelastic surface. For example, a superball
// bounces on anything.
static b2MixRestitution(restitution1: number, restitution2: number): number;
// Compute the collision manifold between an edge and a circle.
// Compute contact points for edge versus circle.
// This accounts for edge connectivity.
static b2CollideEdgeAndCircle(manifold: box2d.b2Manifold, edgeA: box2d.b2EdgeShape, xfA: box2d.b2Transform, circleB: box2d.b2CircleShape, xfB: box2d.b2Transform): void;
// Compute the collision manifold between an edge and a polygon.
static b2CollideEdgeAndPolygon(manifold: box2d.b2Manifold, edgeA: box2d.b2EdgeShape, xfA: box2d.b2Transform, polygonB: box2d.b2PolygonShape, xfB: box2d.b2Transform): void;
// Find the max separation between poly1 and poly2 using edge
// normals from poly1.
static b2FindMaxSeparation(edgeIndex: Array<number>, poly1: box2d.b2PolygonShape, xf1: box2d.b2Transform, poly2: box2d.b2PolygonShape, xf2: box2d.b2Transform): number;
static b2FindIncidentEdge(c: Array<box2d.b2ClipVertex>, poly1: box2d.b2PolygonShape, xf1: box2d.b2Transform, edge1: number, poly2: box2d.b2PolygonShape, xf2: box2d.b2Transform): void;
// Find edge normal of max separation on A - return if separating axis is found
// Find edge normal of max separation on B - return if separation axis is found
// Choose reference edge as min(minA, minB)
// Find incident edge
// Clip
// The normal points from 1 to 2
static b2CollidePolygons(manifold: box2d.b2Manifold, polyA: box2d.b2PolygonShape, xfA: box2d.b2Transform, polyB: box2d.b2PolygonShape, xfB: box2d.b2Transform): void;
// Compute the collision manifold between two circles.
static b2CollideCircles(manifold: box2d.b2Manifold, circleA: box2d.b2CircleShape, xfA: box2d.b2Transform, circleB: box2d.b2CircleShape, xfB: box2d.b2Transform): void;
// Compute the collision manifold between a polygon and a
// circle.
static b2CollidePolygonAndCircle(manifold: box2d.b2Manifold, polygonA: box2d.b2PolygonShape, xfA: box2d.b2Transform, circleB: box2d.b2CircleShape, xfB: box2d.b2Transform): void;
// This is used to sort pairs.
static b2PairLessThan(pair1: box2d.b2Pair, pair2: box2d.b2Pair): number;
static b2_minPulleyLength: number;
}
declare module box2d {
enum b2JointType {
e_unknownJoint = 0,
e_revoluteJoint = 1,
e_prismaticJoint = 2,
e_distanceJoint = 3,
e_pulleyJoint = 4,
e_mouseJoint = 5,
e_gearJoint = 6,
e_wheelJoint = 7,
e_weldJoint = 8,
e_frictionJoint = 9,
e_ropeJoint = 10,
e_motorJoint = 11,
e_areaJoint = 12
}
enum b2LimitState {
e_inactiveLimit = 0,
e_atLowerLimit = 1,
e_atUpperLimit = 2,
e_equalLimits = 3
}
enum b2ContactFeatureType {
e_vertex = 0,
e_face = 1
}
enum b2ManifoldType {
e_unknown = -1,
e_circles = 0,
e_faceA = 1,
e_faceB = 2
}
// This is used for determining the state of contact points.
enum b2PointState {
b2_nullState = 0, ///< point does not exist
b2_addState = 1, ///< point was added in the update
b2_persistState = 2, ///< point persisted across the update
b2_removeState = 3 ///< point was removed in the update
}
enum b2TOIOutputState {
e_unknown = 0,
e_failed = 1,
e_overlapped = 2,
e_touching = 3,
e_separated = 4
}
enum b2SeparationFunctionType {
e_unknown = -1,
e_points = 0,
e_faceA = 1,
e_faceB = 2
}
// Flags stored in m_flags
enum b2ContactFlag {
e_none = 0,
e_islandFlag = 0x0001, /// Used when crawling contact graph when forming islands.
e_touchingFlag = 0x0002, /// Set when the shapes are touching.
e_enabledFlag = 0x0004, /// This contact can be disabled (by user)
e_filterFlag = 0x0008, /// This contact needs filtering because a fixture filter was changed.
e_bulletHitFlag = 0x0010, /// This bullet contact had a TOI event
e_toiFlag = 0x0020 /// This contact has a valid TOI in m_toi
}
enum b2ShapeType {
e_unknown = -1,
e_circleShape = 0,
e_edgeShape = 1,
e_polygonShape = 2,
e_chainShape = 3,
e_shapeTypeCount = 4
}
enum b2EPAxisType {
e_unknown = 0,
e_edgeA = 1,
e_edgeB = 2
}
enum b2EPColliderVertexType {
e_isolated = 0,
e_concave = 1,
e_convex = 2
}
enum b2DrawFlags {
e_none = 0,
e_shapeBit = 0x0001, ///< draw shapes
e_jointBit = 0x0002, ///< draw joint connections
e_aabbBit = 0x0004, ///< draw axis aligned bounding boxes
e_pairBit = 0x0008, ///< draw broad-phase pairs
e_centerOfMassBit = 0x0010, ///< draw center of mass frame
e_controllerBit = 0x0020, /// @see box2d.b2Controller list
e_all = 0x003f
}
// The body type.
// enum= zero mass, zero velocity, may be manually moved
// kinematic= zero mass, non-zero velocity set by user, moved by solver
// dynamic= positive mass, non-zero velocity determined by forces, moved by solver
enum b2BodyType {
b2_unknown = -1,
b2_staticBody = 0,
b2_kinematicBody = 1,
b2_dynamicBody = 2,
b2_bulletBody = 3 // TODO_ERIN
}
enum b2BodyFlag {
e_none = 0,
e_islandFlag = 0x0001,
e_awakeFlag = 0x0002,
e_autoSleepFlag = 0x0004,
e_bulletFlag = 0x0008,
e_fixedRotationFlag = 0x0010,
e_activeFlag = 0x0020,
e_toiFlag = 0x0040
}
enum b2WorldFlag {
e_none = 0,
e_newFixture = 0x1,
e_locked = 0x2,
e_clearForces = 0x4
}
class b2Version {
// Version numberinf scheme See
// http://en.wikipedia.org/wiki/Software_versioning
constructor(major?: number, minor?: number, revision?: number);
major: number;
minor: number;
revision: number;
toString(): string;
}
class b2Vec2 {
// A 2D column vector.
constructor(x?: number, y?: number);
x: number;
y: number;
static ZERO: b2Vec2;
static UNITX: b2Vec2;
static UNITY: b2Vec2;
static s_t0: b2Vec2;
static s_t1: b2Vec2;
static s_t2: b2Vec2;
static s_t3: b2Vec2;
static MakeArray(length?: number): Array<b2Vec2>;
Clone(): b2Vec2;
// Set this vector to all zeros.
SetZero(): b2Vec2;
// Set this vector to some specified coordinates.
SetXY(x: number, y: number): b2Vec2;
Copy(other: b2Vec2): b2Vec2;
// Add a vector to this vector.
SelfAdd(v: b2Vec2): b2Vec2;
SelfAddXY(x: number, y: number): b2Vec2;
// Subtract a vector from this vector.
SelfSub(v: b2Vec2): b2Vec2;
SelfSubXY(x: number, y: number): b2Vec2;
// Multiply this vector by a scalar.
SelfMul(s: number): b2Vec2;
// this += s * v
SelfMulAdd(s: number, v: b2Vec2): b2Vec2;
// this -= s * v
SelfMulSub(s: number, v: b2Vec2): b2Vec2;
Dot(v: b2Vec2): number;
Cross(v: b2Vec2): number;
// Get the length of this vector (the norm).
Length(): number;
GetLength(): number;
// Get the length squared. For performance, use this instead of
// b2Vec2::Length (if possible).
LengthSquared(): number;
GetLengthSquared(): number;
// Convert this vector into a unit vector. Returns the length.
Normalize(): number;
SelfNormalize(): b2Vec2;
SelfRotate(c: number, s: number): b2Vec2;
SelfRotateRadians(radians: number): b2Vec2;
SelfRotateDegrees(degrees: number): b2Vec2;
// Does this vector contain finite coordinates?
IsValid(): boolean;
SelfCrossVS(s: number): b2Vec2;
SelfCrossSV(s: number): b2Vec2;
SelfMinV(v: b2Vec2): b2Vec2;
SelfMaxV(v: b2Vec2): b2Vec2;
SelfAbs(): b2Vec2;
SelfNeg(): b2Vec2;
// Get the skew vector such that dot(skew_vec, other) ===
// cross(vec, other)
SelfSkew(): b2Vec2;
}
class b2Vec3 {
constructor(x?: number, y?: number, z?: number);
x: number;
y: number;
z: number;
static ZERO: b2Vec3;
static s_t0: b2Vec3;
Clone(): b2Vec3;
SetZero(): b2Vec3;
SetXYZ(x: number, y: number, z: number): b2Vec3;
Copy(other: b2Vec3): b2Vec3;
SelfNeg(): b2Vec3;
SelfAdd(v: b2Vec3): b2Vec3;
SelfAddXYZ(x: number, y: number, z: number): b2Vec3;
SelfSub(v: b2Vec3): b2Vec3;
SelfSubXYZ(x: number, y: number, z: number): b2Vec3;
SelfMul(s: number): b2Vec3;
}
class b2Mat22 {
// A 2-by-2 matrix. Stored in column-major order.
constructor();
ex: b2Vec2;
ey: b2Vec2;
static IDENTITY: b2Mat22;
Clone(): b2Mat22;
// Construct this matrix using columns.
static FromVV(c1: b2Vec2, c2: b2Vec2): b2Mat22;
// Construct this matrix using scalars.
static FromSSSS(r1c1: number, r1c2: number, r2c1: number, r2c2: number): b2Mat22;
// Construct this matrix using an angle. This matrix becomes an
// orthonormal rotation matrix.
static FromAngleRadians(radians: number): b2Mat22;
// Initialize this matrix using scalars.
SetSSSS(r1c1: number, r1c2: number, r2c1: number, r2c2: number): b2Mat22;
// Initialize this matrix using columns.
SetVV(c1: b2Vec2, c2: b2Vec2): b2Mat22;
// Initialize this matrix using an angle. This matrix becomes an
// orthonormal rotation matrix.
SetAngle(radians: number): b2Mat22;
Copy(other: b2Mat22): b2Mat22;
// Set this to the identity matrix.
SetIdentity(): b2Mat22;
// Set this matrix to all zeros.
SetZero(): b2Mat22;
// Extract the angle from this matrix (assumed to be a rotation
// matrix).
GetAngle(): number;
GetInverse(out: b2Mat22): b2Mat22;
// Solve A * x = b, where b is a column vector. This is more
// efficient than computing the inverse in one-shot cases.
Solve(b_x: number, b_y: number, out: b2Vec2): b2Vec2;
SelfAbs(): b2Mat22;
SelfInv(): b2Mat22;
SelfAddM(M: b2Mat22): b2Mat22;
SelfSubM(M: b2Mat22): b2Mat22;
}
class b2Mat33 {
// A 3-by-3 matrix. Stored in column-major order.
constructor();
ex: b2Vec3;
ey: b2Vec3;
ez: b2Vec3;
static IDENTITY: b2Mat33;
Clone(): b2Mat33;
SetVVV(c1: b2Vec3, c2: b2Vec3, c3: b2Vec3): b2Mat33;
Copy(other: b2Mat33): b2Mat33;
SetIdentity(): b2Mat33;
// Set this matrix to all zeros.
SetZero(): b2Mat33;
SelfAddM(M: b2Mat33): b2Mat33;
// Solve A * x = b, where b is a column vector. This is more
// efficient than computing the inverse in one-shot cases.
Solve33(b_x: number, b_y: number, b_z: number, out: b2Vec3): b2Vec3;
// Solve A * x = b, where b is a column vector. This is more
// efficient than computing the inverse in one-shot cases. Solve
// only the upper 2-by-2 matrix equation.
Solve22(b_x: number, b_y: number, out: b2Vec2): b2Vec2;
// Get the inverse of this matrix as a 2-by-2.
// Returns the zero matrix if singular.
GetInverse22(M: b2Mat33): void;
// Get the symmetric inverse of this matrix as a 3-by-3.
// Returns the zero matrix if singular.
GetSymInverse33(M: b2Mat33): void;
}
class b2Rot {
// Rotation
// Initialize from an angle in radians
constructor(angle?: number);
angle: number;
s: number;
c: number;
static IDENTITY: b2Rot;
Clone(): b2Rot;
Copy(other: b2Rot): b2Rot;
// Set using an angle in radians.
SetAngle(angle: number): b2Rot;
// Set to the identity rotation
SetIdentity(): b2Rot;
// Get the angle in radians
GetAngle(): number;
// Get the x-axis
GetXAxis(out: b2Vec2): b2Vec2;
// Get the y-axis
GetYAxis(out: b2Vec2): b2Vec2;
}
class b2Transform {
// A transform contains translation and rotation. It is used to
// represent the position and orientation of rigid frames.
constructor();
p: b2Vec2;
q: b2Rot;
static IDENTITY: b2Transform;
Clone(): b2Transform;
Copy(other: b2Transform): b2Transform;
// Set this to the identity transform.
SetIdentity(): b2Transform;
// Set this based on the position and angle.
SetPositionRotation(position: b2Vec2, q: b2Rot): b2Transform;
SetPositionAngleRadians(pos: b2Vec2, a: number): b2Transform;
SetPosition(position: b2Vec2): b2Transform;
SetPositionXY(x: number, y: number): b2Transform;
SetRotation(rotation: b2Rot): b2Transform;
SetRotationAngleRadians(radians: number): b2Transform;
GetPosition(): b2Vec2;
GetRotation(): b2Rot;
GetRotationAngle(): number;
GetAngle(): number;
}
class b2Sweep {
// This describes the motion of a body/shape for TOI computation.
// Shapes are defined with respect to the body origin, which may
// no coincide with the center of mass. However, to support dynamics
// we must interpolate the center of mass position.
constructor();
localCenter: b2Vec2;
c0: b2Vec2;
c: b2Vec2;
a0: number;
a: number;
// Fraction of the current time step in the range [0,1]
// c0 and a0 are the positions at alpha0.
alpha0: number;
Clone(): b2Sweep;
Copy(other: b2Sweep): b2Sweep;
// Get the interpolated transform at a specific time.
GetTransform(xf: b2Transform, beta: number): b2Transform;
// Advance the sweep forward, yielding a new initial state.
Advance(alpha: number): void;
// Normalize an angle in radians to be between -pi and pi
// (actually 0 and 2*pi)
Normalize(): void;
}
class b2ControllerEdge {
// A controller edge is used to connect bodies and controllers
// together in a bipartite graph.
constructor();
controller: b2Controller;
body: b2Body;
prevBody: b2ControllerEdge;
nextBody: b2ControllerEdge;
prevController: b2ControllerEdge;
nextController: b2ControllerEdge;
}
class b2Controller {
// Base class for controllers. Controllers are a convience for
// encapsulating common per-step functionality.
constructor();
m_world: b2World;
m_bodyList: b2ControllerEdge;
m_bodyCount: number;
m_prev: b2Controller;
m_next: b2Controller;
// Controllers override this to implement per-step
// functionality.
Step(step: b2TimeStep): void;
// Controllers override this to provide debug drawing.
Draw(debugDraw: b2Draw): void;
// Get the next controller in the world's body list.
GetNext(): b2Controller;
// Get the previous controller in the world's body list.
GetPrev(): b2Controller;
// Get the parent world of this body.
GetWorld(): b2World;
// Get the attached body list
GetBodyList(): b2ControllerEdge;
// Adds a body to the controller list.
AddBody(body: b2Body): void;
// Removes a body from the controller list.
RemoveBody(body: b2Body): void;
// Removes all bodies from the controller list.
Clear(): void;
}
class b2ConstantAccelController extends b2Controller {
// Applies a force every frame
constructor();
// The acceleration to apply
A: b2Vec2;
Step(step: b2TimeStep): void;
// The force to apply
F: b2Vec2;
}
class b2Jacobian {
constructor();
linear: b2Vec2;
angularA: number;
angularB: number;
SetZero(): b2Jacobian;
Set(x: b2Vec2, a1: number, a2: number): b2Jacobian;
}
class b2JointEdge {
// A joint edge is used to connect bodies and joints together in
// a joint graph where each body is a node and each joint is an
// edge. A joint edge belongs to a doubly linked list maintained
// in each attached body. Each joint has two joint nodes, one
// for each attached body.
constructor();
other: b2Body;
joint: b2Joint;
prev: b2JointEdge;
next: b2JointEdge;
}
class b2JointDef {
// Joint definitions are used to construct joints.
constructor(type: b2JointType);
// The joint type is set automatically for concrete joint types.
type: b2JointType;
// Use this to attach application specific data to your joints.
userData: any;
// The first attached body.
bodyA: b2Body;
// The second attached body.
bodyB: b2Body;
// Set this flag to true if the attached bodies should collide.
collideConnected: boolean;
}
class b2Joint {
// The base joint class. Joints are used to constraint two
// bodies together in various fashions. Some joints also feature
// limits and motors.
constructor();
m_type: b2JointType;
m_prev: b2Joint;
m_next: b2Joint;
m_edgeA: b2JointEdge;
m_edgeB: b2JointEdge;
m_bodyA: b2Body;
m_bodyB: b2Body;
m_index: number;
m_islandFlag: boolean;
m_collideConnected: boolean;
m_userData: any;
// Get the anchor point on bodyA in world coordinates.
GetAnchorA(out: b2Vec2): b2Vec2;
// Get the anchor point on bodyB in world coordinates.
GetAnchorB(out: b2Vec2): b2Vec2;
// Get the reaction force on bodyB at the joint anchor in
// Newtons.
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
// Get the reaction torque on bodyB in N*m.
GetReactionTorque(inv_dt: number): number;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
// This returns true if the position errors are within
// tolerance.
SolvePositionConstraints(data: b2SolverData): boolean;
// Get the type of the concrete joint.
GetType(): b2JointType;
// Get the first body attached to this joint.
GetBodyA(): b2Body;
// Get the second body attached to this joint.
GetBodyB(): b2Body;
// Get the next joint the world joint list.
GetNext(): b2Joint;
// Get the user data pointer.
GetUserData(): any;
// Set the user data pointer.
SetUserData(data: any): void;
// Get collide connected.
// Note: modifying the collide connect flag won't work correctly
// because the flag is only checked when fixture AABBs begin to
// overlap.
GetCollideConnected(): boolean;
// Dump this joint to the log file.
Dump(): void;
// Short-cut function to determine if either body is inactive.
IsActive(): boolean;
// Shift the origin for any points stored in world coordinates.
ShiftOrigin(newOrigin: b2Vec2): void;
}
class b2RevoluteJointDef extends b2JointDef {
// Revolute joint definition. This requires defining an anchor
// point where the bodies are joined. The definition uses local
// anchor points so that the initial configuration can violate
// the constraint slightly. You also need to specify the initial
// relative angle for joint limits. This helps when saving and
// loading a game.
// The local anchor points are measured from the body's origin
// rather than the center of mass because:
// 1. you might not know where the center of mass will be.
// 2. if you add/remove shapes from a body and recompute the
// mass, the joints will be broken.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The bodyB angle minus bodyA angle in the reference state
// (radians).
referenceAngle: number;
// A flag to enable joint limits.
enableLimit: boolean;
// The lower angle for the joint limit (radians).
lowerAngle: number;
// The upper angle for the joint limit (radians).
upperAngle: number;
// A flag to enable the joint motor.
enableMotor: boolean;
// The desired motor speed. Usually in radians per second.
motorSpeed: number;
// The maximum motor torque used to achieve the desired motor
// speed.
// Usually in N-m.
maxMotorTorque: number;
Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2): void;
}
class b2RevoluteJoint extends b2Joint {
// A revolute joint constrains two bodies to share a common
// point while they are free to rotate about the point. The
// relative rotation about the shared point is the joint angle.
// You can limit the relative rotation with a joint limit that
// specifies a lower and upper angle. You can use a motor to
// drive the relative rotation about the shared point. A maximum
// motor torque is provided so that infinite forces are not
// generated.
constructor(def: b2RevoluteJointDef);
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_impulse: b2Vec3;
m_motorImpulse: number;
m_enableMotor: boolean;
m_maxMotorTorque: number;
m_motorSpeed: number;
m_enableLimit: boolean;
m_referenceAngle: number;
m_lowerAngle: number;
m_upperAngle: number;
m_indexA: number;
m_indexB: number;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_mass: b2Mat33;
m_motorMass: number;
m_limitState: b2LimitState;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
m_K: b2Mat22;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
// Get the reaction force given the inverse time step.
// Unit is N.
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
// Get the reaction torque due to the joint limit given the
// inverse time step.
// Unit is N*m.
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out?: b2Vec2): b2Vec2;
// Get the reference angle.
GetReferenceAngle(): number;
GetJointAngleRadians(): number;
GetJointSpeed(): number;
IsMotorEnabled(): boolean;
EnableMotor(flag: boolean): void;
// Get the current motor torque given the inverse time step.
// Unit is N*m.
GetMotorTorque(inv_dt: number): number;
GetMotorSpeed(): number;
SetMaxMotorTorque(torque: number): void;
GetMaxMotorTorque(): number;
IsLimitEnabled(): boolean;
EnableLimit(flag: boolean): void;
GetLowerLimit(): number;
GetUpperLimit(): number;
SetLimits(lower: number, upper: number): void;
SetMotorSpeed(speed: number): void;
// Dump to b2Log.
Dump(): void;
}
class b2PrismaticJointDef extends b2JointDef {
// Prismatic joint definition. This requires defining a line of
// motion using an axis and an anchor point. The definition uses
// local anchor points and a local axis so that the initial
// configuration can violate the constraint slightly. The joint
// translation is zero when the local anchor points coincide in
// world space. Using local anchors and a local axis helps when
// saving and loading a game.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The local translation unit axis in bodyA.
localAxisA: b2Vec2;
// The constrained angle between the bodies: bodyB_angle -
// bodyA_angle.
referenceAngle: number;
// Enable/disable the joint limit.
enableLimit: boolean;
// The lower translation limit, usually in meters.
lowerTranslation: number;
// The upper translation limit, usually in meters.
upperTranslation: number;
// Enable/disable the joint motor.
enableMotor: boolean;
// The maximum motor torque, usually in N-m.
maxMotorForce: number;
// The desired motor speed in radians per second.
motorSpeed: number;
// Initialize the bodies, anchors, axis, and reference angle
// using the world anchor and unit world axis.
Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2, axis: b2Vec2): void;
}
class b2PrismaticJoint extends b2Joint {
// A prismatic joint. This joint provides one degree of freedom:
// translation along an axis fixed in bodyA. Relative rotation
// is prevented. You can use a joint limit to restrict the range
// of motion and a joint motor to drive the motion or to model
// joint friction.
constructor(def: b2PrismaticJointDef);
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_localXAxisA: b2Vec2;
m_localYAxisA: b2Vec2;
m_referenceAngle: number;
m_impulse: b2Vec3;
m_motorImpulse: number;
m_lowerTranslation: number;
m_upperTranslation: number;
m_maxMotorForce: number;
m_motorSpeed: number;
m_enableLimit: boolean;
m_enableMotor: boolean;
m_limitState: b2LimitState;
m_indexA: number;
m_indexB: number;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_axis: b2Vec2;
m_perp: b2Vec2;
m_s1: number;
m_s2: number;
m_a1: number;
m_a2: number;
m_K: b2Mat33;
m_K3: b2Mat33;
m_K2: b2Mat22;
m_motorMass: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
m_rA: b2Vec2;
m_rB: b2Vec2;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out: b2Vec2): b2Vec2;
// The local joint axis relative to bodyA.
GetLocalAxisA(out: b2Vec2): b2Vec2;
// Get the reference angle.
GetReferenceAngle(): number;
GetJointTranslation(): number;
GetJointSpeed(): number;
IsLimitEnabled(): boolean;
EnableLimit(flag: boolean): void;
GetLowerLimit(): number;
GetUpperLimit(): number;
SetLimits(upper: number, lower: number): void;
IsMotorEnabled(): boolean;
EnableMotor(flag: boolean): void;
SetMotorSpeed(speed: number): void;
GetMotorSpeed(): number;
SetMaxMotorForce(force: number): void;
GetMaxMotorForce(): number;
GetMotorForce(inv_dt: number): number;
// Dump to b2Log
Dump(): void;
}
class b2GearJointDef extends b2JointDef {
// Gear joint definition. This definition requires two existing
// revolute or prismatic joints (any combination will work).
constructor();
// The first revolute/prismatic joint attached to the gear
// joint.
joint1: b2Joint;
// The second revolute/prismatic joint attached to the gear
// joint.
joint2: b2Joint;
// The gear ratio.
ratio: number;
}
class b2GearJoint extends b2Joint {
// A gear joint is used to connect two joints together. Either
// joint can be a revolute or prismatic joint. You specify a
// gear ratio to bind the motions together:
// coordinateA + ratio * coordinateB = constant
// The ratio can be negative or positive. If one joint is a
// revolute joint and the other joint is a prismatic joint, then
// the ratio will have units of length or units of 1/length.
// warning You have to manually destroy the gear joint if jointA
// or jointB is destroyed.
constructor(def: b2GearJointDef);
m_joint1: b2Joint;
m_joint2: b2Joint;
m_typeA: b2JointType;
m_typeB: b2JointType;
m_bodyC: b2Body;
m_bodyD: b2Body;
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_localAnchorC: b2Vec2;
m_localAnchorD: b2Vec2;
m_localAxisC: b2Vec2;
m_localAxisD: b2Vec2;
m_referenceAngleA: number;
m_referenceAngleB: number;
m_constant: number;
m_ratio: number;
m_impulse: number;
m_indexA: number;
m_indexB: number;
m_indexC: number;
m_indexD: number;
m_lcA: b2Vec2;
m_lcB: b2Vec2;
m_lcC: b2Vec2;
m_lcD: b2Vec2;
m_mA: number;
m_mB: number;
m_mC: number;
m_mD: number;
m_iA: number;
m_iB: number;
m_iC: number;
m_iD: number;
m_JvAC: b2Vec2;
m_JvBD: b2Vec2;
m_JwA: number;
m_JwB: number;
m_JwC: number;
m_JwD: number;
m_mass: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_qC: b2Rot;
m_qD: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
m_lalcC: b2Vec2;
m_lalcD: b2Vec2;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// Get the first joint.
GetJoint1(): b2Joint;
// Get the second joint.
GetJoint2(): b2Joint;
GetRatio(): number;
SetRatio(ratio: number): void;
// Dump joint to dmLog
Dump(): void;
}
class b2DistanceProxy {
// A distance proxy is used by the GJK algorithm.
// It encapsulates any shape.
constructor();
m_buffer: Array<b2Vec2>;
m_vertices: Array<b2Vec2>;
m_count: number;
m_radius: number;
Reset(): b2DistanceProxy;
// Initialize the proxy using the given shape. The shape must
// remain in scope while the proxy is in use.
SetShape(shape: b2Shape, index: number): void;
// Get the supporting vertex index in the given direction.
GetSupport(d: b2Vec2): number;
// Get the supporting vertex in the given direction.
GetSupportVertex(d: b2Vec2, out: b2Vec2): b2Vec2;
// Get the vertex count.
GetVertexCount(): number;
// Get a vertex by index. Used by box2d.b2Distance.
GetVertex(index: number): b2Vec2;
}
class b2SimplexCache {
// Used to warm start box2d.b2Distance.
// Set count to zero on first call.
constructor();
metric: number;
count: number;
indexA: Array<number>;
indexB: Array<number>;
Reset(): b2SimplexCache;
}
class b2DistanceInput {
// Input for box2d.b2Distance.
// You have to option to use the shape radii in the computation.
constructor();
proxyA: b2DistanceProxy;
proxyB: b2DistanceProxy;
transformA: b2Transform;
transformB: b2Transform;
useRadii: boolean;
Reset(): b2DistanceInput;
}
class b2DistanceOutput {
// Output for box2d.b2Distance.
constructor();
pointA: b2Vec2;
pointB: b2Vec2;
distance: number;
iterations: number;
Reset(): b2DistanceOutput;
}
class b2SimplexVertex {
constructor();
wA: b2Vec2;
wB: b2Vec2;
w: b2Vec2;
a: number;
indexA: number;
indexB: number;
Copy(other: b2SimplexVertex): b2SimplexVertex;
}
class b2Simplex {
constructor();
m_v1: b2SimplexVertex;
m_v2: b2SimplexVertex;
m_v3: b2SimplexVertex;
m_vertices: Array<b2SimplexVertex>;
m_count: number;
ReadCache(cache: b2SimplexCache, proxyA: b2DistanceProxy, transformA: b2Transform, proxyB: b2DistanceProxy, transformB: b2Transform): void;
WriteCache(cache: b2SimplexCache): void;
GetSearchDirection(out: b2Vec2): b2Vec2;
GetClosestPoint(out: b2Vec2): b2Vec2;
GetWitnessPoints(pA: b2Vec2, pB: b2Vec2): void;
GetMetric(): number;
// Solve a line segment using barycentric coordinates.
//
// p = a1 * w1 + a2 * w2
// a1 + a2 = 1
//
// The vector from the origin to the closest point on the line is
// perpendicular to the line.
// e12 = w2 - w1
// dot(p, e) = 0
// a1 * dot(w1, e) + a2 * dot(w2, e) = 0
//
// 2-by-2 linear system
// [1 1 ][a1] = [1]
// [w1.e12 w2.e12][a2] = [0]
//
// Define
// d12_1 = dot(w2, e12)
// d12_2 = -dot(w1, e12)
// d12 = d12_1 + d12_2
//
// Solution
// a1 = d12_1 / d12
// a2 = d12_2 / d12
//
Solve2(): void;
// Possible regions:
// - points[2]
// - edge points[0]-points[2]
// - edge points[1]-points[2]
// - inside the triangle
Solve3(): void;
}
class b2WeldJointDef extends b2JointDef {
// Weld joint definition. You need to specify local anchor
// points where they are attached and the relative body angle.
// The position of the anchor points is important for computing
// the reaction torque.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The bodyB angle minus bodyA angle in the reference state
// (radians).
referenceAngle: number;
// The mass-spring-damper frequency in Hertz. Rotation only.
// Disable softness with a value of 0.
frequencyHz: number;
// The damping ratio. 0 = no damping, 1 = critical damping.
dampingRatio: number;
Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2): void;
}
class b2WeldJoint extends b2Joint {
// A weld joint essentially glues two bodies together. A weld
// joint may distort somewhat because the island constraint
// solver is approximate.
constructor(def: b2WeldJointDef);
m_frequencyHz: number;
m_dampingRatio: number;
m_bias: number;
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_referenceAngle: number;
m_gamma: number;
m_impulse: b2Vec3;
m_indexA: number;
m_indexB: number;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_mass: b2Mat33;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
m_K: b2Mat33;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out: b2Vec2): b2Vec2;
// Get the reference angle.
GetReferenceAngle(): number;
// Set/get frequency in Hz.
SetFrequency(hz: number): void;
GetFrequency(): number;
// Set/get damping ratio.
SetDampingRatio(ratio: number): void;
GetDampingRatio(): number;
// Dump to b2Log
Dump(): void;
}
class b2RopeJointDef extends b2JointDef {
// Rope joint definition. This requires two body anchor points
// and a maximum lengths.
// Note: by default the connected objects will not collide. see
// collideConnected in box2d.b2JointDef.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The maximum length of the rope.
// Warning: this must be larger than box2d.b2_linearSlop or the
// joint will have no effect.
maxLength: number;
}
class b2RopeJoint extends b2Joint {
// A rope joint enforces a maximum distance between two points
// on two bodies. It has no other effect.
// Warning: if you attempt to change the maximum length during
// the simulation you will get some non-physical behavior. A
// model that would allow you to dynamically modify the length
// would have some sponginess, so I chose not to implement it
// that way. See box2d.b2DistanceJoint if you want to
// dynamically control length.
constructor(def: b2RopeJointDef);
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_maxLength: number;
m_length: number;
m_impulse: number;
m_indexA: number;
m_indexB: number;
m_u: b2Vec2;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_mass: number;
m_state: b2LimitState;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out: b2Vec2): b2Vec2;
// Set/Get the maximum length of the rope.
SetMaxLength(length: number): void;
GetMaxLength(): number;
GetLimitState(): b2LimitState;
// Dump joint to dmLog
Dump(): void;
}
class b2GravityController extends b2Controller {
// Applies simplified gravity between every pair of bodies
constructor();
// Specifies the strength of the gravitiation force
G: number;
// If true, gravity is proportional to r^-2, otherwise r^-1
invSqr: boolean;
Step(step: b2TimeStep): void;
}
class b2Profile {
// Profiling data. Times are in milliseconds.
constructor();
step: number;
collide: number;
solve: number;
solveInit: number;
solveVelocity: number;
solvePosition: number;
broadphase: number;
solveTOI: number;
Reset(): b2Profile;
}
class b2TimeStep {
// This is an internal structure.
constructor();
dt: number;
inv_dt: number;
dtRatio: number;
velocityIterations: number;
positionIterations: number;
warmStarting: boolean;
Copy(step: b2TimeStep): b2TimeStep;
}
class b2Position {
// This is an internal structure.
constructor();
c: b2Vec2;
a: number;
static MakeArray(length: number): Array<b2Position>;
}
class b2Velocity {
// This is an internal structure.
constructor();
v: b2Vec2;
w: number;
static MakeArray(length: number): Array<b2Velocity>;
}
class b2SolverData {
// Solver Data
constructor();
step: b2TimeStep;
positions: Array<b2Position>;
velocities: Array<b2Velocity>;
}
class b2ContactFeature {
// The features that intersect to form the contact point
// This must be 4 bytes or less.
constructor(id: b2ContactID);
_id: b2ContactID;
_indexA: number;
_indexB: number;
_typeA: number;
_typeB: number;
indexA: number;
indexB: number;
typeA: number;
typeB: number;
}
class b2ContactID {
// Contact ids to facilitate warm starting.
constructor();
cf: b2ContactFeature;
key: number;
Copy(o: b2ContactID): b2ContactID;
Clone(): b2ContactID;
}
class b2ManifoldPoint {
// A manifold point is a contact point belonging to a contact
// manifold. It holds details related to the geometry and dynamics
// of the contact points.
// The local point usage depends on the manifold type:
// -e_circles: the local center of circleB
// -e_faceA: the local center of cirlceB or the clip point of polygonB
// -e_faceB: the clip point of polygonA
// This structure is stored across time steps, so we keep it small.
// Note: the impulses are used for internal caching and may not
// provide reliable contact forces, especially for high speed collisions.
constructor();
localPoint: b2Vec2;
normalImpulse: number;
tangentImpulse: number;
id: b2ContactID;
static MakeArray(length: number): Array<b2ManifoldPoint>;
Reset(): void;
Copy(o: b2ManifoldPoint): b2ManifoldPoint;
}
class b2Manifold {
// A manifold for two touching convex shapes.
// Box2D supports multiple types of contact:
// - clip point versus plane with radius
// - point versus point with radius (circles)
// The local point usage depends on the manifold type:
// -e_circles: the local center of circleA
// -e_faceA: the center of faceA
// -e_faceB: the center of faceB
// Similarly the local normal usage:
// -e_circles: not used
// -e_faceA: the normal on polygonA
// -e_faceB: the normal on polygonB
// We store contacts in this way so that position correction can
// account for movement, which is critical for continuous physics.
// All contact scenarios must be expressed in one of these types.
// This structure is stored across time steps, so we keep it small.
constructor();
points: Array<b2ManifoldPoint>;
localNormal: b2Vec2;
localPoint: b2Vec2;
type: b2ManifoldType;
pointCount: number;
Reset(): void;
Copy(o: b2Manifold): b2Manifold;
Clone(): b2Manifold;
}
class b2WorldManifold {
// This is used to compute the current state of a contact
// manifold.
constructor();
normal: b2Vec2;
points: Array<b2Vec2>;
separations: Array<number>;
// Evaluate the manifold with supplied transforms. This assumes
// modest motion from the original state. This does not change
// the point count, impulses, etc. The radii must come from the
// shapes that generated the manifold.
Initialize(manifold: b2Manifold, xfA: b2Transform, radiusA: number, xfB: b2Transform, radiusB: number): void;
}
class b2ClipVertex {
// Used for computing contact manifolds.
constructor();
v: b2Vec2;
id: b2ContactID;
static MakeArray(length?: number): Array<b2ClipVertex>;
Copy(other: b2ClipVertex): b2ClipVertex;
}
class b2RayCastInput {
// Ray-cast input data. The ray extends from p1 to p1 +
// maxFraction * (p2 - p1).
constructor();
p1: b2Vec2;
p2: b2Vec2;
maxFraction: number;
Copy(o: b2RayCastInput): b2RayCastInput;
}
class b2RayCastOutput {
// Ray-cast output data. The ray hits at p1 + fraction * (p2 -
// p1), where p1 and p2 come from box2d.b2RayCastInput.
constructor();
normal: b2Vec2;
fraction: number;
Copy(o: b2RayCastOutput): b2RayCastOutput;
}
class b2AABB {
// An axis aligned bounding box.
constructor();
lowerBound: b2Vec2;
upperBound: b2Vec2;
m_out_center: b2Vec2;
m_out_extent: b2Vec2;
Copy(o: b2AABB): b2AABB;
// Verify that the bounds are sorted.
IsValid(): boolean;
// Get the center of the AABB.
GetCenter(): b2Vec2;
// Get the extents of the AABB (half-widths).
GetExtents(): b2Vec2;
// Get the perimeter length
GetPerimeter(): number;
// Combine an AABB into this one.
Combine1(aabb: b2AABB): b2AABB;
// Combine two AABBs into this one.
Combine2(aabb1: b2AABB, aabb2: b2AABB): b2AABB;
static Combine(aabb1: b2AABB, aabb2: b2AABB, out: b2AABB): b2AABB;
// Does this aabb contain the provided AABB.
Contains(aabb: b2AABB): boolean;
// From Real-time Collision Detection, p179.
RayCast(output: b2RayCastOutput, input: b2RayCastInput): boolean;
TestOverlap(other: b2AABB): boolean;
}
class b2Timer {
// Timer for profiling. This has platform specific code and may
// not work on every platform.
constructor();
m_start: number;
Reset(): b2Timer;
GetMilliseconds(): number;
}
class b2Counter {
constructor();
m_count: number;
m_min_count: number;
m_max_count: number;
GetCount(): number;
GetMinCount(): number;
GetMaxCount(): number;
ResetCount(): number;
ResetMinCount(): void;
ResetMaxCount(): void;
Increment(): void;
Decrement(): void;
}
class b2TOIInput {
// Input parameters for b2TimeOfImpact
constructor();
proxyA: b2DistanceProxy;
proxyB: b2DistanceProxy;
sweepA: b2Sweep;
sweepB: b2Sweep;
tMax: number;
}
class b2TOIOutput {
// Output parameters for b2TimeOfImpact.
constructor();
state: b2TOIOutputState;
t: number;
}
class b2SeparationFunction {
constructor();
m_proxyA: b2DistanceProxy;
m_proxyB: b2DistanceProxy;
m_sweepA: b2Sweep;
m_sweepB: b2Sweep;
m_type: b2SeparationFunctionType;
m_localPoint: b2Vec2;
m_axis: b2Vec2;
// TODO_ERIN might not need to return the separation
Initialize(cache: b2SimplexCache, proxyA: b2DistanceProxy, sweepA: b2Sweep, proxyB: b2DistanceProxy, sweepB: b2Sweep, t1: number): number;
FindMinSeparation(indexA: Array<number>, indexB: Array<number>, t: number): number;
Evaluate(indexA: number, indexB: number, t: number): number;
}
class b2ContactEdge {
// A contact edge is used to connect bodies and contacts
// together in a contact graph where each body is a node and
// each contact is an edge. A contact edge belongs to a doubly
// linked list maintained in each attached body. Each contact
// has two contact nodes, one for each attached body.
constructor();
other: b2Body;
contact: b2Contact;
prev: b2ContactEdge;
next: b2ContactEdge;
}
class b2Contact {
// The class manages contact between two shapes. A contact
// exists for each overlapping AABB in the broad-phase (except
// if filtered). Therefore a contact object may exist that has
// no contact points.
constructor();
m_flags: b2ContactFlag;
// World pool and list pointers.
m_prev: b2Contact;
m_next: b2Contact;
// Nodes for connecting bodies.
m_nodeA: b2ContactEdge;
m_nodeB: b2ContactEdge;
m_fixtureA: b2Fixture;
m_fixtureB: b2Fixture;
m_indexA: number;
m_indexB: number;
m_manifold: b2Manifold;
m_toiCount: number;
m_toi: number;
m_friction: number;
m_restitution: number;
m_tangentSpeed: number;
m_oldManifold: b2Manifold;
// Get the contact manifold. Do not modify the manifold unless
// you understand the internals of Box2D.
GetManifold(): b2Manifold;
// Get the world manifold.
GetWorldManifold(worldManifold: b2WorldManifold): void;
// Is this contact touching?
IsTouching(): boolean;
// Enable/disable this contact. This can be used inside the
// pre-solve contact listener. The contact is only disabled for
// the current time step (or sub-step in continuous collisions).
SetEnabled(flag: boolean): void;
// Has this contact been disabled?
IsEnabled(): boolean;
// Get the next contact in the world's contact list.
GetNext(): b2Contact;
// Get fixture A in this contact.
GetFixtureA(): b2Fixture;
GetChildIndexA(): number;
// Get fixture B in this contact.
GetFixtureB(): b2Fixture;
GetChildIndexB(): number;
// Evaluate this contact with your own manifold and transforms.
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
// Flag this contact for filtering. Filtering will occur the
// next time step.
FlagForFiltering(): void;
// Override the default friction mixture. You can call this in
// box2d.b2ContactListener::PreSolve.
// This value persists until set or reset.
SetFriction(friction: number): void;
// Get the friction.
GetFriction(): number;
// Reset the friction mixture to the default value.
ResetFriction(): void;
// Override the default restitution mixture. You can call this
// in box2d.b2ContactListener::PreSolve.
// The value persists until you set or reset.
SetRestitution(restitution: number): void;
// Get the restitution.
GetRestitution(): number;
// Reset the restitution to the default value.
ResetRestitution(): void;
// Set the desired tangent speed for a conveyor belt behavior.
// In meters per second.
SetTangentSpeed(speed: number): void;
// Get the desired tangent speed. In meters per second.
GetTangentSpeed(): number;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
// Update the contact manifold and touching status.
// Note: do not assume the fixture AABBs are overlapping or are
// valid.
Update(listener: b2ContactListener): void;
ComputeTOI(sweepA: b2Sweep, sweepB: b2Sweep): number;
}
class b2PolygonAndCircleContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2EdgeAndPolygonContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2MassData {
// This holds the mass data computed for a shape.
constructor();
// The mass of the shape, usually in kilograms.
mass: number;
// The position of the shape's centroid relative to the shape's
// origin.
center: b2Vec2;
// The rotational inertia of the shape about the local origin.
I: number;
}
class b2Shape {
// A shape is used for collision detection. You can create a
// shape however you like.
// Shapes used for simulation in box2d.b2World are created
// automatically when a box2d.b2Fixture is created. Shapes may
// encapsulate a one or more child shapes.
constructor(type: b2ShapeType, radius: number);
m_type: b2ShapeType;
m_radius: number;
// Clone the concrete shape using the provided allocator.
Clone(): b2Shape;
Copy(other: b2Shape): b2Shape;
// Get the type of this shape. You can use this to down cast to
// the concrete shape.
GetType(): b2ShapeType;
// Get the number of child primitives.
GetChildCount(): number;
// Test a point for containment in this shape. This only works
// for convex shapes.
TestPoint(xf: b2Transform, p: b2Vec2): boolean;
// Cast a ray against a child shape.
RayCast(output: b2RayCastOutput, input: b2RayCastInput, transform: b2Transform, childIndex: number): boolean;
// Given a transform, compute the associated axis aligned
// bounding box for a child shape.
ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void;
// Compute the mass properties of this shape using its
// dimensions and density.
// The inertia tensor is computed about the local origin.
ComputeMass(massData: b2MassData, density: number): void;
SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void;
ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number;
// Dump this shape to the log file.
Dump(): void;
}
class b2PolygonShape extends b2Shape {
// A convex polygon. It is assumed that the interior of the
// polygon is to the left of each edge.
// Polygons have a maximum number of vertices equal to
// box2d.b2_maxPolygonVertices. In most cases you should not
// need many vertices for a convex polygon.
constructor();
m_centroid: b2Vec2;
m_vertices: Array<b2Vec2>;
m_normals: Array<b2Vec2>;
m_count: number;
// Implement box2d.b2Shape.
Clone(): b2Shape;
Copy(other: b2Shape): b2Shape;
// Build vertices to represent an axis-aligned box centered on
// the local origin.
SetAsBox(hx: number, hy: number): b2PolygonShape;
// Build vertices to represent an oriented box.
SetAsOrientedBox(hx: number, hy: number, center: b2Vec2, angle: number): b2PolygonShape;
// Create a convex hull from the given array of local points.
// The count must be in the range [3, b2_maxPolygonVertices].
// warning the points may be re-ordered, even if they form a
// convex polygon
// warning collinear points are handled but not removed.
// Collinear points may lead to poor stacking behavior.
Set(vertices: Array<b2Vec2>, count?: number): b2PolygonShape;
SetAsVector(vertices: Array<b2Vec2>, count?: number): b2PolygonShape;
SetAsArray(vertices: Array<b2Vec2>, count?: number): b2PolygonShape;
// Implement box2d.b2Shape.
GetChildCount(): number;
TestPoint(xf: b2Transform, p: b2Vec2): boolean;
// Implement box2d.b2Shape.
RayCast(output: b2RayCastOutput, input: b2RayCastInput, xf: b2Transform, childIndex: number): boolean;
ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void;
ComputeMass(massData: b2MassData, density: number): void;
// Validate convexity. This is a very time consuming operation.
Validate(): boolean;
SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void;
ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number;
// Dump this shape to the log file.
Dump(): void;
static ComputeCentroid(vs: Array<b2Vec2>, count: number, out: b2Vec2): b2Vec2;
}
class b2EPAxis {
// This structure is used to keep track of the best separating
// axis.
constructor();
type: b2EPAxisType;
index: number;
separation: number;
}
class b2TempPolygon {
// This holds polygon B expressed in frame A.
constructor();
vertices: Array<b2Vec2>;
normals: Array<b2Vec2>;
count: number;
}
class b2ReferenceFace {
// Reference face used for clipping
constructor();
i1: number;
i2: number;
v1: b2Vec2;
v2: b2Vec2;
normal: b2Vec2;
sideNormal1: b2Vec2;
sideOffset1: number;
sideNormal2: b2Vec2;
sideOffset2: number;
}
class b2EPCollider {
// This class collides and edge and a polygon, taking into
// account edge adjacency.
constructor();
m_polygonB: b2TempPolygon;
m_xf: b2Transform;
m_centroidB: b2Vec2;
m_v0: b2Vec2;
m_v1: b2Vec2;
m_v2: b2Vec2;
m_v3: b2Vec2;
m_normal0: b2Vec2;
m_normal1: b2Vec2;
m_normal2: b2Vec2;
m_normal: b2Vec2;
m_type1: b2EPColliderVertexType;
m_type2: b2EPColliderVertexType;
m_lowerLimit: b2Vec2;
m_upperLimit: b2Vec2;
m_radius: number;
m_front: boolean;
// Algorithm:
// 1. Classify v1 and v2
// 2. Classify polygon centroid as front or back
// 3. Flip normal if necessary
// 4. Initialize normal range to [-pi, pi] about face normal
// 5. Adjust normal range according to adjacent edges
// 6. Visit each separating axes, only accept axes within the range
// 7. Return if _any_ axis indicates separation
// 8. Clip
Collide(manifold: b2Manifold, edgeA: b2EdgeShape, xfA: b2Transform, polygonB: b2PolygonShape, xfB: b2Transform): void;
ComputeEdgeSeparation(out: b2EPAxis): b2EPAxis;
ComputePolygonSeparation(out: b2EPAxis): b2EPAxis;
}
class b2EdgeShape extends b2Shape {
// A line segment (edge) shape. These can be connected in chains
// or loops to other edge shapes. The connectivity information
// is used to ensure correct contact normals.
constructor();
// These are the edge vertices
m_vertex1: b2Vec2;
m_vertex2: b2Vec2;
// Optional adjacent vertices. These are used for smooth
// collision.
m_vertex0: b2Vec2;
m_vertex3: b2Vec2;
m_hasVertex0: boolean;
m_hasVertex3: boolean;
// Set this as an isolated edge.
Set(v1: b2Vec2, v2: b2Vec2): b2EdgeShape;
// Implement box2d.b2Shape.
Clone(): b2Shape;
Copy(other: b2Shape): b2Shape;
GetChildCount(): number;
TestPoint(xf: b2Transform, p: b2Vec2): boolean;
// Implement box2d.b2Shape.
// p = p1 + t * d
// v = v1 + s * e
// p1 + t * d = v1 + s * e
// s * e - t * d = p1 - v1
RayCast(output: b2RayCastOutput, input: b2RayCastInput, xf: b2Transform, childIndex: number): boolean;
ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void;
ComputeMass(massData: b2MassData, density: number): void;
SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void;
ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number;
// Dump this shape to the log file.
Dump(): void;
}
class b2ChainShape extends b2Shape {
// A chain shape is a free form sequence of line segments.
// The chain has two-sided collision, so you can use inside and outside collision.
// Therefore, you may use any winding order.
// Since there may be many vertices, they are allocated using b2Alloc.
// Connectivity information is used to create smooth collisions.
// WARNING: The chain will not collide properly if there are self-intersections.
constructor();
// The vertices. Owned by this class.
m_vertices: Array<b2Vec2>;
// The vertex count.
m_count: number;
m_prevVertex: b2Vec2;
m_nextVertex: b2Vec2;
m_hasPrevVertex: boolean;
m_hasNextVertex: boolean;
// Create a loop. This automatically adjusts connectivity.
CreateLoop(vertices: Array<b2Vec2>, count?: number): b2ChainShape;
// Create a chain with isolated end vertices.
CreateChain(vertices: Array<b2Vec2>, count?: number): b2ChainShape;
// Establish connectivity to a vertex that precedes the first vertex.
// Don't call this for loops.
SetPrevVertex(prevVertex: b2Vec2): b2ChainShape;
// Establish connectivity to a vertex that follows the last vertex.
// Don't call this for loops.
SetNextVertex(nextVertex: b2Vec2): b2ChainShape;
// Implement box2d.b2Shape. Vertices are cloned using b2Alloc.
Clone(): b2Shape;
Copy(other: b2Shape): b2Shape;
GetChildCount(): number;
// Get a child edge.
GetChildEdge(edge: b2EdgeShape, index: number): void;
// This always return false.
TestPoint(xf: b2Transform, p: b2Vec2): boolean;
// Implement box2d.b2Shape.
RayCast(output: b2RayCastOutput, input: b2RayCastInput, xf: b2Transform, childIndex: number): boolean;
static s_edgeShape: b2EdgeShape;
ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void;
ComputeMass(massData: b2MassData, density: number): void;
SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void;
ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number;
// Dump this shape to the log file.
Dump(): void;
}
class b2ChainAndPolygonContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2PolygonContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2CircleContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2ChainAndCircleContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2EdgeAndCircleContact extends b2Contact {
constructor();
static Create(allocator: any): b2Contact;
static Destroy(contact: b2Contact, allocator: any): void;
Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void;
Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void;
}
class b2VelocityConstraintPoint {
constructor();
rA: b2Vec2;
rB: b2Vec2;
normalImpulse: number;
tangentImpulse: number;
normalMass: number;
tangentMass: number;
velocityBias: number;
static MakeArray(length: number): Array<b2VelocityConstraintPoint>;
}
class b2ContactVelocityConstraint {
constructor();
points: Array<b2VelocityConstraintPoint>;
normal: b2Vec2;
tangent: b2Vec2;
normalMass: b2Mat22;
K: b2Mat22;
indexA: number;
indexB: number;
invMassA: number;
invMassB: number;
invIA: number;
invIB: number;
friction: number;
restitution: number;
tangentSpeed: number;
pointCount: number;
contactIndex: number;
static MakeArray(length: number): Array<b2ContactVelocityConstraint>;
}
class b2ContactPositionConstraint {
constructor();
localPoints: Array<b2Vec2>;
localNormal: b2Vec2;
localPoint: b2Vec2;
indexA: number;
indexB: number;
invMassA: number;
invMassB: number;
localCenterA: b2Vec2;
localCenterB: b2Vec2;
invIA: number;
invIB: number;
type: b2ManifoldType;
radiusA: number;
radiusB: number;
pointCount: number;
static MakeArray(length: number): Array<b2ContactPositionConstraint>;
}
class b2ContactSolverDef {
constructor();
step: b2TimeStep;
contacts: Array<b2Contact>;
count: number;
positions: Array<b2Position>;
velocities: Array<b2Velocity>;
allocator: any;
}
class b2ContactSolver {
constructor();
m_step: b2TimeStep;
m_positions: Array<b2Position>;
m_velocities: Array<b2Velocity>;
m_allocator: any;
m_positionConstraints: Array<b2ContactPositionConstraint>;
m_velocityConstraints: Array<b2ContactVelocityConstraint>;
m_contacts: Array<b2Contact>;
m_count: number;
Initialize(def: b2ContactSolverDef): b2ContactSolver;
// Initialize position dependent portions of the velocity
// constraints.
InitializeVelocityConstraints(): void;
WarmStart(): void;
SolveVelocityConstraints(): void;
StoreImpulses(): void;
// Sequential solver.
SolvePositionConstraints(): boolean;
// Sequential position solver for position constraints.
SolveTOIPositionConstraints(toiIndexA: number, toiIndexB: number): boolean;
}
class b2PositionSolverManifold {
constructor();
normal: b2Vec2;
point: b2Vec2;
separation: number;
Initialize(pc: b2ContactPositionConstraint, xfA: b2Transform, xfB: b2Transform, index: number): void;
}
class b2DestructionListener {
// Joints and fixtures are destroyed when their associated body
// is destroyed. Implement this listener so that you may nullify
// references to these joints and shapes.
constructor();
// Called when any joint is about to be destroyed due to the
// destruction of one of its attached bodies.
SayGoodbyeJoint(joint: b2Joint): void;
// Called when any fixture is about to be destroyed due to the
// destruction of its parent body.
SayGoodbyeFixture(fixture: b2Fixture): void;
}
class b2ContactFilter {
// Implement this class to provide collision filtering. In other
// words, you can implement this class if you want finer control
// over contact creation.
constructor();
// Return true if contact calculations should be performed
// between these two shapes.
// warning for performance reasons this is only called when the
// AABBs begin to overlap.
ShouldCollide(fixtureA: b2Fixture, fixtureB: b2Fixture): boolean;
}
class b2ContactImpulse {
// Contact impulses for reporting. Impulses are used instead of
// forces because sub-step forces may approach infinity for
// rigid body collisions. These match up one-to-one with the
// contact points in b2Manifold.
constructor();
normalImpulses: Array<number>;
tangentImpulses: Array<number>;
count:number;
}
class b2ContactListener {
// Implement this class to get contact information. You can use
// these results for things like sounds and game logic. You can
// also get contact results by traversing the contact lists
// after the time step. However, you might miss some contacts
// because continuous physics leads to sub-stepping.
// Additionally you may receive multiple callbacks for the same
// contact in a single time step.
// You should strive to make your callbacks efficient because
// there may be many callbacks per time step.
// warning You cannot create/destroy Box2D entities inside these
// callbacks.
constructor();
// Called when two fixtures begin to touch.
BeginContact(contact: b2Contact): void;
// Called when two fixtures cease to touch.
EndContact(contact: b2Contact): void;
// This is called after a contact is updated. This allows you to
// inspect a contact before it goes to the solver. If you are
// careful, you can modify the contact manifold (e.g. disable
// contact).
// A copy of the old manifold is provided so that you can detect
// changes.
// Note: this is called only for awake bodies.
// Note: this is called even when the number of contact points
// is zero.
// Note: this is not called for sensors.
// Note: if you set the number of contact points to zero, you
// will not get an EndContact callback. However, you may get a
// BeginContact callback the next step.
PreSolve(contact: b2Contact, oldManifold: b2Manifold): void;
// This lets you inspect a contact after the solver is finished.
// This is useful for inspecting impulses.
// Note: the contact manifold does not include time of impact
// impulses, which can be arbitrarily large if the sub-step is
// small. Hence the impulse is provided explicitly in a separate
// data structure.
// Note: this is only called for contacts that are touching,
// solid, and awake.
PostSolve(contact: b2Contact, impulse: b2ContactImpulse): void;
static b2_defaultListener: b2ContactListener;
}
class b2QueryCallback {
// Callback class for AABB queries.
// See b2World::Query
constructor();
// Called for each fixture found in the query AABB.
ReportFixture(): boolean;
}
class b2RayCastCallback {
// Callback class for ray casts.
// See b2World::RayCast
constructor();
// Called for each fixture found in the query. You control how
// the ray cast proceeds by returning a float:
// return -1: ignore this fixture and continue
// return 0: terminate the ray cast
// return fraction: clip the ray to this point
// return 1: don't clip the ray and continue
// of intersection
ReportFixture(fixture: b2Fixture, point: b2Vec2, normal: b2Vec2, fraction: number): number;
}
class b2Island {
// This is an internal class.
constructor();
m_allocator: any;
m_listener: b2ContactListener;
m_bodies: Array<b2Body>;
m_contacts: Array<b2Contact>;
m_joints: Array<b2Joint>;
m_positions: Array<b2Position>;
m_velocities: Array<b2Velocity>;
m_bodyCount: number;
m_jointCount: number;
m_contactCount: number;
m_bodyCapacity: number;
m_contactCapacity: number;
m_jointCapacity: number;
Initialize(bodyCapacity: number, contactCapacity: number, jointCapacity: number, allocator: any, listener: b2ContactListener): void;
Clear(): void;
AddBody(body: b2Body): void;
AddContact(contact: b2Contact): void;
AddJoint(joint: b2Joint): void;
Solve(profile: b2Profile, step: b2TimeStep, gravity: b2Vec2, allowSleep: boolean): void;
SolveTOI(subStep: b2TimeStep, toiIndexA: number, toiIndexB: number): void;
Report(constraints: Array<b2ContactVelocityConstraint>): void;
}
class b2ContactRegister {
constructor();
}
class b2ContactFactory {
constructor(allocator: any);
AddType(createFcn: Function, destroyFcn: Function, type1: b2ShapeType, type2: b2ShapeType): void;
InitializeRegisters(): void;
Create(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): b2Contact;
Destroy(contact: b2Contact): void;
}
class b2GrowableStack {
// This is a growable LIFO stack with an initial capacity of N.
// If the stack size exceeds the initial capacity, the heap is
// used to increase the size of the stack.
constructor(N: number);
m_stack: Array<any>;
m_count: number;
Reset(): b2GrowableStack;
Push(element: any): void;
Pop(): any;
GetCount(): number;
}
class b2TreeNode {
// A node in the dynamic tree. The client does not interact with
// this directly.
constructor(id?: number);
m_id: number;
// Enlarged AABB
aabb: b2AABB;
userData: any;
parent: b2TreeNode;
child1: b2TreeNode;
child2: b2TreeNode;
// leaf = 0, free node = -1
height: number;
IsLeaf(): boolean;
}
class b2DynamicTree {
// A dynamic tree arranges data in a binary tree to accelerate
// queries such as volume queries and ray casts. Leafs are proxies
// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor
// so that the proxy AABB is bigger than the client object. This allows the client
// object to move by small amounts without triggering a tree update.
//
// Nodes are pooled and relocatable, so we use node indices rather than pointers.
constructor();
m_root: b2TreeNode;
m_freeList: b2TreeNode;
// This is used to incrementally traverse the tree for
// re-balancing.
m_path: number;
m_insertionCount: number;
// Get proxy user data.
GetUserData(proxy: b2TreeNode): any;
// Get the fat AABB for a proxy.
GetFatAABB(proxy: b2TreeNode): b2AABB;
// Query an AABB for overlapping proxies. The callback class is
// called for each proxy that overlaps the supplied AABB.
Query(callback: (treeNode: b2TreeNode) => boolean, aabb: b2AABB): void;
// Ray-cast against the proxies in the tree. This relies on the callback
// to perform a exact ray-cast in the case were the proxy contains a shape.
// The callback also performs the any collision filtering. This has performance
// roughly equal to k * log(n), where k is the number of collisions and n is the
// number of proxies in the tree.
RayCast(callback: (raycastInput: b2RayCastInput, treeNode: b2TreeNode) => number, input: b2RayCastInput): void;
AllocateNode(): b2TreeNode;
FreeNode(node: b2TreeNode): void;
// Create a proxy. Provide a tight fitting AABB and a userData
// pointer.
CreateProxy(aabb: b2AABB, userData: any): b2TreeNode;
// Destroy a proxy. This asserts if the id is invalid.
DestroyProxy(proxy: b2TreeNode): void;
// Move a proxy with a swepted AABB. If the proxy has moved
// outside of its fattened AABB, then the proxy is removed from
// the tree and re-inserted. Otherwise the function returns
// immediately.
MoveProxy(proxy: b2TreeNode, aabb: b2AABB, displacement: b2Vec2): boolean;
InsertLeaf(leaf: b2TreeNode): void;
RemoveLeaf(leaf: b2TreeNode): void;
// Perform a left or right rotation if node A is imbalanced.
// Returns the new root index.
Balance(A: b2TreeNode): b2TreeNode;
// Compute the height of the binary tree in O(N) time. Should
// not be called often.
GetHeight(): number;
// Get the ratio of the sum of the node areas to the root area.
GetAreaRatio(): number;
// Compute the height of a sub-tree.
ComputeHeightNode(node: b2TreeNode): number;
ComputeHeight(): number;
ValidateStructure(index: b2TreeNode): void;
ValidateMetrics(index: b2TreeNode): void;
// Validate this tree. For testing.
Validate(): void;
// Get the maximum balance of an node in the tree. The balance
// is the difference in height of the two children of a node.
GetMaxBalance(): number;
// Build an optimal tree. Very expensive. For testing.
RebuildBottomUp(): void;
// Shift the world origin. Useful for large worlds.
// The shift formula is: position -= newOrigin
ShiftOrigin(newOrigin: b2Vec2): void;
}
class b2Pair {
constructor();
proxyA: b2TreeNode;
proxyB: b2TreeNode;
}
class b2BroadPhase {
// The broad-phase is used for computing pairs and performing
// volume queries and ray casts. This broad-phase does not
// persist pairs. Instead, this reports potentially new pairs.
// It is up to the client to consume the new pairs and to track
// subsequent overlap.
constructor();
m_tree: b2DynamicTree;
m_proxyCount: number;
m_moveCount: number;
m_moveBuffer: Array<b2TreeNode>;
m_pairCount: number;
m_pairBuffer: Array<b2Pair>;
// Create a proxy with an initial AABB. Pairs are not reported
// until UpdatePairs is called.
CreateProxy(aabb: b2AABB, userData: any): b2TreeNode;
// Destroy a proxy. It is up to the client to remove any pairs.
DestroyProxy(proxy: b2TreeNode): void;
// Call MoveProxy as many times as you like, then when you are
// done call UpdatePairs to finalized the proxy pairs (for your
// time step).
MoveProxy(proxy: b2TreeNode, aabb: b2AABB, displacement: b2Vec2): void;
// Call to trigger a re-processing of it's pairs on the next
// call to UpdatePairs.
TouchProxy(proxy: b2TreeNode): void;
// Get the fat AABB for a proxy.
GetFatAABB(proxy: b2TreeNode): b2AABB;
// Get user data from a proxy. Returns NULL if the id is
// invalid.
GetUserData(proxy: b2TreeNode): any;
// Test overlap of fat AABBs.
TestOverlap(proxyA: b2TreeNode, proxyB: b2TreeNode): boolean;
// Get the number of proxies.
GetProxyCount(): number;
// Get the height of the embedded tree.
GetTreeHeight(): number;
// Get the balance of the embedded tree.
GetTreeBalance(): number;
// Get the quality metric of the embedded tree.
GetTreeQuality(): number;
// Shift the world origin. Useful for large worlds. The shift
// formula is: position -= newOrigin
ShiftOrigin(newOrigin: b2Vec2): void;
// Update the pairs. This results in pair callbacks. This can
// only add pairs.
UpdatePairs(contactManager: any): void;
// Query an AABB for overlapping proxies. The callback class is
// called for each proxy that overlaps the supplied AABB.
Query(callback: Function, aabb: b2AABB): void;
// Ray-cast against the proxies in the tree. This relies on the
// callback to perform a exact ray-cast in the case were the
// proxy contains a shape. The callback also performs the any
// collision filtering. This has performance roughly equal to k
// * log(n), where k is the number of collisions and n is the
// number of proxies in the tree.
RayCast(callback: Function, input: b2RayCastInput): void;
BufferMove(proxy: b2TreeNode): void;
UnBufferMove(proxy: b2TreeNode): void;
}
class b2ContactManager {
// Delegate of box2d.b2World.
constructor();
m_broadPhase: b2BroadPhase;
m_contactList: b2Contact;
m_contactCount: number;
m_contactFilter: b2ContactFilter;
m_contactListener: b2ContactListener;
m_allocator: any;
m_contactFactory: b2ContactFactory;
Destroy(c: b2Contact): void;
// This is the top level collision call for the time step. Here
// all the narrow phase collision is processed for the world
// contact list.
Collide(): void;
FindNewContacts(): void;
// Broad-phase callback.
AddPair(proxyUserDataA: b2FixtureProxy, proxyUserDataB: b2FixtureProxy): void;
}
class b2JointFactory {
static Create(def: b2JointDef, allocator: any): b2Joint;
static Destroy(joint: b2Joint, allocator: any): void;
}
class b2Color {
// Color for debug drawing. Each value has the range [0,1].
constructor(rr: number, gg: number, bb: number);
r: number;
g: number;
b: number;
SetRGB(rr: number, gg: number, bb: number): b2Color;
static MakeStyleString(): string;
static RED: b2Color;
static GREEN: b2Color;
static BLUE: b2Color;
}
class b2Draw {
// Implement and register this class with a b2World to provide
// debug drawing of physics entities in your game.
constructor();
m_drawFlags: b2DrawFlags;
// Set the drawing flags.
SetFlags(flags: b2DrawFlags): void;
// Get the drawing flags.
GetFlags(): b2DrawFlags;
// Append flags to the current flags.
AppendFlags(flags: b2DrawFlags): void;
// Clear flags from the current flags.
ClearFlags(flags: b2DrawFlags): void;
PushTransform(xf: b2Transform): void;
PopTransform(xf: b2Transform): void;
// Draw a closed polygon provided in CCW order.
DrawPolygon(vertices: Array<b2Vec2>, vertexCount: number, color: b2Color): void;
// Draw a solid closed polygon provided in CCW order.
DrawSolidPolygon(vertices: Array<b2Vec2>, vertexCount: number, color: b2Color): void;
// Draw a circle.
DrawCircle(center: b2Vec2, radius: number, color: b2Color): void;
// Draw a solid circle.
DrawSolidCircle(center: b2Vec2, radius: number, axis: b2Vec2, color: b2Color): void;
// Draw a line segment.
DrawSegment(p1: b2Vec2, p2: b2Vec2, color: b2Color): void;
// Draw a transform. Choose your own length scale.
DrawTransform(xf: b2Transform): void;
}
class b2Filter {
// This holds contact filtering data.
constructor();
// The collision category bits. Normally you would just set one
// bit.
categoryBits: number;
// The collision mask bits. This states the categories that this
// shape would accept for collision.
maskBits: number;
// Collision groups allow a certain group of objects to never
// collide (negative) or always collide (positive). Zero means
// no collision group. Non-zero group filtering always wins
// against the mask bits.
groupIndex: number;
Clone(): b2Filter;
Copy(other: b2Filter): b2Filter;
}
class b2FixtureDef {
// A fixture definition is used to create a fixture. This class
// defines an abstract fixture definition. You can reuse fixture
// definitions safely.
constructor();
// The shape, this must be set. The shape will be cloned, so you
// can create the shape on the stack.
shape: b2Shape;
// Use this to store application specific fixture data.
userData: any;
// The friction coefficient, usually in the range [0,1].
friction: number;
// The restitution (elasticity) usually in the range [0,1].
restitution: number;
// The density, usually in kg/m^2.
density: number;
// A sensor shape collects contact information but never
// generates a collision response.
isSensor: boolean;
// Contact filtering data.
filter: b2Filter;
}
class b2FixtureProxy {
// This proxy is used internally to connect fixtures to the
// broad-phase.
constructor();
aabb: b2AABB;
fixture: b2Fixture;
childIndex: number;
proxy: b2TreeNode;
static MakeArray(length: number): Array<b2FixtureProxy>;
}
class b2Fixture {
// A fixture is used to attach a shape to a body for collision
// detection. A fixture inherits its transform from its parent.
// Fixtures hold additional non-geometric data such as friction,
// collision filters, etc.
// Fixtures are created via box2d.b2Body::CreateFixture.
// warning you cannot reuse fixtures.
constructor();
m_density: number;
m_next: b2Fixture;
m_body: b2Body;
m_shape: b2Shape;
m_friction: number;
m_restitution: number;
m_proxies: Array<b2FixtureProxy>;
m_proxyCount: number;
m_filter: b2Filter;
m_isSensor: boolean;
m_userData: any;
// Get the type of the child shape. You can use this to down
// cast to the concrete shape.
GetType(): b2ShapeType;
// Get the child shape. You can modify the child shape, however
// you should not change the number of vertices because this
// will crash some collision caching mechanisms.
// Manipulating the shape may lead to non-physical behavior.
GetShape(): b2Shape;
// Is this fixture a sensor (non-solid)?
IsSensor(): boolean;
// Get the contact filtering data.
GetFilterData(): b2Filter;
// Get the user data that was assigned in the fixture
// definition. Use this to store your application specific data.
GetUserData(): any;
// Set the user data. Use this to store your application
// specific data.
SetUserData(data: any): void;
// Get the parent body of this fixture. This is NULL if the
// fixture is not attached.
GetBody(): b2Body;
// Get the next fixture in the parent body's fixture list.
GetNext(): b2Fixture;
// Set the density of this fixture. This will _not_
// automatically adjust the mass of the body. You must call
// box2d.b2Body::ResetMassData to update the body's mass.
SetDensity(density: number): void;
// Get the density of this fixture.
GetDensity(): number;
// Get the coefficient of friction.
GetFriction(): number;
// Set the coefficient of friction. This will _not_ change the
// friction of existing contacts.
SetFriction(friction: number): void;
// Get the coefficient of restitution.
GetRestitution(): number;
// Set the coefficient of restitution. This will _not_ change
// the restitution of existing contacts.
SetRestitution(restitution: number): void;
// Test a point for containment in this fixture.
TestPoint(p: b2Vec2): boolean;
// Cast a ray against this shape.
RayCast(output: b2RayCastOutput, input: b2RayCastInput, childIndex: number): boolean;
// Get the mass data for this fixture. The mass data is based on
// the density and the shape. The rotational inertia is about
// the shape's origin. This operation may be expensive.
GetMassData(massData?: b2MassData): b2MassData;
// Get the fixture's AABB. This AABB may be enlarge and/or
// stale. If you need a more accurate AABB, compute it using the
// shape and the body transform.
GetAABB(childIndex: number): b2AABB;
// We need separation create/destroy functions from the
// constructor/destructor because the destructor cannot access
// the allocator (no destructor arguments allowed by C++).
Create(body: b2Body, def: b2FixtureDef): void;
Destroy(): void;
// These support body activation/deactivation.
CreateProxies(broadPhase: b2BroadPhase, xf: b2Transform): void;
DestroyProxies(broadPhase: b2BroadPhase): void;
Synchronize(broadPhase: b2BroadPhase, transform1: b2Transform, transform2: b2Transform): void;
// Set the contact filtering data. This will not update contacts
// until the next time step when either parent body is active
// and awake.
// This automatically calls Refilter.
SetFilterData(filter: b2Filter): void;
// Call this if you want to establish collision that was
// previously disabled by box2d.b2ContactFilter::ShouldCollide.
Refilter(): void;
// Set if this fixture is a sensor.
SetSensor(sensor: boolean): void;
// Dump this fixture to the log file.
Dump(bodyIndex: number): void;
}
class b2BodyDef {
// A body definition holds all the data needed to construct a
// rigid body.
// You can safely re-use body definitions. Shapes are added to a
// body after construction.
constructor();
// The body type: static, kinematic, or dynamic.
// Note: if a dynamic body would have zero mass, the mass is set
// to one.
type: b2BodyType;
// The world position of the body. Avoid creating bodies at the
// origin since this can lead to many overlapping shapes.
position: b2Vec2;
// The world angle of the body in radians.
angle: number;
// The linear velocity of the body's origin in world
// co-ordinates.
linearVelocity: b2Vec2;
// The angular velocity of the body.
angularVelocity: number;
// Linear damping is use to reduce the linear velocity. The
// damping parameter can be larger than 1.0f but the damping
// effect becomes sensitive to the time step when the damping
// parameter is large.
linearDamping: number;
// Angular damping is use to reduce the angular velocity. The
// damping parameter can be larger than 1.0f but the damping
// effect becomes sensitive to the time step when the damping
// parameter is large.
angularDamping: number;
// Set this flag to false if this body should never fall asleep.
// Note that this increases CPU usage.
allowSleep: boolean;
// Is this body initially awake or sleeping?
awake: boolean;
// Should this body be prevented from rotating? Useful for
// characters.
fixedRotation: boolean;
// Is this a fast moving body that should be prevented from
// tunneling through other moving bodies? Note that all bodies
// are prevented from tunneling through kinematic and static
// bodies. This setting is only considered on dynamic bodies.
// warning You should use this flag sparingly since it increases
// processing time.
bullet: boolean;
// Does this body start out active?
active: boolean;
// Use this to store application specific body data.
userData: any;
// Scale the gravity applied to this body.
gravityScale: number;
}
class b2Body {
// A rigid body. These are created via
// box2d.b2World::CreateBody.
constructor(bd: b2BodyDef, world: b2World);
m_flags: b2BodyFlag;
m_islandIndex: number;
m_world: b2World;
m_xf: b2Transform;
m_out_xf: b2Transform;
m_sweep: b2Sweep;
m_out_sweep: b2Sweep;
m_jointList: b2JointEdge;
m_contactList: b2ContactEdge;
m_prev: b2Body;
m_next: b2Body;
m_linearVelocity: b2Vec2;
m_out_linearVelocity: b2Vec2;
m_angularVelocity: number;
m_linearDamping: number;
m_angularDamping: number;
m_gravityScale: number;
m_force: b2Vec2;
m_torque: number;
m_sleepTime: number;
m_type: b2BodyType;
m_mass: number;
m_invMass: number;
m_I: number;
m_invI: number;
m_userData: any;
m_fixtureList: b2Fixture;
m_fixtureCount: number;
m_controllerList: b2ControllerEdge;
m_controllerCount: number;
// Creates a fixture and attach it to this body. Use this
// function if you need to set some fixture parameters, like
// friction. Otherwise you can create the fixture directly from
// a shape.
// If the density is non-zero, this function automatically
// updates the mass of the body. Contacts are not created until
// the next time step.
// warning This function is locked during callbacks.
CreateFixture(def: b2FixtureDef): b2Fixture;
// Creates a fixture from a shape and attach it to this body.
// This is a convenience function. Use b2FixtureDef if you need
// to set parameters like friction, restitution, user data, or
// filtering.
// If the density is non-zero, this function automatically
// updates the mass of the body.
// warning This function is locked during callbacks.
CreateFixture2(shape: b2Shape, density: number): b2Fixture;
// Destroy a fixture. This removes the fixture from the
// broad-phase and destroys all contacts associated with this
// fixture. This will automatically adjust the mass of the body
// if the body is dynamic and the fixture has positive density.
// All fixtures attached to a body are implicitly destroyed when
// the body is destroyed.
// warning This function is locked during callbacks.
DestroyFixture(fixture: b2Fixture): void;
// Set the position of the body's origin and rotation.
// Manipulating a body's transform may cause non-physical
// behavior.
// Note: contacts are updated on the next call to b2World::Step.
SetTransformVecRadians(position: b2Vec2, angle: number): void;
SetTransformXYRadians(x: number, y: number, angle: number): void;
SetTransform(xf: b2Transform): void;
// Get the body transform for the body's origin.
GetTransform(out?: b2Transform): b2Transform;
// Get the world body origin position.
GetPosition(out?: b2Vec2): b2Vec2;
SetPosition(position: b2Vec2): void;
SetPositionXY(x: number, y: number): void;
// Get the angle in radians.
GetAngle(): number;
SetAngle(angle: number): void;
// Get the world position of the center of mass.
GetWorldCenter(out?: b2Vec2): b2Vec2;
// Get the local position of the center of mass.
GetLocalCenter(out?: b2Vec2): b2Vec2;
// Set the linear velocity of the center of mass.
SetLinearVelocity(v: b2Vec2): void;
// Get the linear velocity of the center of mass.
GetLinearVelocity(out?: b2Vec2): b2Vec2;
// Set the angular velocity.
SetAngularVelocity(w: number): void;
// Get the angular velocity.
GetAngularVelocity(): number;
GetDefinition(bd: b2BodyDef): b2BodyDef;
// Apply a force at a world point. If the force is not applied
// at the center of mass, it will generate a torque and affect
// the angular velocity. This wakes up the body.
ApplyForce(force: b2Vec2, point: b2Vec2, wake?: boolean): void;
// Apply a force to the center of mass. This wakes up the body.
ApplyForceToCenter(force: b2Vec2, wake?: boolean): void;
// Apply a torque. This affects the angular velocity without
// affecting the linear velocity of the center of mass. This
// wakes up the body.
ApplyTorque(torque: number, wake?: boolean): void;
// Apply an impulse at a point. This immediately modifies the
// velocity. It also modifies the angular velocity if the point
// of application is not at the center of mass. This wakes up
// the body.
ApplyLinearImpulse(impulse: b2Vec2, point: b2Vec2, wake?: boolean): void;
// Apply an angular impulse.
ApplyAngularImpulse(impulse: number, wake?: boolean): void;
// Get the total mass of the body.
GetMass(): number;
// Get the rotational inertia of the body about the local
// origin.
GetInertia(): number;
// Get the mass data of the body.
GetMassData(data: b2MassData): b2MassData;
// Set the mass properties to override the mass properties of
// the fixtures.
// Note that this changes the center of mass position.
// Note that creating or destroying fixtures can also alter the
// mass.
// This function has no effect if the body isn't dynamic.
SetMassData(massData: b2MassData): void;
// This resets the mass properties to the sum of the mass
// properties of the fixtures. This normally does not need to be
// called unless you called SetMassData to override the mass and
// you later want to reset the mass.
ResetMassData(): void;
// Get the world coordinates of a point given the local
// coordinates.
GetWorldPoint(localPoint: b2Vec2, out: b2Vec2): b2Vec2;
// Get the world coordinates of a vector given the local
// coordinates.
GetWorldVector(localVector: b2Vec2, out: b2Vec2): b2Vec2;
// Gets a local point relative to the body's origin given a
// world point.
GetLocalPoint(worldPoint: b2Vec2, out: b2Vec2): b2Vec2;
// Gets a local vector given a world vector.
GetLocalVector(worldVector: b2Vec2, out: b2Vec2): b2Vec2;
// Get the world linear velocity of a world point attached to
// this body.
GetLinearVelocityFromWorldPoint(worldPoint: b2Vec2, out: b2Vec2): b2Vec2;
// Get the world velocity of a local point.
GetLinearVelocityFromLocalPoint(localPoint: b2Vec2, out: b2Vec2): b2Vec2;
// Get the linear damping of the body.
GetLinearDamping(): number;
// Set the linear damping of the body.
SetLinearDamping(linearDamping: number): void;
// Get the angular damping of the body.
GetAngularDamping(): number;
// Set the angular damping of the body.
SetAngularDamping(angularDamping: number): void;
// Get the gravity scale of the body.
GetGravityScale(): number;
// Set the gravity scale of the body.
SetGravityScale(scale: number): void;
// Set the type of this body. This may alter the mass and
// velocity.
SetType(type: b2BodyType): void;
// Get the type of this body.
GetType(): b2BodyType;
// Should this body be treated like a bullet for continuous
// collision detection?
SetBullet(flag: boolean): void;
// Is this body treated like a bullet for continuous collision
// detection?
IsBullet(): boolean;
// You can disable sleeping on this body. If you disable
// sleeping, the body will be woken.
SetSleepingAllowed(flag: boolean): void;
// Is this body allowed to sleep
IsSleepingAllowed(): boolean;
// Set the sleep state of the body. A sleeping body has very low CPU cost.
// put it to sleep.
SetAwake(flag: boolean): void;
// Get the sleeping state of this body.
IsAwake(): boolean;
// Set the active state of the body. An inactive body is not
// simulated and cannot be collided with or woken up.
// If you pass a flag of true, all fixtures will be added to the
// broad-phase.
// If you pass a flag of false, all fixtures will be removed from
// the broad-phase and all contacts will be destroyed.
// Fixtures and joints are otherwise unaffected. You may continue
// to create/destroy fixtures and joints on inactive bodies.
// Fixtures on an inactive body are implicitly inactive and will
// not participate in collisions, ray-casts, or queries.
// Joints connected to an inactive body are implicitly inactive.
// An inactive body is still owned by a b2World object and remains
// in the body list.
SetActive(flag: boolean): void;
// Get the active state of the body.
IsActive(): boolean;
// Set this body to have fixed rotation. This causes the mass to
// be reset.
SetFixedRotation(flag: boolean): void;
// Does this body have fixed rotation?
IsFixedRotation(): boolean;
// Get the list of all fixtures attached to this body.
GetFixtureList(): b2Fixture;
// Get the list of all joints attached to this body.
GetJointList(): b2JointEdge;
// Get the list of all contacts attached to this body.
// warning this list changes during the time step and you may
// miss some collisions if you don't use b2ContactListener.
GetContactList(): b2ContactEdge;
// Get the next body in the world's body list.
GetNext(): b2Body;
// Get the user data pointer that was provided in the body
// definition.
GetUserData(): any;
// Set the user data. Use this to store your application
// specific data.
SetUserData(data: any): void;
// Get the parent world of this body.
GetWorld(): b2World;
SynchronizeFixtures(): void;
SynchronizeTransform(): void;
// This is used to prevent connected bodies from colliding.
// It may lie, depending on the collideConnected flag.
ShouldCollide(other: b2Body): boolean;
Advance(alpha: number): void;
// Dump this body to a log file
Dump(): void;
GetControllerList(): b2ControllerEdge;
GetControllerCount(): number;
}
class b2World {
// Construct a world object.
constructor(gravity: b2Vec2);
m_flags: b2WorldFlag;
m_contactManager: b2ContactManager;
m_bodyList: b2Body;
m_jointList: b2Joint;
m_bodyCount: number;
m_jointCount: number;
m_gravity: b2Vec2;
m_out_gravity: b2Vec2;
m_allowSleep: boolean;
m_destructionListener: b2DestructionListener;
m_debugDraw: b2Draw;
// This is used to compute the time step ratio to support a
// variable time step.
m_inv_dt0: number;
// These are for debugging the solver.
m_warmStarting: boolean;
m_continuousPhysics: boolean;
m_subStepping: boolean;
m_stepComplete: boolean;
m_profile: b2Profile;
m_island: b2Island;
s_stack: Array<b2Body>;
m_controllerList: b2Controller;
m_controllerCount: number;
// Enable/disable sleep.
SetAllowSleeping(flag: boolean): void;
GetAllowSleeping(): boolean;
// Enable/disable warm starting. For testing.
SetWarmStarting(flag: boolean): void;
GetWarmStarting(): boolean;
// Enable/disable continuous physics. For testing.
SetContinuousPhysics(flag: boolean): void;
GetContinuousPhysics(): boolean;
// Enable/disable single stepped continuous physics. For
// testing.
SetSubStepping(flag: boolean): void;
GetSubStepping(): boolean;
// Get the world body list. With the returned body, use
// b2Body::GetNext to get the next body in the world list. A
// NULL body indicates the end of the list.
GetBodyList(): b2Body;
// Get the world joint list. With the returned joint, use
// b2Joint::GetNext to get the next joint in the world list. A
// NULL joint indicates the end of the list.
GetJointList(): b2Joint;
// Get the world contact list. With the returned contact, use
// box2d.b2Contact::GetNext to get the next contact in the world
// list. A NULL contact indicates the end of the list.
// warning contacts are created and destroyed in the middle of a
// time step.
// Use box2d.b2ContactListener to avoid missing contacts.
GetContactList(): b2Contact;
// Get the number of bodies.
GetBodyCount(): number;
// Get the number of joints.
GetJointCount(): number;
// Get the number of contacts (each may have 0 or more contact
// points).
GetContactCount(): number;
// Change the global gravity vector.
SetGravity(gravity: b2Vec2, wake?: boolean): void;
// Get the global gravity vector.
GetGravity(out?: b2Vec2): b2Vec2;
// Is the world locked (in the middle of a time step).
IsLocked(): boolean;
// Set flag to control automatic clearing of forces after each
// time step.
SetAutoClearForces(flag: boolean): void;
// Get the flag that controls automatic clearing of forces after
// each time step.
GetAutoClearForces(): boolean;
// Get the contact manager for testing.
GetContactManager(): b2ContactManager;
// Get the current profile.
GetProfile(): b2Profile;
// Register a destruction listener. The listener is owned by you
// and must remain in scope.
SetDestructionListener(listener: b2DestructionListener): void;
// Register a contact filter to provide specific control over
// collision. Otherwise the default filter is used
// (b2_defaultFilter). The listener is owned by you and must
// remain in scope.
SetContactFilter(filter: b2ContactFilter): void;
// Register a contact event listener. The listener is owned by
// you and must remain in scope.
SetContactListener(listener: b2ContactListener): void;
// Register a routine for debug drawing. The debug draw
// functions are called inside with b2World::DrawDebugData
// method. The debug draw object is owned by you and must remain
// in scope.
SetDebugDraw(debugDraw: b2Draw): void;
// Create a rigid body given a definition. No reference to the
// definition is retained.
// warning This function is locked during callbacks.
CreateBody(def: b2BodyDef): b2Body;
// Destroy a rigid body given a definition. No reference to the
// definition is retained. This function is locked during
// callbacks.
// warning This automatically deletes all associated shapes and
// joints.
// warning This function is locked during callbacks.
DestroyBody(b: b2Body): void;
// Create a joint to constrain bodies together. No reference to
// the definition is retained. This may cause the connected
// bodies to cease colliding.
// warning This function is locked during callbacks.
CreateJoint(def: b2JointDef): b2Joint;
// Destroy a joint. This may cause the connected bodies to begin
// colliding.
// warning This function is locked during callbacks.
DestroyJoint(j: b2Joint): void;
// Find islands, integrate and solve constraints, solve position
// constraints
Solve(step: b2TimeStep): void;
// Find TOI contacts and solve them.
SolveTOI(step: b2TimeStep): void;
// Take a time step. This performs collision detection,
// integration, and constraint solution.
Step(dt: number, velocityIterations: number, positionIterations: number): void;
// Manually clear the force buffer on all bodies. By default,
// forces are cleared automatically after each call to Step. The
// default behavior is modified by calling SetAutoClearForces.
// The purpose of this function is to support sub-stepping.
// Sub-stepping is often used to maintain a fixed sized time
// step under a variable frame-rate.
// When you perform sub-stepping you will disable auto clearing
// of forces and instead call ClearForces after all sub-steps
// are complete in one pass of your game loop.
ClearForces(): void;
// Query the world for all fixtures that potentially overlap the
// provided AABB.
// boolean} callback a user implemented callback class.
QueryAABB(callback: (fixture: b2Fixture) => boolean | b2QueryCallback, aabb: b2AABB): void;
// boolean} callback
QueryShape(callback: (fixture: b2Fixture) => boolean | b2QueryCallback, shape: b2Shape, transform: b2Transform): void;
// boolean} callback
QueryPoint(callback: (fixture: b2Fixture) => boolean | b2QueryCallback, point: b2Vec2): void;
// Ray-cast the world for all fixtures in the path of the ray.
// Your callback controls whether you get the closest point, any
// point, or n-points. The ray-cast ignores shapes that contain
// the starting point.
// box2d.b2Vec2, box2d.b2Vec2, number)} callback a user
// implemented callback class.
RayCast(callback: (fixture: b2Fixture, vec1: b2Vec2, vec2: b2Vec2, points: number) => void | b2RayCastCallback, point1: b2Vec2, point2: b2Vec2): void;
RayCastOne(point1: b2Vec2, point2: b2Vec2): b2Fixture;
RayCastAll(point1: b2Vec2, point2: b2Vec2, out: Array<b2Fixture>): Array<b2Fixture>;
DrawShape(fixture: b2Fixture, color: b2Color): void;
DrawJoint(joint: b2Joint): void;
// Call this to draw shapes and other debug draw data.
DrawDebugData(): void;
SetBroadPhase(broadPhase: b2BroadPhase): void;
// Get the number of broad-phase proxies.
GetProxyCount(): number;
// Get the height of the dynamic tree.
GetTreeHeight(): number;
// Get the balance of the dynamic tree.
GetTreeBalance(): number;
// Get the quality metric of the dynamic tree. The smaller the
// better. The minimum is 1.
GetTreeQuality(): number;
// Shift the world origin. Useful for large worlds.
// The body shift formula is: position -= newOrigin
ShiftOrigin(newOrigin: b2Vec2): void;
// Dump the world into the log file.
// warning this should be called outside of a time step.
Dump(): void;
AddController(controller: b2Controller): b2Controller;
RemoveController(controller: b2Controller): void;
}
class b2AreaJointDef extends b2JointDef {
// Definition for a {@link box2d.b2AreaJoint}, which connects a
// group a bodies together so they maintain a constant area
// within them.
constructor();
world: b2World;
bodies: Array<b2Body>;
// The mass-spring-damper frequency in Hertz. A value of 0
// disables softness.
frequencyHz: number;
// The damping ratio. 0 = no damping, 1 = critical damping.
dampingRatio: number;
AddBody(body: b2Body): void;
}
class b2AreaJoint extends b2Joint {
// A distance joint constrains two points on two bodies to
// remain at a fixed distance from each other. You can view this
// as a massless, rigid rod.
constructor(def: b2AreaJointDef);
m_bodies: Array<b2Body>;
m_frequencyHz: number;
m_dampingRatio: number;
m_impulse: number;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
// Get the reaction force given the inverse time step.
// Unit is N.
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
// Get the reaction torque given the inverse time step.
// Unit is N*m. This is always zero for a distance joint.
GetReactionTorque(inv_dt: number): number;
// Set/get frequency in Hz.
SetFrequency(hz: number): void;
GetFrequency(): number;
// Set/get damping ratio.
SetDampingRatio(ratio: number): void;
GetDampingRatio(): number;
// Dump joint to dmLog
Dump(): void;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
}
class b2BuoyancyController extends b2Controller {
// Calculates buoyancy forces for fluids in the form of a half
// plane.
constructor();
// The outer surface normal
normal: b2Vec2;
// The height of the fluid surface along the normal
offset: number;
// The fluid density
density: number;
// Fluid velocity, for drag calculations
velocity: b2Vec2;
// Linear drag co-efficient
linearDrag: number;
// Linear drag co-efficient
angularDrag: number;
// If false, bodies are assumed to be uniformly dense, otherwise
// use the shapes densities
useDensity: boolean;
// If true, gravity is taken from the world instead of the
useWorldGravity: boolean;
// Gravity vector, if the world's gravity is not used
gravity: b2Vec2;
Step(step: b2TimeStep): void;
Draw(debugDraw: b2Draw): void;
}
class b2TensorDampingController extends b2Controller {
// Applies top down linear damping to the controlled bodies
// The damping is calculated by multiplying velocity by a matrix
// in local co-ordinates.
constructor();
// Tensor to use in damping model
T: b2Mat22;
// Set this to a positive number to clamp the maximum amount of
// damping done.
maxTimestep: number;
Step(step: b2TimeStep): void;
// Sets damping independantly along the x and y axes
SetAxisAligned(xDamping: number, yDamping: number): void;
}
class b2DistanceJointDef extends b2JointDef {
// Distance joint definition. This requires defining an anchor
// point on both bodies and the non-zero length of the distance
// joint. The definition uses local anchor points so that the
// initial configuration can violate the constraint slightly.
// This helps when saving and loading a game.
// warning Do not use a zero or short length.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The natural length between the anchor points.
length: number;
// The mass-spring-damper frequency in Hertz. A value of 0
// disables softness.
frequencyHz: number;
// The damping ratio. 0 = no damping, 1 = critical damping.
dampingRatio: number;
Initialize(b1: b2Body, b2: b2Body, anchor1: b2Vec2, anchor2: b2Vec2): void;
}
class b2DistanceJoint extends b2Joint {
// A distance joint constrains two points on two bodies to
// remain at a fixed distance from each other. You can view this
// as a massless, rigid rod.
constructor(def: b2DistanceJointDef);
m_frequencyHz: number;
m_dampingRatio: number;
m_bias: number;
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_gamma: number;
m_impulse: number;
m_length: number;
m_indexA: number;
m_indexB: number;
m_u: b2Vec2;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_mass: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
// Get the reaction force given the inverse time step.
// Unit is N.
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
// Get the reaction torque given the inverse time step.
// Unit is N*m. This is always zero for a distance joint.
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out: b2Vec2): b2Vec2;
SetLength(length: number): void;
GetLength(): number;
// Set/get frequency in Hz.
SetFrequency(hz: number): void;
GetFrequency(): number;
// Set/get damping ratio.
SetDampingRatio(ratio: number): void;
GetDampingRatio(): number;
// Dump joint to dmLog
Dump(): void;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
}
class b2FrictionJointDef extends b2JointDef {
// Friction joint definition.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The maximum friction force in N.
maxForce: number;
// The maximum friction torque in N-m.
maxTorque: number;
Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2): void;
}
class b2FrictionJoint extends b2Joint {
// Friction joint. This is used for top-down friction. It
// provides 2D translational friction and angular friction.
constructor(def: b2FrictionJointDef);
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_linearImpulse: b2Vec2;
m_angularImpulse: number;
m_maxForce: number;
m_maxTorque: number;
m_indexA: number;
m_indexB: number;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_linearMass: b2Mat22;
m_angularMass: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
m_K: b2Mat22;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out: b2Vec2): b2Vec2;
// Set the maximum friction force in N.
SetMaxForce(force: number): void;
// Get the maximum friction force in N.
GetMaxForce(): number;
// Set the maximum friction torque in N*m.
SetMaxTorque(torque: number): void;
// Get the maximum friction torque in N*m.
GetMaxTorque(): number;
// Dump joint to dmLog
Dump(): void;
}
class b2MouseJointDef extends b2JointDef {
// Mouse joint definition. This requires a world target point,
// tuning parameters, and the time step.
constructor();
// The initial world target point. This is assumed to coincide
// with the body anchor initially.
target: b2Vec2;
// The maximum constraint force that can be exerted to move the
// candidate body. Usually you will express as some multiple of
// the weight (multiplier * mass * gravity).
maxForce: number;
// The response speed.
frequencyHz: number;
// The damping ratio. 0 = no damping, 1 = critical damping.
dampingRatio: number;
}
class b2MouseJoint extends b2Joint {
// A mouse joint is used to make a point on a body track a
// specified world point. This a soft constraint with a maximum
// force. This allows the constraint to stretch and without
// applying huge forces.
// NOTE: this joint is not documented in the manual because it
// was developed to be used in the testbed. If you want to learn
// how to use the mouse joint, look at the testbed.
constructor(def: b2MouseJointDef);
m_localAnchorB: b2Vec2;
m_targetA: b2Vec2;
m_frequencyHz: number;
m_dampingRatio: number;
m_beta: number;
m_impulse: b2Vec2;
m_maxForce: number;
m_gamma: number;
m_indexA: number;
m_indexB: number;
m_rB: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassB: number;
m_invIB: number;
m_mass: b2Mat22;
m_C: b2Vec2;
m_qB: b2Rot;
m_lalcB: b2Vec2;
m_K: b2Mat22;
SetTarget(target: b2Vec2): void;
GetTarget(out: b2Vec2): b2Vec2;
SetMaxForce(maxForce: number): void;
GetMaxForce(): number;
SetFrequency(hz: number): void;
GetFrequency(): number;
SetDampingRatio(ratio: number): void;
GetDampingRatio(): number;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// The mouse joint does not support dumping.
Dump(): void;
// Implement b2Joint::ShiftOrigin
ShiftOrigin(newOrigin: b2Vec2): void;
}
class b2ConstantForceController extends b2Controller {
// Applies a force every frame
constructor();
Step(step: b2TimeStep): void;
}
class b2PulleyJointDef extends b2JointDef {
// Pulley joint definition. This requires two ground anchors,
// two dynamic body anchor points, and a pulley ratio.
constructor();
// The first ground anchor in world coordinates. This point
// never moves.
groundAnchorA: b2Vec2;
// The second ground anchor in world coordinates. This point
// never moves.
groundAnchorB: b2Vec2;
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The a reference length for the segment attached to bodyA.
lengthA: number;
// The a reference length for the segment attached to bodyB.
lengthB: number;
// The pulley ratio, used to simulate a block-and-tackle.
ratio: number;
Initialize(bA: b2Body, bB: b2Body, groundA: b2Vec2, groundB: b2Vec2, anchorA: b2Vec2, anchorB: b2Vec2, r: number): void;
}
class b2PulleyJoint extends b2Joint {
// The pulley joint is connected to two bodies and two fixed ground points.
// The pulley supports a ratio such that:
// lengthA + ratio * lengthB <= constant
// Yes, the force transmitted is scaled by the ratio.
// Warning: the pulley joint can get a bit squirrelly by itself.
// They often work better when combined with prismatic joints.
// You should also cover the the anchor points with static
// shapes to prevent one side from going to zero length.
constructor(def: b2PulleyJointDef);
m_groundAnchorA: b2Vec2;
m_groundAnchorB: b2Vec2;
m_lengthA: number;
m_lengthB: number;
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_constant: number;
m_ratio: number;
m_impulse: number;
m_indexA: number;
m_indexB: number;
m_uA: b2Vec2;
m_uB: b2Vec2;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_mass: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
GetGroundAnchorA(out: b2Vec2): b2Vec2;
GetGroundAnchorB(out: b2Vec2): b2Vec2;
// Get the current length of the segment attached to bodyA.
GetLengthA(): number;
// Get the current length of the segment attached to bodyB.
GetLengthB(): number;
// Get the pulley ratio.
GetRatio(): number;
// Get the current length of the segment attached to bodyA.
GetCurrentLengthA(): number;
// Get the current length of the segment attached to bodyB.
GetCurrentLengthB(): number;
// Dump joint to dmLog
Dump(): void;
// Implement b2Joint::ShiftOrigin
ShiftOrigin(newOrigin: b2Vec2): void;
}
class b2CircleShape extends b2Shape {
// A circle shape.
constructor(radius?: number);
m_p: b2Vec2;
// Implement box2d.b2Shape.
Clone(): b2Shape;
Copy(other: b2Shape): b2Shape;
// Implement box2d.b2Shape.
GetChildCount(): number;
// Implement box2d.b2Shape.
TestPoint(transform: b2Transform, p: b2Vec2): boolean;
// Implement box2d.b2Shape.
// Collision Detection in Interactive 3D Environments by Gino
// van den Bergen From Section 3.1.2
// x = s + a * r
// norm(x) = radius
RayCast(output: b2RayCastOutput, input: b2RayCastInput, transform: b2Transform, childIndex: number): boolean;
ComputeAABB(aabb: b2AABB, transform: b2Transform, childIndex: number): void;
ComputeMass(massData: b2MassData, density: number): void;
SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void;
ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number;
// Dump this shape to the log file.
Dump(): void;
}
class b2RopeDef {
constructor();
}
class b2Rope {
constructor();
GetVertexCount(): number;
GetVertices(): Array<b2Vec2>;
Initialize(def: b2RopeDef): void;
Step(h: number, iterations: number): void;
SolveC2(): void;
SetAngleRadians(angle: number): void;
SolveC3(): void;
Draw(draw: b2Draw): void;
}
class b2WheelJointDef extends b2JointDef {
// Wheel joint definition. This requires defining a line of
// motion using an axis and an anchor point. The definition uses
// local anchor points and a local axis so that the initial
// configuration can violate the constraint slightly. The joint
// translation is zero when the local anchor points coincide in
// world space. Using local anchors and a local axis helps when
// saving and loading a game.
constructor();
// The local anchor point relative to bodyA's origin.
localAnchorA: b2Vec2;
// The local anchor point relative to bodyB's origin.
localAnchorB: b2Vec2;
// The local translation axis in bodyA.
localAxisA: b2Vec2;
// Enable/disable the joint motor.
enableMotor: boolean;
// The maximum motor torque, usually in N-m.
maxMotorTorque: number;
// The desired motor speed in radians per second.
motorSpeed: number;
// Suspension frequency, zero indicates no suspension
frequencyHz: number;
// Suspension damping ratio, one indicates critical damping
dampingRatio: number;
Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2, axis: b2Vec2): void;
}
class b2WheelJoint extends b2Joint {
// A wheel joint. This joint provides two degrees of freedom:
// translation along an axis fixed in bodyA and rotation in the
// plane. You can use a joint limit to restrict the range of
// motion and a joint motor to drive the rotation or to model
// rotational friction.
// This joint is designed for vehicle suspensions.
constructor(def: b2WheelJointDef);
m_frequencyHz: number;
m_dampingRatio: number;
m_localAnchorA: b2Vec2;
m_localAnchorB: b2Vec2;
m_localXAxisA: b2Vec2;
m_localYAxisA: b2Vec2;
m_impulse: number;
m_motorImpulse: number;
m_springImpulse: number;
m_maxMotorTorque: number;
m_motorSpeed: number;
m_enableMotor: boolean;
m_indexA: number;
m_indexB: number;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_ax: b2Vec2;
m_ay: b2Vec2;
m_sAx: number;
m_sBx: number;
m_sAy: number;
m_sBy: number;
m_mass: number;
m_motorMass: number;
m_springMass: number;
m_bias: number;
m_gamma: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_lalcA: b2Vec2;
m_lalcB: b2Vec2;
m_rA: b2Vec2;
m_rB: b2Vec2;
// Get the motor speed, usually in radians per second.
GetMotorSpeed(): number;
GetMaxMotorTorque(): number;
SetSpringFrequencyHz(hz: number): void;
GetSpringFrequencyHz(): number;
SetSpringDampingRatio(ratio: number): void;
GetSpringDampingRatio(): number;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
GetDefinition(def: b2WheelJointDef): b2WheelJointDef;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// The local anchor point relative to bodyA's origin.
GetLocalAnchorA(out: b2Vec2): b2Vec2;
// The local anchor point relative to bodyB's origin.
GetLocalAnchorB(out: b2Vec2): b2Vec2;
// The local joint axis relative to bodyA.
GetLocalAxisA(out: b2Vec2): b2Vec2;
GetJointTranslation(): number;
GetJointSpeed(): number;
IsMotorEnabled(): boolean;
EnableMotor(flag: boolean): void;
// Set the motor speed, usually in radians per second.
SetMotorSpeed(speed: number): void;
// Set/Get the maximum motor force, usually in N-m.
SetMaxMotorTorque(force: number): void;
// Get the current motor torque given the inverse time step,
// usually in N-m.
GetMotorTorque(inv_dt: number): number;
// Dump to b2Log
Dump(): void;
}
class b2MotorJointDef extends b2JointDef {
// Motor joint definition.
constructor();
// Position of bodyB minus the position of bodyA, in bodyA's
// frame, in meters.
linearOffset: b2Vec2;
// The bodyB angle minus bodyA angle in radians.
angularOffset: number;
// The maximum motor force in N.
maxForce: number;
// The maximum motor torque in N-m.
maxTorque: number;
// Position correction factor in the range [0,1].
correctionFactor: number;
Initialize(bA: b2Body, bB: b2Body): void;
}
class b2MotorJoint extends b2Joint {
// A motor joint is used to control the relative motion between
// two bodies. A typical usage is to control the movement of a
// dynamic body with respect to the ground.
constructor(def: b2MotorJointDef);
m_linearOffset: b2Vec2;
m_angularOffset: number;
m_linearImpulse: b2Vec2;
m_angularImpulse: number;
m_maxForce: number;
m_maxTorque: number;
m_correctionFactor: number;
m_indexA: number;
m_indexB: number;
m_rA: b2Vec2;
m_rB: b2Vec2;
m_localCenterA: b2Vec2;
m_localCenterB: b2Vec2;
m_linearError: b2Vec2;
m_angularError: number;
m_invMassA: number;
m_invMassB: number;
m_invIA: number;
m_invIB: number;
m_linearMass: b2Mat22;
m_angularMass: number;
m_qA: b2Rot;
m_qB: b2Rot;
m_K: b2Mat22;
GetAnchorA(out: b2Vec2): b2Vec2;
GetAnchorB(out: b2Vec2): b2Vec2;
GetReactionForce(inv_dt: number, out: b2Vec2): b2Vec2;
GetReactionTorque(inv_dt: number): number;
// Set the position correction factor in the range [0,1].
SetCorrectionFactor(factor: number): void;
// Get the position correction factor in the range [0,1].
GetCorrectionFactor(): number;
// Set/get the target linear offset, in frame A, in meters.
SetLinearOffset(linearOffset: b2Vec2): void;
GetLinearOffset(out: b2Vec2): b2Vec2;
// Set/get the target angular offset, in radians.
SetAngularOffset(angularOffset: number): void;
GetAngularOffset(): number;
// Set the maximum friction force in N.
SetMaxForce(force: number): void;
// Get the maximum friction force in N.
GetMaxForce(): number;
// Set the maximum friction torque in N*m.
SetMaxTorque(torque: number): void;
// Get the maximum friction torque in N*m.
GetMaxTorque(): number;
InitVelocityConstraints(data: b2SolverData): void;
SolveVelocityConstraints(data: b2SolverData): void;
SolvePositionConstraints(data: b2SolverData): boolean;
// Dump to b2Log
Dump(): void;
}
class b2ParticleSystem {
}
}