/// <summary> /// Main physics loop, find collisions, resolve them and move the bodies. /// </summary> /// <param name="delta"> amount of time for this simulation step</param> public void Step(Fix32 delta) { if (!simulate) { return; } contacts.Clear(); Fix32 invDelta = (delta > Fix32.Zero) ? (Fix32)1 / delta : Fix32.Zero; //integrate forces Profiler.BeginSample("Integrate forces"); foreach (DBody body in bodies) { if (body.IsFixed()) { continue; } integrator.IntegrateForces(body, delta); } Profiler.EndSample(); Profiler.BeginSample("Find collisions"); detector.FindCollisions(contacts); Profiler.EndSample(); //init collision manifolds foreach (Manifold contact in contacts) { contact.Init(invDelta); } //resolve collisions for (uint i = 0; i < ITERATIONS; i++) { foreach (Manifold contact in contacts) { contact.ApplyImpulse(); } } //integrate velocities foreach (DBody body in bodies) { if (body.IsFixed()) { continue; } Profiler.BeginSample("Remove-Integrate-Insert"); detector.Remove(body); integrator.IntegrateVelocities(body, delta); detector.Insert(body); Profiler.EndSample(); } }