public int AddProxy(ref FixtureProxy proxy) { int proxyID = _currID++; proxy.ProxyId = proxyID; AABB aabb = Fatten(ref proxy.AABB); Element<FixtureProxy> qtnode = new Element<FixtureProxy>(proxy, aabb); _idRegister.Add(proxyID, qtnode); _quadTree.AddNode(qtnode); return proxyID; }
// These support body activation/deactivation. internal void CreateProxies(IBroadPhase broadPhase, ref Transform xf) { Debug.Assert(ProxyCount == 0); // Create proxies in the broad-phase. ProxyCount = Shape.ChildCount; for (int i = 0; i < ProxyCount; ++i) { FixtureProxy proxy = new FixtureProxy(); Shape.ComputeAABB(out proxy.AABB, ref xf, i); proxy.Fixture = this; proxy.ChildIndex = i; //FPE note: This line needs to be after the previous two because FixtureProxy is a struct proxy.ProxyId = broadPhase.AddProxy(ref proxy); Proxies[i] = proxy; } }
// These support body activation/deactivation. internal void CreateProxies(IBroadPhase broadPhase, ref Transform xf) { if (ProxyCount != 0) { throw new InvalidOperationException("Proxies allready created for this Fixture."); } // Create proxies in the broad-phase. ProxyCount = Shape.ChildCount; for (int i = 0; i < ProxyCount; ++i) { FixtureProxy proxy = new FixtureProxy(); proxy.Fixture = this; proxy.ChildIndex = i; Shape.ComputeAABB(out proxy.AABB, ref xf, i); proxy.ProxyId = broadPhase.AddProxy(ref proxy.AABB); broadPhase.SetProxy(proxy.ProxyId, ref proxy); Proxies[i] = proxy; } }
internal void Synchronize(IBroadPhase broadPhase, ref Transform transform1, ref Transform transform2) { if (ProxyCount == 0) { return; } for (int i = 0; i < ProxyCount; ++i) { FixtureProxy proxy = Proxies[i]; // Compute an AABB that covers the swept Shape (may miss some rotation effect). AABB aabb1, aabb2; Shape.ComputeAABB(out aabb1, ref transform1, proxy.ChildIndex); Shape.ComputeAABB(out aabb2, ref transform2, proxy.ChildIndex); proxy.AABB.Combine(ref aabb1, ref aabb2); Vector2 displacement = transform2.p - transform1.p; broadPhase.MoveProxy(proxy.ProxyId, ref proxy.AABB, displacement); } }
// Broad-phase callback. private void AddPair(ref FixtureProxy proxyA, ref FixtureProxy proxyB) { Fixture fixtureA = proxyA.Fixture; Fixture fixtureB = proxyB.Fixture; int indexA = proxyA.ChildIndex; int indexB = proxyB.ChildIndex; Body bodyA = fixtureA.Body; Body bodyB = fixtureB.Body; // Are the fixtures on the same body? if (bodyA == bodyB) { return; } // Does a contact already exist? ContactEdge edge = bodyB.ContactList; while (edge != null) { if (edge.Other == bodyA) { Fixture fA = edge.Contact.FixtureA; Fixture fB = edge.Contact.FixtureB; int iA = edge.Contact.ChildIndexA; int iB = edge.Contact.ChildIndexB; if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { // A contact already exists. return; } if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { // A contact already exists. return; } } edge = edge.Next; } // Does a joint override collision? Is at least one body dynamic? if (bodyB.ShouldCollide(bodyA) == false) return; //Check default filter if (ShouldCollide(fixtureA, fixtureB) == false) return; // Check user filtering. if (ContactFilter != null && ContactFilter(fixtureA, fixtureB) == false) return; if (fixtureA.BeforeCollision != null && fixtureA.BeforeCollision(fixtureA, fixtureB) == false) return; if (fixtureB.BeforeCollision != null && fixtureB.BeforeCollision(fixtureB, fixtureA) == false) return; // Call the factory. Contact c = Contact.Create(fixtureA, indexA, fixtureB, indexB); // Contact creation may swap fixtures. fixtureA = c.FixtureA; fixtureB = c.FixtureB; bodyA = fixtureA.Body; bodyB = fixtureB.Body; // Insert into the world. ContactList.Add(c); #if USE_ACTIVE_CONTACT_SET ActiveContacts.Add(c); #endif // Connect to island graph. // Connect to body A c.NodeA.Contact = c; c.NodeA.Other = bodyB; c.NodeA.Prev = null; c.NodeA.Next = bodyA.ContactList; if (bodyA.ContactList != null) { bodyA.ContactList.Prev = c.NodeA; } bodyA.ContactList = c.NodeA; // Connect to body B c.NodeB.Contact = c; c.NodeB.Other = bodyA; c.NodeB.Prev = null; c.NodeB.Next = bodyB.ContactList; if (bodyB.ContactList != null) { bodyB.ContactList.Prev = c.NodeB; } bodyB.ContactList = c.NodeB; }
private void Collision(ref FixtureProxy fp1, ref FixtureProxy fp2) { }
public Fixture(Body body, Shape shape, Object userData) { CollisionFilter = new CollisionFilter(this); //Fixture defaults Friction = 0.2f; Restitution = 0; IsSensor = false; Body = body; UserData = userData; if (Settings.ConserveMemory) Shape = shape; else Shape = shape.Clone(); // Reserve proxy space int childCount = Shape.ChildCount; Proxies = new FixtureProxy[childCount]; for (int i = 0; i < childCount; ++i) { Proxies[i] = new FixtureProxy(); Proxies[i].Fixture = null; Proxies[i].ProxyId = BroadPhase.NullProxy; } ProxyCount = 0; FixtureId = _fixtureIdCounter++; if ((Body.Flags & BodyFlags.Enabled) == BodyFlags.Enabled) { BroadPhase broadPhase = Body.World.ContactManager.BroadPhase; CreateProxies(broadPhase, ref Body.Xf); } Body.FixtureList.Add(this); // Adjust mass properties if needed. if (Shape._density > 0.0f) { Body.ResetMassData(); } // Let the world know we have a new fixture. This will cause new contacts // to be created at the beginning of the next time step. Body.World.Flags |= WorldFlags.NewFixture; if (Body.World.FixtureAdded != null) { Body.World.FixtureAdded(this); } }
// Broad-phase callback. void AddPair(ref FixtureProxy proxyA, ref FixtureProxy proxyB) { var fixtureA = proxyA.Fixture; var fixtureB = proxyB.Fixture; var indexA = proxyA.ChildIndex; var indexB = proxyB.ChildIndex; var bodyA = fixtureA.Body; var bodyB = fixtureB.Body; // Are the fixtures on the same body? if (bodyA == bodyB) { return; } // Does a contact already exist? var edge = bodyB.ContactList; while (edge != null) { if (edge.Other == bodyA) { var fA = edge.Contact.FixtureA; var fB = edge.Contact.FixtureB; int iA = edge.Contact.ChildIndexA; int iB = edge.Contact.ChildIndexB; if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { // A contact already exists. return; } if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { // A contact already exists. return; } } edge = edge.Next; } // Does a joint override collision? Is at least one body dynamic? if (bodyB.ShouldCollide(bodyA) == false) { return; } // Check default filter if (ShouldCollide(fixtureA, fixtureB) == false) { return; } // Check user filtering. if (OnContactFilter != null && OnContactFilter(fixtureA, fixtureB) == false) { return; } // FPE feature: BeforeCollision delegate if (fixtureA.BeforeCollision != null && fixtureA.BeforeCollision(fixtureA, fixtureB) == false) { return; } if (fixtureB.BeforeCollision != null && fixtureB.BeforeCollision(fixtureB, fixtureA) == false) { return; } // Call the factory. var c = Contact.Create(fixtureA, indexA, fixtureB, indexB); if (c == null) { return; } // Contact creation may swap fixtures. fixtureA = c.FixtureA; fixtureB = c.FixtureB; bodyA = fixtureA.Body; bodyB = fixtureB.Body; // Insert into the world. ContactList.Add(c); #if USE_ACTIVE_CONTACT_SET ActiveContacts.Add(c); #endif // Connect to island graph. // Connect to body A c._nodeA.Contact = c; c._nodeA.Other = bodyB; c._nodeA.Prev = null; c._nodeA.Next = bodyA.ContactList; if (bodyA.ContactList != null) { bodyA.ContactList.Prev = c._nodeA; } bodyA.ContactList = c._nodeA; // Connect to body B c._nodeB.Contact = c; c._nodeB.Other = bodyA; c._nodeB.Prev = null; c._nodeB.Next = bodyB.ContactList; if (bodyB.ContactList != null) { bodyB.ContactList.Prev = c._nodeB; } bodyB.ContactList = c._nodeB; // Wake up the bodies if (fixtureA.IsSensor == false && fixtureB.IsSensor == false) { bodyA.IsAwake = true; bodyB.IsAwake = true; } }
// Broad-phase callback. private void AddPair(ref FixtureProxy proxyA, ref FixtureProxy proxyB) { Fixture fixtureA = proxyA.Fixture; Fixture fixtureB = proxyB.Fixture; int indexA = proxyA.ChildIndex; int indexB = proxyB.ChildIndex; Body bodyA = fixtureA.Body; Body bodyB = fixtureB.Body; // Are the fixtures on the same body? if (bodyA == bodyB) { return; } // Does a contact already exist? ContactEdge edge = bodyB.ContactList; while (edge != null) { if (edge.Other == bodyA) { Fixture fA = edge.Contact.FixtureA; Fixture fB = edge.Contact.FixtureB; int iA = edge.Contact.ChildIndexA; int iB = edge.Contact.ChildIndexB; if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { // A contact already exists. return; } if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { // A contact already exists. return; } } edge = edge.Next; } // Does a joint override collision? Is at least one body dynamic? if (bodyB.ShouldCollide(bodyA) == false) { return; } // Check user filtering. if (ContactFilter != null && ContactFilter(fixtureA, fixtureB) == false) { return; } // Call the factory. Contact c = Contact.Create(fixtureA, indexA, fixtureB, indexB); // Contact creation may swap fixtures. fixtureA = c.FixtureA; fixtureB = c.FixtureB; indexA = c.ChildIndexA; indexB = c.ChildIndexB; bodyA = fixtureA.Body; bodyB = fixtureB.Body; // Insert into the world. c.Prev = null; c.Next = ContactList; if (ContactList != null) { ContactList.Prev = c; } ContactList = c; // Connect to island graph. // Connect to body A c.NodeA.Contact = c; c.NodeA.Other = bodyB; c.NodeA.Prev = null; c.NodeA.Next = bodyA.ContactList; if (bodyA.ContactList != null) { bodyA.ContactList.Prev = c.NodeA; } bodyA.ContactList = c.NodeA; // Connect to body B c.NodeB.Contact = c; c.NodeB.Other = bodyA; c.NodeB.Prev = null; c.NodeB.Next = bodyB.ContactList; if (bodyB.ContactList != null) { bodyB.ContactList.Prev = c.NodeB; } bodyB.ContactList = c.NodeB; ++ContactCount; }
// These support body activation/deactivation. internal void CreateProxies(IBroadPhase broadPhase, ref Transform xf) { Debug.Assert(ProxyCount == 0); // Create proxies in the broad-phase. ProxyCount = Shape.ChildCount; for (int i = 0; i < ProxyCount; ++i) { FixtureProxy proxy = new FixtureProxy(); Shape.ComputeAABB(out proxy.AABB, ref xf, i); proxy.Fixture = this; proxy.ChildIndex = i; proxy.ProxyId = broadPhase.AddProxy(ref proxy); Proxies[i] = proxy; } }
// These support body activation/deactivation. internal void CreateProxies(IBroadPhase broadPhase, ref Transform xf) { Debug.Assert(ProxyCount == 0); // Create proxies in the broad-phase. ProxyCount = Shape.ChildCount; for (int i = 0; i < ProxyCount; ++i) { FixtureProxy proxy = new FixtureProxy(); Shape.ComputeAABB(out proxy.AABB, ref xf, i); proxy.Fixture = this; proxy.ChildIndex = i; //FPE note: This line needs to be after the previous two because FixtureProxy is a struct proxy.ProxyId = broadPhase.AddProxy(ref proxy); Proxies[i] = proxy; } }
public abstract void OnBroadphaseCollision(ref FixtureProxy fp1, ref FixtureProxy fp2);
public void OnBroadphaseCollision(ref FixtureProxy fixtureProxyA, ref FixtureProxy fixtureProxyB) { }
public override void OnBroadphaseCollision(ref FixtureProxy fp1, ref FixtureProxy fp2) { }
// Broad-phase callback. void addPair( ref FixtureProxy proxyA, ref FixtureProxy proxyB ) { var fixtureA = proxyA.fixture; var fixtureB = proxyB.fixture; var indexA = proxyA.childIndex; var indexB = proxyB.childIndex; var bodyA = fixtureA.body; var bodyB = fixtureB.body; // Are the fixtures on the same body? if( bodyA == bodyB ) return; // Does a contact already exist? var edge = bodyB.contactList; while( edge != null ) { if( edge.other == bodyA ) { var fA = edge.contact.fixtureA; var fB = edge.contact.fixtureB; int iA = edge.contact.childIndexA; int iB = edge.contact.childIndexB; if( fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB ) { // A contact already exists. return; } if( fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA ) { // A contact already exists. return; } } edge = edge.next; } // Does a joint override collision? Is at least one body dynamic? if( bodyB.shouldCollide( bodyA ) == false ) return; // Check default filter if( shouldCollide( fixtureA, fixtureB ) == false ) return; // Check user filtering. if( onContactFilter != null && onContactFilter( fixtureA, fixtureB ) == false ) return; // FPE feature: BeforeCollision delegate if( fixtureA.beforeCollision != null && fixtureA.beforeCollision( fixtureA, fixtureB ) == false ) return; if( fixtureB.beforeCollision != null && fixtureB.beforeCollision( fixtureB, fixtureA ) == false ) return; // Call the factory. var c = Contact.create( fixtureA, indexA, fixtureB, indexB ); if( c == null ) return; // Contact creation may swap fixtures. fixtureA = c.fixtureA; fixtureB = c.fixtureB; bodyA = fixtureA.body; bodyB = fixtureB.body; // Insert into the world. contactList.Add( c ); #if USE_ACTIVE_CONTACT_SET ActiveContacts.Add(c); #endif // Connect to island graph. // Connect to body A c._nodeA.contact = c; c._nodeA.other = bodyB; c._nodeA.prev = null; c._nodeA.next = bodyA.contactList; if( bodyA.contactList != null ) bodyA.contactList.prev = c._nodeA; bodyA.contactList = c._nodeA; // Connect to body B c._nodeB.contact = c; c._nodeB.other = bodyA; c._nodeB.prev = null; c._nodeB.next = bodyB.contactList; if( bodyB.contactList != null ) bodyB.contactList.prev = c._nodeB; bodyB.contactList = c._nodeB; // Wake up the bodies if( fixtureA.isSensor == false && fixtureB.isSensor == false ) { bodyA.isAwake = true; bodyB.isAwake = true; } }
private bool QueryAABBCallbackWrapper(int proxyId) { FixtureProxy proxy = ContactManager.BroadPhase.GetUserData <FixtureProxy>(proxyId); return(_queryAABBCallback(proxy)); }
// Broad-phase callback. private void AddPair(int proxyIdA, int proxyIdB) { FixtureProxy proxyA = BroadPhase.GetProxy(proxyIdA); FixtureProxy proxyB = BroadPhase.GetProxy(proxyIdB); Fixture fixtureA = proxyA.Fixture; Fixture fixtureB = proxyB.Fixture; int indexA = proxyA.ChildIndex; int indexB = proxyB.ChildIndex; Body bodyA = fixtureA.Body; Body bodyB = fixtureB.Body; // Are the fixtures on the same body? if (bodyA == bodyB) { return; } // Does a contact already exist? for (ContactEdge ceB = bodyB.ContactList; ceB != null; ceB = ceB.Next) { if (ceB.Other == bodyA) { Fixture fA = ceB.Contact.FixtureA; Fixture fB = ceB.Contact.FixtureB; int iA = ceB.Contact.ChildIndexA; int iB = ceB.Contact.ChildIndexB; if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) { // A contact already exists. return; } if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) { // A contact already exists. return; } } } // Does a joint override collision? Is at least one body dynamic? if (bodyB.ShouldCollide(bodyA) == false) { return; } //Check default filter if (ShouldCollide(fixtureA, fixtureB) == false) { return; } // Check user filtering. var contactFilterHandler = ContactFilter; if (contactFilterHandler != null) { if (contactFilterHandler(fixtureA, fixtureB) == false) { return; } } //FPE feature: BeforeCollision delegate var beforeCollisionHandlerA = fixtureA.BeforeCollision; if (beforeCollisionHandlerA != null) { if (beforeCollisionHandlerA(fixtureA, fixtureB) == false) { return; } } var beforeCollisionHandlerB = fixtureB.BeforeCollision; if (beforeCollisionHandlerB != null) { if (beforeCollisionHandlerB(fixtureB, fixtureA) == false) { return; } } // Call the factory. Contact c = Contact.Create(this, fixtureA, indexA, fixtureB, indexB); if (c == null) { return; } // Contact creation may swap fixtures. fixtureA = c.FixtureA; fixtureB = c.FixtureB; bodyA = fixtureA.Body; bodyB = fixtureB.Body; // Insert into the world. c.Prev = ContactList; c.Next = c.Prev.Next; c.Prev.Next = c; c.Next.Prev = c; ContactCount++; #if USE_ACTIVE_CONTACT_SET ActiveContacts.Add(c); #endif // Connect to island graph. // Connect to body A c._nodeA.Contact = c; c._nodeA.Other = bodyB; c._nodeA.Prev = null; c._nodeA.Next = bodyA.ContactList; if (bodyA.ContactList != null) { bodyA.ContactList.Prev = c._nodeA; } bodyA.ContactList = c._nodeA; // Connect to body B c._nodeB.Contact = c; c._nodeB.Other = bodyA; c._nodeB.Prev = null; c._nodeB.Next = bodyB.ContactList; if (bodyB.ContactList != null) { bodyB.ContactList.Prev = c._nodeB; } bodyB.ContactList = c._nodeB; // Wake up the bodies if (fixtureA.IsSensor == false && fixtureB.IsSensor == false) { bodyA.Awake = true; bodyB.Awake = true; } }
public void OnBroadphaseCollision(ref FixtureProxy fp1, ref FixtureProxy fp2) { bAlreadyJumped = false; }
internal Fixture(Body body, Shape shape, float density) { //Fixture defaults Friction = 0.2f; _collisionCategories = CollisionCategory.All; _collidesWith = CollisionCategory.All; IsSensor = false; Body = body; #if ConserveMemory Shape = shape; #else Shape = shape.Clone(); #endif // Reserve proxy space int childCount = Shape.ChildCount; Proxies = new FixtureProxy[childCount]; for (int i = 0; i < childCount; ++i) { Proxies[i] = new FixtureProxy(); Proxies[i].Fixture = null; Proxies[i].ProxyId = BroadPhase.NullProxy; } ProxyCount = 0; Density = density; FixtureId = _fixtureIdCounter++; }