PositionSolverManifold
class
Hide inherited
class PositionSolverManifold {
vec2 normal;
vec2 point;
num separation;
/** Pooling */
vec2 pointA;
vec2 pointB;
vec2 temp;
vec2 planePoint;
vec2 clipPoint;
PositionSolverManifold() :
normal = new vec2.zero(),
point = new vec2.zero(),
separation = 0,
// Initialize pool variables.
pointA = new vec2.zero(),
pointB = new vec2.zero(),
temp = new vec2.zero(),
planePoint = new vec2.zero(),
clipPoint = new vec2.zero() { }
void initialize(ContactConstraint cc, int index) {
assert(cc.pointCount > 0);
switch (cc.type) {
case ManifoldType.CIRCLES:
cc.bodyA.getWorldPointToOut(cc.localPoint, pointA);
cc.bodyB.getWorldPointToOut(cc.points[0].localPoint, pointB);
if (distance2(pointA, pointB) > Settings.EPSILON * Settings.EPSILON) {
normal.copyFrom(pointB).sub(pointA);
normal.normalize();
} else {
normal.splat(0.0);
}
point.copyFrom(pointA).add(pointB).scale(.5);
temp.copyFrom(pointB).sub(pointA);
separation = dot(temp, normal) - cc.radius;
break;
case ManifoldType.FACE_A:
cc.bodyA.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyA.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyB.getWorldPointToOut(cc.points[index].localPoint,
clipPoint);
temp.copyFrom(clipPoint).sub(planePoint);
separation = dot(temp, normal) - cc.radius;
point.copyFrom(clipPoint);
break;
case ManifoldType.FACE_B:
cc.bodyB.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyB.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyA.getWorldPointToOut(cc.points[index].localPoint, clipPoint);
temp.copyFrom(clipPoint).sub(planePoint);
separation = dot(temp, normal) - cc.radius;
point.copyFrom(clipPoint);
// Ensure normal points from A to B
normal.negate();
break;
}
}
}
Constructors
Code
new PositionSolverManifold () #
PositionSolverManifold() :
normal = new vec2.zero(),
point = new vec2.zero(),
separation = 0,
// Initialize pool variables.
pointA = new vec2.zero(),
pointB = new vec2.zero(),
temp = new vec2.zero(),
planePoint = new vec2.zero(),
clipPoint = new vec2.zero() { }
Methods
Code
void initialize (ContactConstraint cc, int index) #
void initialize(ContactConstraint cc, int index) {
assert(cc.pointCount > 0);
switch (cc.type) {
case ManifoldType.CIRCLES:
cc.bodyA.getWorldPointToOut(cc.localPoint, pointA);
cc.bodyB.getWorldPointToOut(cc.points[0].localPoint, pointB);
if (distance2(pointA, pointB) > Settings.EPSILON * Settings.EPSILON) {
normal.copyFrom(pointB).sub(pointA);
normal.normalize();
} else {
normal.splat(0.0);
}
point.copyFrom(pointA).add(pointB).scale(.5);
temp.copyFrom(pointB).sub(pointA);
separation = dot(temp, normal) - cc.radius;
break;
case ManifoldType.FACE_A:
cc.bodyA.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyA.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyB.getWorldPointToOut(cc.points[index].localPoint,
clipPoint);
temp.copyFrom(clipPoint).sub(planePoint);
separation = dot(temp, normal) - cc.radius;
point.copyFrom(clipPoint);
break;
case ManifoldType.FACE_B:
cc.bodyB.getWorldVectorToOut(cc.localNormal, normal);
cc.bodyB.getWorldPointToOut(cc.localPoint, planePoint);
cc.bodyA.getWorldPointToOut(cc.points[index].localPoint, clipPoint);
temp.copyFrom(clipPoint).sub(planePoint);
separation = dot(temp, normal) - cc.radius;
point.copyFrom(clipPoint);
// Ensure normal points from A to B
normal.negate();
break;
}
}