public void Update() { if (collisionDomain.HasContact(CollisionObject)) { if (triggeredRigidbodies.Count != 0) { triggeredRigidbodies.RemoveAll(rigidBody1 => !collisionDomain.HaveContact(CollisionObject, rigidBody1.CollisionObject)); } var characters = collisionDomain.GetContactObjects(CollisionObject) .Select(collisionObject => collisionObject.GeometricObject) .OfType <RigidBody>() .Where(rigidBody1 => rigidBody1.Name == nameOfTarget) .Except(triggeredRigidbodies); foreach (var character in characters) { triggeredRigidbodies.Add(character); OnTriggerEnter(character.UserData); } } else { if (triggeredRigidbodies.Count != 0) { triggeredRigidbodies.Clear(); } } }
public override void Update(GameTime gameTime) { // ----- Move object A with arrow keys. // Compute displacement. Vector3F displacement = Vector3F.Zero; if (InputService.IsDown(Keys.Up)) { displacement.Y += 0.1f; } if (InputService.IsDown(Keys.Left)) { displacement.X -= 0.1f; } if (InputService.IsDown(Keys.Down)) { displacement.Y -= 0.1f; } if (InputService.IsDown(Keys.Right)) { displacement.X += 0.1f; } // Update the position of object A (green box). Pose pose = _collisionObjectA.GeometricObject.Pose; pose.Position += displacement; // Note: We have to cast to GeometricObject because CollisionObject.GeometricObject // is of type IGeometricObject which does not have a setter for the Pose property. ((GeometricObject)_collisionObjectA.GeometricObject).Pose = pose; // ----- Update collision domain. This computes new contact information. float timeStep = (float)gameTime.ElapsedGameTime.TotalSeconds; _domain.Update(timeStep); // Needs to be called once per frame. // ----- Draw objects using the DebugRenderer of the graphics screen. // We reset the DebugRenderer every frame. var debugRenderer = GraphicsScreen.DebugRenderer; debugRenderer.Clear(); // Draw geometric objects. If an object has a contact with any other object, // it is drawn yellow. bool objectBHasContact = _domain.HasContact(_collisionObjectB); var color = objectBHasContact ? Color.Yellow : Color.Blue; debugRenderer.DrawObject(_collisionObjectB.GeometricObject, color, false, false); bool objectCHasContact = _domain.HasContact(_collisionObjectC); color = objectCHasContact ? Color.Yellow : Color.Red; debugRenderer.DrawObject(_collisionObjectC.GeometricObject, color, false, false); bool objectAHasContact = _domain.HasContact(_collisionObjectA); color = objectAHasContact ? Color.Yellow : Color.Green; debugRenderer.DrawObject(_collisionObjectA.GeometricObject, color, false, false); // Get closest points. // Closest-point queries are not used as often as contact queries. They are // not computed by the collision domain. Therefore, we ask the collision // detection for the closest points. ContactSet closestPointsAB = _collisionDetection.GetClosestPoints(_collisionObjectA, _collisionObjectB); ContactSet closestPointsAC = _collisionDetection.GetClosestPoints(_collisionObjectA, _collisionObjectC); ContactSet closestPointsBC = _collisionDetection.GetClosestPoints(_collisionObjectB, _collisionObjectC); // Draw closest points. // Each contact set contains one contact that describes the closest-point pair. debugRenderer.DrawPoint(closestPointsAB[0].PositionAWorld, Color.White, true); debugRenderer.DrawPoint(closestPointsAB[0].PositionBWorld, Color.White, true); debugRenderer.DrawPoint(closestPointsAC[0].PositionAWorld, Color.White, true); debugRenderer.DrawPoint(closestPointsAC[0].PositionBWorld, Color.White, true); debugRenderer.DrawPoint(closestPointsBC[0].PositionAWorld, Color.White, true); debugRenderer.DrawPoint(closestPointsBC[0].PositionBWorld, Color.White, true); // Draw lines that represent the minimal distances. debugRenderer.DrawLine(closestPointsAB[0].PositionAWorld, closestPointsAB[0].PositionBWorld, Color.White, true); debugRenderer.DrawLine(closestPointsAC[0].PositionAWorld, closestPointsAC[0].PositionBWorld, Color.White, true); debugRenderer.DrawLine(closestPointsBC[0].PositionAWorld, closestPointsBC[0].PositionBWorld, Color.White, true); }
public void HaveContact() { CollisionDomain domain = new CollisionDomain(new CollisionDetection()); domain.CollisionDetection.CollisionFilter = new CollisionFilter(); CollisionObject a = new CollisionObject(); ((GeometricObject)a.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)a.GeometricObject).Pose = new Pose(new Vector3F(0, 0, 0)); //a.Name = "a"; CollisionObject b = new CollisionObject(); ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(1, 0, 0f)); //b.Name = "b"; CollisionObject c = new CollisionObject(); ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3F(1, 0, 0f)); //c.Name = "c"; domain.CollisionObjects.Add(a); domain.CollisionObjects.Add(b); domain.Update(0.01f); Assert.AreEqual(true, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(true, domain.HasContact(a)); Assert.AreEqual(true, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(1, domain.GetContacts(a, b).Count); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(1, domain.GetContacts(a).Count()); Assert.AreEqual(2, domain.GetContacts(c).Count()); Assert.AreEqual(1, domain.ContactSets.Count); b.Enabled = false; domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(1, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); a.Enabled = false; b.Enabled = true; domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(false, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(null, domain.GetContacts(a, c)); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(1, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); c.Enabled = false; domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(false, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(false, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(null, domain.GetContacts(a, c)); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(0, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); a.Enabled = true; c.Enabled = true; ((CollisionFilter) domain.CollisionDetection.CollisionFilter).Set(a, b, false); domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(2, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); ((CollisionFilter) domain.CollisionDetection.CollisionFilter).Set(a, b, true); domain.Update(0.01f); Assert.AreEqual(true, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(true, domain.HasContact(a)); Assert.AreEqual(true, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(1, domain.GetContacts(a, b).Count); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(1, domain.GetContacts(a).Count()); Assert.AreEqual(2, domain.GetContacts(c).Count()); Assert.AreEqual(1, domain.ContactSets.Count); c.Enabled = false; domain.Update(0.01f); Assert.AreEqual(true, domain.HaveContact(a, b)); Assert.AreEqual(false, domain.HaveContact(a, c)); Assert.AreEqual(true, domain.HasContact(a)); Assert.AreEqual(true, domain.HasContact(b)); Assert.AreEqual(false, domain.HasContact(c)); Assert.AreEqual(1, domain.GetContacts(a, b).Count); Assert.AreEqual(null, domain.GetContacts(a, c)); Assert.AreEqual(1, domain.GetContacts(a).Count()); Assert.AreEqual(0, domain.GetContacts(c).Count()); Assert.AreEqual(1, domain.ContactSets.Count); }
public void RayCastStopsAtFirstHit() { CollisionDomain domain = new CollisionDomain(new CollisionDetection()); CollisionObject ray = new CollisionObject(); ((GeometricObject)ray.GeometricObject).Shape = new RayShape(new Vector3F(), new Vector3F(1, 0, 0), 100) { StopsAtFirstHit = true, }; //ray.Name = "Ray"; CollisionObject b = new CollisionObject(); ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(-10, 0, 0f)); //b.Name = "b"; CollisionObject c = new CollisionObject(); ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3F(0, 0, 0f)); //c.Name = "c"; CollisionObject d = new CollisionObject(); ((GeometricObject)d.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3F(10, 0, 0f)); //d.Name = "d"; CollisionObject e = new CollisionObject(); ((GeometricObject)e.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)e.GeometricObject).Pose = new Pose(new Vector3F(20, 0, 0f)); //e.Name = "e"; CollisionObject f = new CollisionObject(); ((GeometricObject)f.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)f.GeometricObject).Pose = new Pose(new Vector3F(110, 0, 0f)); //f.Name = "f"; // Positions: b=-10, c=0, d=10, e=20, f=110 domain.CollisionObjects.Add(ray); domain.CollisionObjects.Add(b); domain.CollisionObjects.Add(d); domain.CollisionObjects.Add(c); domain.CollisionObjects.Add(e); domain.CollisionObjects.Add(f); domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, c)); ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3F(30)); // Positions: b=-10, d=10, e=20, c=30, f=110 domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, d)); ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3F(40)); // Positions: b=-10, e=20, c=30, d=40, f=110 domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, e)); ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, QuaternionF.CreateRotationZ(ConstantsF.PiOver2)); domain.Update(0.01f); Assert.AreEqual(0, domain.GetContacts(ray).Count()); ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, QuaternionF.CreateRotationZ(ConstantsF.Pi)); domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, b)); ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, QuaternionF.Identity); domain.Update(0.01f); // Positions: b=-10, e=20, c=30, d=40, f=110 CollisionObject gNotInDomain = new CollisionObject(); ((GeometricObject)gNotInDomain.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3F(10, 0, 0f)); Assert.AreEqual(true, domain.HaveContact(ray, gNotInDomain)); Assert.AreEqual(1, domain.GetContacts(gNotInDomain).Count()); Assert.AreEqual(1, domain.GetContacts(ray, gNotInDomain).Count); Assert.AreEqual(true, domain.HasContact(gNotInDomain)); ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3F(25, 0, 0f)); // behind e Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain)); Assert.AreEqual(false, domain.HaveContact(gNotInDomain, ray)); Assert.AreEqual(false, domain.HasContact(gNotInDomain)); Assert.AreEqual(0, domain.GetContacts(gNotInDomain).Count()); Assert.IsNull(domain.GetContacts(ray, gNotInDomain)); Assert.IsNull(domain.GetContacts(gNotInDomain, ray)); // Remove ray from domain. domain.CollisionObjects.Remove(ray); domain.Update(0.01f); Assert.AreEqual(0, domain.ContactSets.Count); // Positions: b=-10, e=20, g=25, c=30, d=40, f=110 domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, e)); Assert.AreEqual(false, domain.HaveContact(ray, c)); Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain)); Assert.IsNull(domain.GetContacts(ray, gNotInDomain)); }
public void RayCastStopsAtFirstHit() { CollisionDomain domain = new CollisionDomain(new CollisionDetection()); CollisionObject ray = new CollisionObject(); ((GeometricObject)ray.GeometricObject).Shape = new RayShape(new Vector3(), new Vector3(1, 0, 0), 100) { StopsAtFirstHit = true, }; //ray.Name = "Ray"; CollisionObject b = new CollisionObject(); ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3(-10, 0, 0f)); //b.Name = "b"; CollisionObject c = new CollisionObject(); ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3(0, 0, 0f)); //c.Name = "c"; CollisionObject d = new CollisionObject(); ((GeometricObject)d.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3(10, 0, 0f)); //d.Name = "d"; CollisionObject e = new CollisionObject(); ((GeometricObject)e.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)e.GeometricObject).Pose = new Pose(new Vector3(20, 0, 0f)); //e.Name = "e"; CollisionObject f = new CollisionObject(); ((GeometricObject)f.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)f.GeometricObject).Pose = new Pose(new Vector3(110, 0, 0f)); //f.Name = "f"; // Positions: b=-10, c=0, d=10, e=20, f=110 domain.CollisionObjects.Add(ray); domain.CollisionObjects.Add(b); domain.CollisionObjects.Add(d); domain.CollisionObjects.Add(c); domain.CollisionObjects.Add(e); domain.CollisionObjects.Add(f); domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, c)); ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3(30)); // Positions: b=-10, d=10, e=20, c=30, f=110 domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, d)); ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3(40)); // Positions: b=-10, e=20, c=30, d=40, f=110 domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, e)); ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, Quaternion.CreateRotationZ(ConstantsF.PiOver2)); domain.Update(0.01f); Assert.AreEqual(0, domain.GetContacts(ray).Count()); ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, Quaternion.CreateRotationZ(ConstantsF.Pi)); domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, b)); ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, Quaternion.Identity); domain.Update(0.01f); // Positions: b=-10, e=20, c=30, d=40, f=110 CollisionObject gNotInDomain = new CollisionObject(); ((GeometricObject)gNotInDomain.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3(10, 0, 0f)); Assert.AreEqual(true, domain.HaveContact(ray, gNotInDomain)); Assert.AreEqual(1, domain.GetContacts(gNotInDomain).Count()); Assert.AreEqual(1, domain.GetContacts(ray, gNotInDomain).Count); Assert.AreEqual(true, domain.HasContact(gNotInDomain)); ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3(25, 0, 0f)); // behind e Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain)); Assert.AreEqual(false, domain.HaveContact(gNotInDomain, ray)); Assert.AreEqual(false, domain.HasContact(gNotInDomain)); Assert.AreEqual(0, domain.GetContacts(gNotInDomain).Count()); Assert.IsNull(domain.GetContacts(ray, gNotInDomain)); Assert.IsNull(domain.GetContacts(gNotInDomain, ray)); // Remove ray from domain. domain.CollisionObjects.Remove(ray); domain.Update(0.01f); Assert.AreEqual(0, domain.ContactSets.Count); // Positions: b=-10, e=20, g=25, c=30, d=40, f=110 domain.Update(0.01f); Assert.AreEqual(1, domain.GetContacts(ray).Count()); Assert.AreEqual(true, domain.HaveContact(ray, e)); Assert.AreEqual(false, domain.HaveContact(ray, c)); Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain)); Assert.IsNull(domain.GetContacts(ray, gNotInDomain)); }
public void HaveContact() { CollisionDomain domain = new CollisionDomain(new CollisionDetection()); domain.CollisionDetection.CollisionFilter = new CollisionFilter(); CollisionObject a = new CollisionObject(); ((GeometricObject)a.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)a.GeometricObject).Pose = new Pose(new Vector3(0, 0, 0)); //a.Name = "a"; CollisionObject b = new CollisionObject(); ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3(1, 0, 0f)); //b.Name = "b"; CollisionObject c = new CollisionObject(); ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1); ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3(1, 0, 0f)); //c.Name = "c"; domain.CollisionObjects.Add(a); domain.CollisionObjects.Add(b); domain.Update(0.01f); Assert.AreEqual(true, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(true, domain.HasContact(a)); Assert.AreEqual(true, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(1, domain.GetContacts(a, b).Count); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(1, domain.GetContacts(a).Count()); Assert.AreEqual(2, domain.GetContacts(c).Count()); Assert.AreEqual(1, domain.ContactSets.Count); b.Enabled = false; domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(1, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); a.Enabled = false; b.Enabled = true; domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(false, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(null, domain.GetContacts(a, c)); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(1, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); c.Enabled = false; domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(false, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(false, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(null, domain.GetContacts(a, c)); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(0, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); a.Enabled = true; c.Enabled = true; ((CollisionFilter)domain.CollisionDetection.CollisionFilter).Set(a, b, false); domain.Update(0.01f); Assert.AreEqual(false, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(false, domain.HasContact(a)); Assert.AreEqual(false, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(null, domain.GetContacts(a, b)); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(0, domain.GetContacts(a).Count()); Assert.AreEqual(2, domain.GetContacts(c).Count()); Assert.AreEqual(0, domain.ContactSets.Count); ((CollisionFilter)domain.CollisionDetection.CollisionFilter).Set(a, b, true); domain.Update(0.01f); Assert.AreEqual(true, domain.HaveContact(a, b)); Assert.AreEqual(true, domain.HaveContact(a, c)); Assert.AreEqual(true, domain.HasContact(a)); Assert.AreEqual(true, domain.HasContact(b)); Assert.AreEqual(true, domain.HasContact(c)); Assert.AreEqual(1, domain.GetContacts(a, b).Count); Assert.AreEqual(1, domain.GetContacts(a, c).Count); Assert.AreEqual(1, domain.GetContacts(a).Count()); Assert.AreEqual(2, domain.GetContacts(c).Count()); Assert.AreEqual(1, domain.ContactSets.Count); c.Enabled = false; domain.Update(0.01f); Assert.AreEqual(true, domain.HaveContact(a, b)); Assert.AreEqual(false, domain.HaveContact(a, c)); Assert.AreEqual(true, domain.HasContact(a)); Assert.AreEqual(true, domain.HasContact(b)); Assert.AreEqual(false, domain.HasContact(c)); Assert.AreEqual(1, domain.GetContacts(a, b).Count); Assert.AreEqual(null, domain.GetContacts(a, c)); Assert.AreEqual(1, domain.GetContacts(a).Count()); Assert.AreEqual(0, domain.GetContacts(c).Count()); Assert.AreEqual(1, domain.ContactSets.Count); }