Dart Documentationbox2dPositionSolverManifold

PositionSolverManifold class

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

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

 PositionSolverManifold() :
   normal = new Vector(),
   point = new Vector(),
   separation = 0,

   // Initialize pool variables.
   pointA = new Vector(),
   pointB = new Vector(),
   temp = new Vector(),
   planePoint = new Vector(),
   clipPoint = new Vector() { }

 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).subLocal(pointA);
         normal.normalize();
       } else {
         normal.setCoords(1.0, 0.0);
       }

       point.setFrom(pointA).addLocal(pointB).mulLocal(.5);
       temp.setFrom(pointB).subLocal(pointA);
       separation = Vector.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.setFrom(clipPoint).subLocal(planePoint);
       separation = Vector.dot(temp, 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).subLocal(planePoint);
       separation = Vector.dot(temp, normal) - cc.radius;
       point.setFrom(clipPoint);

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

Constructors

new PositionSolverManifold() #

PositionSolverManifold() :
 normal = new Vector(),
 point = new Vector(),
 separation = 0,

 // Initialize pool variables.
 pointA = new Vector(),
 pointB = new Vector(),
 temp = new Vector(),
 planePoint = new Vector(),
 clipPoint = new Vector() { }

Properties

Vector clipPoint #

clipPoint

Vector normal #

normal

Vector planePoint #

planePoint

Vector point #

point

Vector pointA #

pointA

Vector pointB #

pointB

num separation #

separation

Vector temp #

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).subLocal(pointA);
       normal.normalize();
     } else {
       normal.setCoords(1.0, 0.0);
     }

     point.setFrom(pointA).addLocal(pointB).mulLocal(.5);
     temp.setFrom(pointB).subLocal(pointA);
     separation = Vector.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.setFrom(clipPoint).subLocal(planePoint);
     separation = Vector.dot(temp, 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).subLocal(planePoint);
     separation = Vector.dot(temp, normal) - cc.radius;
     point.setFrom(clipPoint);

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