public FastestCollision DoTheFastestCollision(List <GameObject> MovingGameObjects) { // Precalculate intersecting areas var PossibleCollisionGroups = Booster.CheckAll(MovingGameObjects); // 2. For each intersecting area calculate precise collision details, if any FastestCollision fastestCollision = null; CollisionResponse collisionResponse; foreach (var TestingGroup in PossibleCollisionGroups) { foreach (var testing in TestingGroup.GetPossibleCollidingObjects()) { IPhysicControl SecondCrossTest = testing.GetSecondary(); var PrimaryDisplacements = testing.GetPrimary().GetDisplacements(); var SecondaryDisplacements = SecondCrossTest.GetDisplacements(); CollisionSimplifiedScenario Scenario; Scenario = DisplacementSimplifier.Simplify (PrimaryDisplacements, SecondaryDisplacements); if (Scenario == null) { continue; } collisionResponse = CollisionStrategy.Test(Scenario); if (collisionResponse != null) { if (fastestCollision == null || fastestCollision.CollisionDeltaTime > collisionResponse.CollisionDeltaTime) { fastestCollision = new FastestCollision( collisionResponse, SecondCrossTest.GameObject ); } } } } if (fastestCollision != null) { fastestCollision.GameObject.Hit(fastestCollision.CollisionResponse); } return(fastestCollision); }
public List <IDisplacement> GetDisplacements() { return(kinematicBody.GetDisplacements()); }