updateManifold method

void updateManifold()

Update the contact manifold.

Implementation

void updateManifold() {
  constraint.restitution = mixRestitution(shape1!.restitution, shape2!.restitution);
  constraint.friction = mixFriction(shape1!.friction,shape2!.friction);
  int numBuffers = manifold.numPoints;
  for(int i=numBuffers-1;i>=0;i--){
    ImpulseDataBuffer b = buffer[i];
    ManifoldPoint p = points[i];
    b.lp1X=p.localPoint1.x;
    b.lp1Y=p.localPoint1.y;
    b.lp1Z=p.localPoint1.z;
    b.lp2X=p.localPoint2.x;
    b.lp2Y=p.localPoint2.y;
    b.lp2Z=p.localPoint2.z;
    b.impulse=p.normalImpulse;
  }

  manifold.numPoints=0;
  detector?.detectCollision( //TODO
    shape1!,
    shape2!,
    manifold
  );
  int num = manifold.numPoints;
  if(num==0){
    touching = false;
    close = false;
    dist = double.maxFinite;
    return;
  }

  if(touching || dist < 0.001 ){
    close = true;
  }
  touching=true;

  for(int i=num-1; i>=0; i--){
    ManifoldPoint p= points[i];
    double lp1x=p.localPoint1.x;
    double lp1y=p.localPoint1.y;
    double lp1z=p.localPoint1.z;
    double lp2x=p.localPoint2.x;
    double lp2y=p.localPoint2.y;
    double lp2z=p.localPoint2.z;
    int index = -1;
    double minDistance=0.0004;

    for(int j=numBuffers-1;j>=0;j--){
      ImpulseDataBuffer b = buffer[j];
      double dx = b.lp1X!-lp1x;
      double dy = b.lp1Y!-lp1y;
      double dz = b.lp1Z!-lp1z;
      double distance1=dx*dx+dy*dy+dz*dz;

      dx=b.lp2X!-lp2x;
      dy=b.lp2Y!-lp2y;
      dz=b.lp2Z!-lp2z;

      double distance2 = dx*dx+dy*dy+dz*dz;
      if(distance1<distance2){
        if(distance1<minDistance){
          minDistance=distance1;
          index = j;
        }
      }
      else{
        if(distance2<minDistance){
          minDistance=distance2;
          index=j;
        }
      }

      if( minDistance < dist ){dist = minDistance;}
    }
    if(index!=-1){
      ImpulseDataBuffer tmp = buffer[index];
      buffer[index] = buffer[--numBuffers];
      buffer[numBuffers] = tmp;
      p.normalImpulse = tmp.impulse!;
      p.warmStarted=true;
    }
    else{
      p.normalImpulse=0;
      p.warmStarted=false;
    }
  }
}