private void NarrowPhase() { narrowPhasePairs.Clear(); for (int i = 0; i < broadPhasePairs.Count; i++) { broadPhasePairs[i].solve(); if (broadPhasePairs[i].contactCount > 0) { broadPhasePairs[i].A.currentlyCollidingWith.Add(broadPhasePairs[i].B.coll); broadPhasePairs[i].B.currentlyCollidingWith.Add(broadPhasePairs[i].A.coll); // If either are a trigger, don't bother. if (broadPhasePairs[i].A.coll.isTrigger || broadPhasePairs[i].B.coll.isTrigger) { continue; } narrowPhasePairs.Add(broadPhasePairs[i]); } } // Integrate forces for (int i = 0; i < bodies.Count; ++i) { IntegrateForces(bodies[i], TFPhysics.instance.settings.deltaTime); } // Initialize collision for (int i = 0; i < narrowPhasePairs.Count; ++i) { narrowPhasePairs[i].initialize(); } // Solve collisions for (int j = 0; j < TFPhysics.instance.settings.solveCollisionIterations; ++j) { for (int i = 0; i < narrowPhasePairs.Count; ++i) { narrowPhasePairs[i].ApplyImpulse(); } } // Integrate velocities for (int i = 0; i < bodies.Count; ++i) { IntegrateVelocity(bodies[i], TFPhysics.instance.settings.deltaTime); } // Correct positions for (int i = 0; i < narrowPhasePairs.Count; ++i) { narrowPhasePairs[i].PositionalCorrection(); } for (int i = 0; i < bodies.Count; ++i) { // Clear all forces TFRigidbody b = bodies[i]; b.info.force = new FixVec2(0, 0); b.info.torque = 0; // Handle events b.HandlePhysicsEvents(); } }