TimeOfImpactSolverManifold class
class TimeOfImpactSolverManifold { final vec2 normal; final vec2 point; num separation; /** Pooling */ final vec2 pointA; final vec2 pointB; final vec2 temp; final vec2 planePoint; final vec2 clipPoint; /** constructor that initiliazes everything. */ TimeOfImpactSolverManifold() : normal = new vec2.zero(), point = new vec2.zero(), separation = 0, pointA = new vec2.zero(), pointB = new vec2.zero(), temp = new vec2.zero(), planePoint = new vec2.zero(), clipPoint = new vec2.zero() { } void initialize(TimeOfImpactConstraint cc, int index) { assert(cc.pointCount > 0); switch (cc.type) { case ManifoldType.CIRCLES: pointA.copyFrom(cc.bodyA.getWorldPoint(cc.localPoint)); pointB.copyFrom(cc.bodyB.getWorldPoint(cc.localPoints[0])); 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: normal.copyFrom(cc.bodyA.getWorldVector(cc.localNormal)); planePoint.copyFrom(cc.bodyA.getWorldPoint(cc.localPoint)); clipPoint.copyFrom(cc.bodyB.getWorldPoint(cc.localPoints[index])); temp.copyFrom(clipPoint).sub(planePoint); separation = dot(temp, normal) - cc.radius; point.copyFrom(clipPoint); break; case ManifoldType.FACE_B: normal.copyFrom(cc.bodyB.getWorldVector(cc.localNormal)); planePoint.copyFrom(cc.bodyB.getWorldPoint(cc.localPoint)); clipPoint.copyFrom(cc.bodyA.getWorldPoint(cc.localPoints[index])); 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
new TimeOfImpactSolverManifold() #
constructor that initiliazes everything.
TimeOfImpactSolverManifold() : normal = new vec2.zero(), point = new vec2.zero(), separation = 0, pointA = new vec2.zero(), pointB = new vec2.zero(), temp = new vec2.zero(), planePoint = new vec2.zero(), clipPoint = new vec2.zero() { }
Properties
num separation #
num separation
Methods
void initialize(TimeOfImpactConstraint cc, int index) #
void initialize(TimeOfImpactConstraint cc, int index) { assert(cc.pointCount > 0); switch (cc.type) { case ManifoldType.CIRCLES: pointA.copyFrom(cc.bodyA.getWorldPoint(cc.localPoint)); pointB.copyFrom(cc.bodyB.getWorldPoint(cc.localPoints[0])); 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: normal.copyFrom(cc.bodyA.getWorldVector(cc.localNormal)); planePoint.copyFrom(cc.bodyA.getWorldPoint(cc.localPoint)); clipPoint.copyFrom(cc.bodyB.getWorldPoint(cc.localPoints[index])); temp.copyFrom(clipPoint).sub(planePoint); separation = dot(temp, normal) - cc.radius; point.copyFrom(clipPoint); break; case ManifoldType.FACE_B: normal.copyFrom(cc.bodyB.getWorldVector(cc.localNormal)); planePoint.copyFrom(cc.bodyB.getWorldPoint(cc.localPoint)); clipPoint.copyFrom(cc.bodyA.getWorldPoint(cc.localPoints[index])); temp.copyFrom(clipPoint).sub(planePoint); separation = dot(temp, normal) - cc.radius; point.copyFrom(clipPoint); // Ensure normal points from A to B normal.negate(); break; } }