// For teleporting a body without considering new contacts immediately. public void SetTransformIgnoreContacts(Vector2 position, float angle) { //Debug.Assert(_world.IsLocked == false); if (_world.IsLocked == true) { return; } _xf.R.Set(angle); _xf.Position = position; _sweep.c0 = _sweep.c = MathUtils.Multiply(ref _xf, _sweep.localCenter); _sweep.a0 = _sweep.a = angle; BroadPhase broadPhase = _world._contactManager._broadPhase; for (Fixture f = _fixtureList; f != null; f = f._next) { f.Synchronize(broadPhase, ref _xf, ref _xf); } }
internal void Synchronize(BroadPhase broadPhase, Transform transform1, Transform transform2) //broadphase was pointer { if (m_proxies.Count() == 0) { return; } for (int i = 0; i < m_proxies.Count(); ++i) { FixtureProxy proxy = m_proxies[i]; // Compute an AABB that covers the swept shape (may miss some rotation effect). AABB aabb1, aab; m_shape.ComputeAABB(out aabb1, transform1, proxy.childIndex); m_shape.ComputeAABB(out aab, transform2, proxy.childIndex); proxy.aabb.Combine(aabb1, aab); Vec2 displacement = transform2.p - transform1.p; broadPhase.MoveProxy(proxy.proxyId, proxy.aabb, displacement); } }
internal void Synchronize(BroadPhase 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.Position - transform1.Position; broadPhase.MoveProxy(proxy.proxyId, ref proxy.aabb, displacement); } }
/// Creates a fixture and attach it to this body. Use this function if you need /// to set some fixture parameters, like friction. Otherwise you can create the /// fixture directly from a shape. /// If the density is non-zero, this function automatically updates the mass of the body. /// Contacts are not created until the next time step. /// @param def the fixture definition. /// @warning This function is locked during callbacks. public Fixture CreateFixture(FixtureDef def) { //Debug.Assert(_world.IsLocked == false); if (_world.IsLocked == true) { return(null); } Fixture fixture = new Fixture(); fixture.Create(this, def); if ((_flags & BodyFlags.Active) == BodyFlags.Active) { BroadPhase broadPhase = _world._contactManager._broadPhase; fixture.CreateProxies(broadPhase, ref _xf); } fixture._next = _fixtureList; _fixtureList = fixture; ++_fixtureCount; fixture._body = this; // Adjust mass properties if needed. if (fixture._density > 0.0f) { 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. _world._flags |= WorldFlags.NewFixture; return(fixture); }
public WorldQueryWrapper(object ignore) { broadPhase = new BroadPhase(); callback = null; }
/// Destroy a fixture. This removes the fixture from the broad-phase and /// destroys all contacts associated with this fixture. This will /// automatically adjust the mass of the body if the body is dynamic and the /// fixture has positive density. /// All fixtures attached to a body are implicitly destroyed when the body is destroyed. /// @param fixture the fixture to be removed. /// @warning This function is locked during callbacks. public void DestroyFixture(Fixture fixture) { //Debug.Assert(_world.IsLocked == false); if (_world.IsLocked == true) { return; } //Debug.Assert(fixture._body == this); // Remove the fixture from this body's singly linked list. //Debug.Assert(_fixtureCount > 0); Fixture node = _fixtureList; bool found = false; while (node != null) { if (node == fixture) { _fixtureList = fixture._next; found = true; break; } node = node._next; } // you tried to remove a shape that is not attached to this body. //Debug.Assert(found); // Destroy any contacts associated with the fixture. ContactEdge edge = _contactList; while (edge != null) { Contact c = edge.Contact; edge = edge.Next; Fixture fixtureA = c.GetFixtureA(); Fixture fixtureB = c.GetFixtureB(); if (fixture == fixtureA || fixture == fixtureB) { // This destroys the contact and removes it from // this body's contact list. _world._contactManager.Destroy(c); } } if ((_flags & BodyFlags.Active) == BodyFlags.Active) { //Debug.Assert(fixture._proxyId != BroadPhase.NullProxy); BroadPhase broadPhase = _world._contactManager._broadPhase; fixture.DestroyProxies(broadPhase); } fixture.Destroy(); fixture._body = null; fixture._next = null; --_fixtureCount; ResetMassData(); }
/// Call this to draw shapes and other debug draw data. public void DrawDebugData() { if (DebugDraw == null) { return; } DebugDrawFlags flags = DebugDraw.Flags; if ((flags & DebugDrawFlags.Shape) == DebugDrawFlags.Shape) { for (Body b = _bodyList; b != null; b = b.GetNext()) { Transform xf; b.GetTransform(out xf); for (Fixture f = b.GetFixtureList(); f != null; f = f.GetNext()) { if (b.IsActive() == false) { DrawShape(f, xf, new Color(0.5f, 0.5f, 0.3f)); } else if (b.GetType() == BodyType.Static) { DrawShape(f, xf, new Color(0.5f, 0.9f, 0.5f)); } else if (b.GetType() == BodyType.Kinematic) { DrawShape(f, xf, new Color(0.5f, 0.5f, 0.9f)); } else if (b.IsAwake() == false) { DrawShape(f, xf, new Color(0.6f, 0.6f, 0.6f)); } else { DrawShape(f, xf, new Color(0.9f, 0.7f, 0.7f)); } } } } if ((flags & DebugDrawFlags.Joint) == DebugDrawFlags.Joint) { for (Joint j = _jointList; j != null; j = j.GetNext()) { DrawJoint(j); } } if ((flags & DebugDrawFlags.Pair) == DebugDrawFlags.Pair) { Color color = new Color(0.3f, 0.9f, 0.9f); for (Contact c = _contactManager._contactList; c != null; c = c.GetNext()) { /* * Fixture fixtureA = c.GetFixtureA(); * Fixture fixtureB = c.GetFixtureB(); * * AABB aabbA; * AABB aabbB; * fixtureA.GetAABB(out aabbA); * fixtureB.GetAABB(out aabbB); * * Vector2 cA = aabbA.GetCenter(); * Vector2 cB = aabbB.GetCenter(); * * DebugDraw.DrawSegment(cA, cB, color); */ } } if ((flags & DebugDrawFlags.AABB) == DebugDrawFlags.AABB) { Color color = new Color(0.9f, 0.3f, 0.9f); BroadPhase bp = _contactManager._broadPhase; for (Body b = _bodyList; b != null; b = b.GetNext()) { if (b.IsActive() == false) { continue; } for (Fixture f = b.GetFixtureList(); f != null; f = f.GetNext()) { for (int i = 0; i < f._proxyCount; ++i) { FixtureProxy proxy = f._proxies[i]; AABB aabb; bp.GetFatAABB(proxy.proxyId, out aabb); FixedArray8 <Vector2> vs = new FixedArray8 <Vector2>(); vs[0] = new Vector2(aabb.lowerBound.x, aabb.lowerBound.y); vs[1] = new Vector2(aabb.upperBound.x, aabb.lowerBound.y); vs[2] = new Vector2(aabb.upperBound.x, aabb.upperBound.y); vs[3] = new Vector2(aabb.lowerBound.x, aabb.upperBound.y); DebugDraw.DrawPolygon(ref vs, 4, color); } } } } if ((flags & DebugDrawFlags.CenterOfMass) == DebugDrawFlags.CenterOfMass) { for (Body b = _bodyList; b != null; b = b.GetNext()) { Transform xf; b.GetTransform(out xf); xf.Position = b.GetWorldCenter(); DebugDraw.DrawTransform(ref xf); } } }
/// Call this to draw shapes and other debug draw data. public void DrawDebugData() { if (m_debugDraw == null) { return; } Draw.DrawFlags flags = m_debugDraw.GetFlags(); if (flags.HasFlag(Draw.DrawFlags.e_shapeBit)) { foreach (Body b in m_bodyList) { Transform xf = b.GetTransform(); foreach (Fixture f in b.GetFixtureList()) { if (b.IsActive() == false) { DrawShape(f, xf, Color.FromArgb(128, 128, 75)); } else if (b.GetBodyType() == BodyType._staticBody) { DrawShape(f, xf, Color.FromArgb(128, 225, 128)); } else if (b.GetBodyType() == BodyType._kinematicBody) { DrawShape(f, xf, Color.FromArgb(128, 128, 225)); } else if (b.IsAwake() == false) { DrawShape(f, xf, Color.FromArgb(150, 150, 150)); } else { DrawShape(f, xf, Color.FromArgb(225, 175, 175)); } } } } if (flags.HasFlag(Draw.DrawFlags.e_jointBit)) { foreach (Joint j in m_jointList) { DrawJoint(j); } } if (flags.HasFlag(Draw.DrawFlags.e_pairBit)) { Color color = Color.FromArgb(75, 225, 225); foreach (Contact c in m_contactManager.m_contactList) { //Fixture fixtureA = c.FixtureA; //Fixture fixtureB = c.FixtureB; //Vec2 cA = fixtureA.GetAABB().GetCenter(); //Vec2 cB = fixtureB.GetAABB().GetCenter(); //m_debugDraw.DrawSegment(cA, cB, color); } } if (flags.HasFlag(Draw.DrawFlags.e_aabbBit)) { Color color = Color.FromArgb(225, 75, 225); BroadPhase bp = m_contactManager.m_broadPhase; foreach (Body b in m_bodyList) { if (b.IsActive() == false) { continue; } foreach (Fixture f in b.GetFixtureList()) { for (int i = 0; i < f.m_proxies.Count(); ++i) { FixtureProxy proxy = f.m_proxies[i]; AABB aabb = bp.GetFatAABB(proxy.proxyId); Vec2[] vs = new Vec2[4]; vs[0].Set(aabb.lowerBound.X, aabb.lowerBound.Y); vs[1].Set(aabb.upperBound.X, aabb.lowerBound.Y); vs[2].Set(aabb.upperBound.X, aabb.upperBound.Y); vs[3].Set(aabb.lowerBound.X, aabb.upperBound.Y); m_debugDraw.DrawPolygon(vs, 4, color); } } } } if (flags.HasFlag(Draw.DrawFlags.e_centerOfMassBit)) { foreach (Body b in m_bodyList) { Transform xf = b.GetTransform(); xf.p = b.GetWorldCenter(); m_debugDraw.DrawTransform(xf); } } }