Dart Documentationbox2dTimeOfImpactSolverManifold

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

final vec2 clipPoint #

final vec2 clipPoint

final vec2 normal #

final vec2 normal

final vec2 planePoint #

final vec2 planePoint

final vec2 point #

final vec2 point

final vec2 pointA #

Pooling

final vec2 pointA

final vec2 pointB #

final vec2 pointB

num separation #

num separation

final vec2 temp #

final vec2 temp

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