public void reset( TimeStep step, int count, Contact[] contacts, Position[] positions, Velocity[] velocities )
{
_step = step;
_count = count;
_positions = positions;
_velocities = velocities;
_contacts = contacts;
// grow the array
if( _velocityConstraints == null || _velocityConstraints.Length < count )
{
_velocityConstraints = new ContactVelocityConstraint[count * 2];
_positionConstraints = new ContactPositionConstraint[count * 2];
for( int i = 0; i < _velocityConstraints.Length; i++ )
{
_velocityConstraints[i] = new ContactVelocityConstraint();
}
for( int i = 0; i < _positionConstraints.Length; i++ )
{
_positionConstraints[i] = new ContactPositionConstraint();
}
}
// Initialize position independent portions of the constraints.
for( int i = 0; i < _count; ++i )
{
var contact = contacts[i];
var fixtureA = contact.fixtureA;
var fixtureB = contact.fixtureB;
var shapeA = fixtureA.shape;
var shapeB = fixtureB.shape;
var radiusA = shapeA.radius;
var radiusB = shapeB.radius;
var bodyA = fixtureA.body;
var bodyB = fixtureB.body;
var manifold = contact.manifold;
var pointCount = manifold.pointCount;
Debug.Assert( pointCount > 0 );
var vc = _velocityConstraints[i];
vc.friction = contact.friction;
vc.restitution = contact.restitution;
vc.tangentSpeed = contact.tangentSpeed;
vc.indexA = bodyA.islandIndex;
vc.indexB = bodyB.islandIndex;
vc.invMassA = bodyA._invMass;
vc.invMassB = bodyB._invMass;
vc.invIA = bodyA._invI;
vc.invIB = bodyB._invI;
vc.contactIndex = i;
vc.pointCount = pointCount;
vc.K.SetZero();
vc.normalMass.SetZero();
var pc = _positionConstraints[i];
pc.indexA = bodyA.islandIndex;
pc.indexB = bodyB.islandIndex;
pc.invMassA = bodyA._invMass;
pc.invMassB = bodyB._invMass;
pc.localCenterA = bodyA._sweep.LocalCenter;
pc.localCenterB = bodyB._sweep.LocalCenter;
pc.invIA = bodyA._invI;
pc.invIB = bodyB._invI;
pc.localNormal = manifold.localNormal;
pc.localPoint = manifold.localPoint;
pc.pointCount = pointCount;
pc.radiusA = radiusA;
pc.radiusB = radiusB;
pc.type = manifold.type;
for( int j = 0; j < pointCount; ++j )
{
var cp = manifold.points[j];
var vcp = vc.points[j];
if( Settings.enableWarmstarting )
{
vcp.normalImpulse = _step.dtRatio * cp.normalImpulse;
vcp.tangentImpulse = _step.dtRatio * cp.tangentImpulse;
}
else
{
vcp.normalImpulse = 0.0f;
vcp.tangentImpulse = 0.0f;
}
vcp.rA = Vector2.Zero;
vcp.rB = Vector2.Zero;
vcp.normalMass = 0.0f;
vcp.tangentMass = 0.0f;
vcp.velocityBias = 0.0f;
pc.localPoints[j] = cp.localPoint;
}
}
}