Dart Documentationbox2dPositionSolverManifold

PositionSolverManifold class

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

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() { }

Properties

vec2 clipPoint #

vec2 clipPoint

vec2 normal #

vec2 normal

vec2 planePoint #

vec2 planePoint

vec2 point #

vec2 point

vec2 pointA #

Pooling

vec2 pointA

vec2 pointB #

vec2 pointB

num separation #

num separation

vec2 temp #

vec2 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 (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;
 }
}