Dart Documentationbox2dPositionSolverManifold

PositionSolverManifold class

class PositionSolverManifold {
 Vector2 normal;
 Vector2 point;
 num separation;

 /** Pooling */
 Vector2 pointA;
 Vector2 pointB;
 Vector2 temp;
 Vector2 planePoint;
 Vector2 clipPoint;

 PositionSolverManifold() :
   normal = new Vector2.zero(),
   point = new Vector2.zero(),
   separation = 0,

   // Initialize pool variables.
   pointA = new Vector2.zero(),
   pointB = new Vector2.zero(),
   temp = new Vector2.zero(),
   planePoint = new Vector2.zero(),
   clipPoint = new Vector2.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 (MathBox.distanceSquared(pointA, pointB) >
           Settings.EPSILON * Settings.EPSILON){
         normal.setFrom(pointB).sub(pointA);
         normal.normalize();
       } else {
         normal.setValues(1.0, 0.0);
       }

       point.setFrom(pointA).add(pointB).scale(.5);
       temp.setFrom(pointB).sub(pointA);
       separation = temp.dot(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.setFrom(clipPoint).sub(planePoint);
       separation = temp.dot(normal) - cc.radius;
       point.setFrom(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.setFrom(clipPoint).sub(planePoint);
       separation = temp.dot(normal) - cc.radius;
       point.setFrom(clipPoint);

       // Ensure normal points from A to B
       normal.negate();
       break;
   }
 }
}

Constructors

new PositionSolverManifold() #

PositionSolverManifold() :
 normal = new Vector2.zero(),
 point = new Vector2.zero(),
 separation = 0,

 // Initialize pool variables.
 pointA = new Vector2.zero(),
 pointB = new Vector2.zero(),
 temp = new Vector2.zero(),
 planePoint = new Vector2.zero(),
 clipPoint = new Vector2.zero();

Properties

Vector2 clipPoint #

Vector2 clipPoint

Vector2 normal #

Vector2 normal

Vector2 planePoint #

Vector2 planePoint

Vector2 point #

Vector2 point

Vector2 pointA #

Pooling

Vector2 pointA

Vector2 pointB #

Vector2 pointB

num separation #

num separation

Vector2 temp #

Vector2 temp

Methods

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 (MathBox.distanceSquared(pointA, pointB) >
         Settings.EPSILON * Settings.EPSILON){
       normal.setFrom(pointB).sub(pointA);
       normal.normalize();
     } else {
       normal.setValues(1.0, 0.0);
     }

     point.setFrom(pointA).add(pointB).scale(.5);
     temp.setFrom(pointB).sub(pointA);
     separation = temp.dot(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.setFrom(clipPoint).sub(planePoint);
     separation = temp.dot(normal) - cc.radius;
     point.setFrom(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.setFrom(clipPoint).sub(planePoint);
     separation = temp.dot(normal) - cc.radius;
     point.setFrom(clipPoint);

     // Ensure normal points from A to B
     normal.negate();
     break;
 }
}