private void PostSolveHandler(Contact contact, ContactConstraint impulse) { var gob1 = ((CollisionArea)contact.FixtureA.UserData).Owner; var gob2 = ((CollisionArea)contact.FixtureB.UserData).Owner; var eventKey = new CollisionEventKey(gob1, gob2); var previousMaxImpulse = 0f; _collisionImpulses.TryGetValue(eventKey, out previousMaxImpulse); _collisionImpulses[eventKey] = Math.Max(previousMaxImpulse, impulse.Points.Take(impulse.PointCount).Max(p => p.NormalImpulse)); }
private bool BeginContactHandler(Contact contact) { var areaA = (CollisionArea)contact.FixtureA.UserData; var areaB = (CollisionArea)contact.FixtureB.UserData; if (areaA.Owner.Owner == areaB.Owner.Owner && (areaA.Owner.Cold || areaB.Owner.Cold)) return false; // Remember which gobs collided. var eventKey = new CollisionEventKey(areaA.Owner, areaB.Owner); CollisionEvent collisionEvent = null; if (!_collisionEvents.TryGetValue(eventKey, out collisionEvent)) { collisionEvent = new CollisionEvent { SkipIrreversibleSideEffects = Game.NetworkMode == NetworkMode.Client }; _collisionEvents.Add(eventKey, collisionEvent); } collisionEvent.SetCollisionAreas(areaA, areaB); return true; }