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