FarseerPhysics.Dynamics.Contacts.ContactSolver.reset C# (CSharp) Method

reset() public method

public reset ( TimeStep step, int count, Contact contacts, Position positions, Velocity velocities ) : void
step TimeStep
count int
contacts Contact
positions Position
velocities Velocity
return void
		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;
				}
			}
		}