public ContactManager(World argPool, BroadPhase broadPhase) { m_contactList = null; m_contactCount = 0; m_contactFilter = new ContactFilter(); m_contactListener = null; m_broadPhase = broadPhase; pool = argPool; }
void DoTimeStep() { SpaceObjectBuffer.Update(); EntityStateWriteBuffer.Update(); DeactivationManager.Update(); ForceUpdater.Update(); DuringForcesUpdateables.Update(); BoundingBoxUpdater.Update(); BroadPhase.Update(); BeforeNarrowPhaseUpdateables.Update(); NarrowPhase.Update(); BeforeSolverUpdateables.Update(); NarrowPhase.FlushGeneratedSolverUpdateables(); Solver.Update(); BeforePositionUpdateUpdateables.Update(); PositionUpdater.Update(); BufferedStates.ReadBuffers.Update(); DeferredEventDispatcher.Update(); EndOfTimeStepUpdateables.Update(); }
internal void SynchronizeFixtures() { Transform xf1 = new Transform(); float c = (float)Math.Cos(Sweep.A0), s = (float)Math.Sin(Sweep.A0); xf1.R.Col1.X = c; xf1.R.Col2.X = -s; xf1.R.Col1.Y = s; xf1.R.Col2.Y = c; xf1.Position.X = Sweep.C0.X - (xf1.R.Col1.X * Sweep.LocalCenter.X + xf1.R.Col2.X * Sweep.LocalCenter.Y); xf1.Position.Y = Sweep.C0.Y - (xf1.R.Col1.Y * Sweep.LocalCenter.X + xf1.R.Col2.Y * Sweep.LocalCenter.Y); BroadPhase broadPhase = World.ContactManager.BroadPhase; for (int i = 0; i < FixtureList.Count; i++) { FixtureList[i].Synchronize(broadPhase, ref xf1, ref Xf); } }
/// <summary> /// Creates a fixture and attach it to this body. /// @warning This function is locked during callbacks. /// </summary> /// <param name="def">The fixture definition.</param> public Fixture CreateFixture(FixtureDef def) { if (_world._lock == true) { return(null); } BroadPhase broadPhase = _world._broadPhase; Fixture fixture = new Fixture(); fixture.Create(broadPhase, this, _xf, def); fixture._next = _fixtureList; _fixtureList = fixture; ++_fixtureCount; fixture._body = this; return(fixture); }
/// <summary> /// For teleporting a body without considering new contacts immediately. /// </summary> /// <param name="position">The position.</param> /// <param name="angle">The angle.</param> public void SetTransformIgnoreContacts(ref Vector2 position, float angle) { Debug.Assert(World.IsLocked == false); if (World.IsLocked) { 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; foreach (Fixture f in FixtureList) { f.Synchronize(broadPhase, ref Xf, ref Xf); } }
/// <summary> /// Destroy a fixture. This removes the fixture from the broad-phase and /// therefore destroys any contacts associated with this fixture. All fixtures /// attached to a body are implicitly destroyed when the body is destroyed. /// @warning This function is locked during callbacks. /// </summary> /// <param name="fixture">The fixture to be removed.</param> public void DestroyFixture(Fixture fixture) { Box2DXDebug.Assert(_world._lock == false); if (_world._lock == true) { return; } Box2DXDebug.Assert(fixture.Body == this); // Remove the fixture from this body's singly linked list. Box2DXDebug.Assert(_fixtureCount > 0); Fixture node = _fixtureList; bool found = false; while (node != null) { if (node == fixture) { //*node = fixture->m_next; _fixtureList = fixture.Next; found = true; break; } node = node.Next; } // You tried to remove a shape that is not attached to this body. Box2DXDebug.Assert(found); BroadPhase broadPhase = _world._broadPhase; fixture.Destroy(broadPhase); fixture._body = null; fixture._next = null; --_fixtureCount; }
/// <summary> /// Creates a fixture and attach it to this body. /// @warning This function is locked during callbacks. /// </summary> /// <param name="def">The fixture definition.</param> public Fixture CreateFixture(FixtureDef def) { Box2DxDebug.Assert(world.Lock == false); if (world.Lock) { return(null); } BroadPhase broadPhase = world.BroadPhase; Fixture fixture = new Fixture(); fixture.Create(broadPhase, this, Xf, def); fixture.Next = FixtureList; FixtureList = fixture; ++FixtureCount; fixture.Body = this; return(fixture); }
// We need separation create/destroy functions from the constructor/destructor because // the destructor cannot access the allocator or broad-phase (no destructor arguments allowed by C++). public void Create(BroadPhase broadPhase, Body body, Transform xf, FixtureDef def) { UserData = def.UserData; Friction = def.Friction; Restitution = def.Restitution; Body = body; _next = null; Filter = def.Filter; IsSensor = def.IsSensor; Shape = def.Shape.Clone(); Shape.ComputeMass(out _massData, def.Density); // Create proxy in the broad-phase. Shape.ComputeAABB(out Aabb, ref xf); ProxyId = broadPhase.CreateProxy(Aabb, this); }
// TODO djm: check out about this new fixture here /// <summary> /// 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. /// </summary> /// <param name="def">the fixture definition.</param> /// <warning>This function is locked during callbacks.</warning> public Fixture CreateFixture(FixtureDef def) { Debug.Assert(World.Locked == false); if (World.Locked == true) { return(null); } // djm TODO from pool? Fixture fixture = new Fixture(); fixture.Create(this, def); if ((Flags & TypeFlags.Active) == TypeFlags.Active) { BroadPhase broadPhase = World.ContactManager.BroadPhase; fixture.CreateProxies(broadPhase, 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 |= World.NEW_FIXTURE; return(fixture); }
protected Simulation(BufferPool bufferPool, SimulationAllocationSizes initialAllocationSizes) { BufferPool = bufferPool; Shapes = new Shapes(bufferPool, initialAllocationSizes.ShapesPerType); BroadPhase = new BroadPhase(bufferPool, initialAllocationSizes.Bodies, initialAllocationSizes.Bodies + initialAllocationSizes.Statics); Activator = new IslandActivator(); Bodies = new Bodies(bufferPool, Activator, Shapes, BroadPhase, initialAllocationSizes.Bodies, initialAllocationSizes.Islands, initialAllocationSizes.ConstraintCountPerBodyEstimate); Statics = new Statics(bufferPool, Shapes, Bodies, BroadPhase, Activator, initialAllocationSizes.Statics); Solver = new Solver(Bodies, BufferPool, 8, initialCapacity: initialAllocationSizes.Constraints, initialIslandCapacity: initialAllocationSizes.Islands, minimumCapacityPerTypeBatch: initialAllocationSizes.ConstraintsPerTypeBatch); Bodies.Initialize(Solver); Deactivator = new Deactivator(Bodies, Solver, BufferPool); PoseIntegrator = new PoseIntegrator(Bodies, Shapes, BroadPhase); SolverBatchCompressor = new BatchCompressor(Solver, Bodies); BodyLayoutOptimizer = new BodyLayoutOptimizer(Bodies, BroadPhase, Solver, bufferPool); ConstraintLayoutOptimizer = new ConstraintLayoutOptimizer(Bodies, Solver); }
public void SetTransform(Vec2 position, float angle) { Box2DXDebug.Assert(_world.IsLocked() == false); if (_world.IsLocked() == true) { return; } _xf.R.Set(angle); _xf.Position = position; _sweep.C0 = _sweep.C = Math.Mul(_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, _xf, _xf); } _world._contactManager.FindNewContacts(); }
internal void RefilterProxy(BroadPhase broadPhase, XForm transform) { if (_proxyId == PairManager.NullProxy) { return; } broadPhase.DestroyProxy(_proxyId); AABB aabb; _shape.ComputeAABB(out aabb, transform); bool inRange = broadPhase.InRange(aabb); if (inRange) { _proxyId = broadPhase.CreateProxy(aabb, this); } else { _proxyId = PairManager.NullProxy; } }
// Update is called once per frame void Update() { if (from == null) { return; } if (to == null) { return; } ray.pos = from.position; ray.dir = (to.position - from.position).normalized; rayCastResult = BroadPhase.GetInstance().RayCast(ray); if (rayCastResult.hit) { Debug.DrawRay(ray.pos, ray.dir * 1000, Color.red); rayCastResult.collider.DebugDraw(Color.red); } else { Debug.DrawRay(ray.pos, ray.dir * 1000, Color.green); } }
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); } }
/** * Call this if you want to establish collision that was previously disabled by * ContactFilter::ShouldCollide. */ public void refilter() { if (m_body == null) { return; } // Flag associated contacts for filtering. ContactEdge edge = m_body.getContactList(); while (edge != null) { Contact contact = edge.contact; Fixture fixtureA = contact.getFixtureA(); Fixture fixtureB = contact.getFixtureB(); if (fixtureA == this || fixtureB == this) { contact.flagForFiltering(); } edge = edge.next; } World world = m_body.getWorld(); if (world == null) { return; } // Touch each proxy so that new pairs may be created BroadPhase broadPhase = world.m_contactManager.m_broadPhase; for (int i = 0; i < m_proxyCount; ++i) { broadPhase.touchProxy(m_proxies[i].proxyId); } }
/// <summary> /// Call this if you want to establish collision that was previously disabled by /// ContactFilter::ShouldCollide. /// </summary> public void Refilter() { if (Body == null) { return; } // Flag associated contacts for filtering. ContactEdge edge = Body.ContactList; while (edge != null) { Contact contact = edge.Contact; Fixture fixtureA = contact.FixtureA; Fixture fixtureB = contact.FixtureB; if (fixtureA == this || fixtureB == this) { contact.SetFlagForFiltering(); } edge = edge.Next; } World world = Body.World; if (world == null) { return; } // Touch each proxy so that new pairs may be created BroadPhase broadPhase = world.ContactManager.BroadPhase; for (int i = 0; i < ProxyCount; ++i) { broadPhase.TouchProxy(Proxies[i].ProxyId); } }
/// <summary> /// Creates a fixture and attach it to this body. /// If the density is non-zero, this function automatically updates the mass of the body. /// Contacts are not created until the next time step. /// Warning: This function is locked during callbacks. /// </summary> /// <param name="shape">The shape.</param> /// <param name="density">The density.</param> /// <returns></returns> public Fixture CreateFixture(Shape shape, float density) { Debug.Assert(World.IsLocked == false); if (World.IsLocked) { return(null); } Fixture fixture = new Fixture(this, shape, density); if ((Flags & BodyFlags.Active) == BodyFlags.Active) { BroadPhase broadPhase = World.ContactManager.BroadPhase; fixture.CreateProxies(broadPhase, ref Xf); } FixtureList.Add(fixture); 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; if (World.FixtureAdded != null) { World.FixtureAdded(fixture); } return(fixture); }
public static void CreateBroadPhaseContacts(BroadPhase broadPhase, List <Body> bodies, out List <Contact> contacts) { contacts = new List <Contact>(); List <Body> queryBodies = new List <Body>(); foreach (Body body in bodies) { queryBodies.Clear(); broadPhase.Query(body, queryBodies); foreach (Body queryBody in queryBodies) { if (queryBody == body) { continue; } Contact contact = new Contact() { bodyA = body, bodyB = queryBody }; contacts.Add(contact); } } }
public void Collide() { var node = ContactList.First; // Update awake contacts. while (node != default) { var c = node.Value; node = node.Next; var fixtureA = c.FixtureA; var fixtureB = c.FixtureB; var indexA = c.ChildIndexA; var indexB = c.ChildIndexB; var bodyA = fixtureA.Body; var bodyB = fixtureB.Body; // Is this contact flagged for filtering? if (c.Flags.HasFlag(Contact.ContactFlag.FilterFlag)) { // Should these bodies collide? if (bodyB.ShouldCollide(bodyA) == false) { Destroy(c); continue; } // Check user filtering. if (ContactFilter?.ShouldCollide(fixtureA, fixtureB) == false) { Destroy(c); continue; } // Clear the filtering flag. c.Flags &= ~Contact.ContactFlag.FilterFlag; } var activeA = bodyA.IsAwake && bodyA.BodyType != BodyType.StaticBody; var activeB = bodyB.IsAwake && bodyB.BodyType != BodyType.StaticBody; // At least one body must be awake and it must be dynamic or kinematic. if (activeA == false && activeB == false) { continue; } var proxyIdA = fixtureA.Proxies[indexA].ProxyId; var proxyIdB = fixtureB.Proxies[indexB].ProxyId; var overlap = BroadPhase.TestOverlap(proxyIdA, proxyIdB); // Here we destroy contacts that cease to overlap in the broad-phase. if (overlap == false) { Destroy(c); continue; } // The contact persists. c.Update(ContactListener); } }
public unsafe Statics(BufferPool pool, PhysicsShapes3D shapes, Bodies3D bodies3D, BroadPhase broadPhase, int initialCapacity = 4096) { this.pool = pool; InternalResize(Math.Max(1, initialCapacity)); this.shapes = shapes; this.bodies3D = bodies3D; this.broadPhase = broadPhase; HandlePool = new IdPool(initialCapacity, pool); }
/// Destroy a fixture. This removes the fixture from the broad-phase and /// therefore destroys any contacts associated with this fixture. 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(ref Fixture fixture) { Box2DXDebug.Assert(_world.IsLocked() == false); if (_world.IsLocked() == true) { return; } Box2DXDebug.Assert(fixture.Body == this); // Remove the fixture from this body's singly linked list. Box2DXDebug.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. Box2DXDebug.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); } } bool needMassUpdate = fixture._massData.Mass > 0.0f || fixture._massData.I > 0.0f; BroadPhase broadPhase = _world._contactManager._broadPhase; fixture.Destroy(broadPhase); fixture.Body = null; fixture._next = null; --_fixtureCount; // Adjust mass properties if needed. if (needMassUpdate) { ResetMass(); } }
internal void Synchronize(BroadPhase broadPhase, ref XForm transform1, ref XForm transform2) { if (_proxyId == BroadPhase.NullProxy) { return; } // Compute an AABB that covers the swept shape (may miss some rotation effect). AABB aabb1, aabb2; _shape.ComputeAABB(out aabb1, ref transform1); _shape.ComputeAABB(out aabb2, ref transform2); AABB aabb = new AABB(); aabb.Combine(ref aabb1, ref aabb2); broadPhase.MoveProxy(_proxyId, ref aabb); }
/// <summary> /// Constructs a new bodies collection. Initialize must be called for the instance to be ready for use. /// </summary> /// <param name="pool">Pool for the collection to pull persistent allocations from.</param> /// <param name="activator">Island activator to use when bodies undergo transitions requiring that they exist in the active set.</param> /// <param name="shapes">Shapes referenced by the collection's bodies.</param> /// <param name="broadPhase">Broad phase containing the body collidables.</param> /// <param name="initialBodyCapacity">Initial number of bodies to allocate space for in the active set.</param> /// <param name="initialIslandCapacity">Initial number of islands to allocate space for in the Sets buffer.</param> /// <param name="initialConstraintCapacityPerBody">Expected number of constraint references per body to allocate space for.</param> public unsafe Bodies(BufferPool pool, IslandActivator activator, Shapes shapes, BroadPhase broadPhase, int initialBodyCapacity, int initialIslandCapacity, int initialConstraintCapacityPerBody) { this.pool = pool; //Note that the id pool only grows upon removal, so this is just a heuristic initialization. //You could get by with something a lot less aggressive, but it does tend to avoid resizes in the case of extreme churn. IdPool <Buffer <int> > .Create(pool.SpecializeFor <int>(), initialBodyCapacity, out HandlePool); ResizeHandles(initialBodyCapacity); pool.SpecializeFor <BodySet>().Take(initialIslandCapacity + 1, out Sets); ActiveSet = new BodySet(initialBodyCapacity, pool); this.activator = activator; this.shapes = shapes; this.broadPhase = broadPhase; MinimumConstraintCapacityPerBody = initialConstraintCapacityPerBody; }
public InactiveBodyCollector(BroadPhase broadPhase, BufferPool pool) { this.pool = pool.SpecializeFor <int>(); this.broadPhase = broadPhase; QuickList <int, Buffer <int> > .Create(this.pool, 32, out InactiveBodyHandles); }
public World(Vec2 gravity, IWorldPool pool, BroadPhase broadPhase) { this.pool = pool; m_destructionListener = null; m_debugDraw = null; m_bodyList = null; m_jointList = null; m_bodyCount = 0; m_jointCount = 0; m_warmStarting = true; m_continuousPhysics = true; m_subStepping = false; m_stepComplete = true; m_allowSleep = true; m_gravity.set(gravity); m_flags = CLEAR_FORCES; m_inv_dt0 = 0f; m_contactManager = new ContactManager(this, broadPhase); m_profile = new Profile(); m_particleSystem = new ParticleSystem(this); for (int i = 0; i < contactStacks.Length; i++) { contactStacks[i] = new ContactRegister[Enum.GetValues(typeof (ShapeType)).Length]; } initializeRegisters(); }
public bool QueryCallback(int proxyId) { Fixture fixture = (Fixture)BroadPhase.GetUserData(proxyId); return(Callback.ReportFixture(fixture)); }
internal void DestroyProxies(BroadPhase broadPhase) { // Destroy proxies in the broad-phase. for (int i = 0; i < ProxyCount; ++i) { broadPhase.DestroyProxy(Proxies[i].ProxyId); Proxies[i].ProxyId = BroadPhase.NullProxy; } ProxyCount = 0; }
protected void DestroyProxies(BroadPhase broadPhase){ //broadphase was pointer throw new NotImplementedException(); //// Destroy proxies in the broad-phase. //for (int i = 0; i < m_proxyCount; ++i) //{ // FixtureProxy* proxy = m_proxies + i; // broadPhase.DestroyProxy(proxy.proxyId); // proxy.proxyId = BroadPhase::e_nullProxy; //} //m_proxyCount = 0; }
// These support body activation/deactivation. internal void CreateProxies(BroadPhase broadPhase, Transform xf){ //broadPhase was pointer Utilities.Assert(m_proxies.Count() == 0); // Create proxies in the broad-phase. int m_proxyCount = m_shape.GetChildCount(); for (int i = 0; i < m_proxyCount; ++i) { FixtureProxy proxy = new FixtureProxy(); m_shape.ComputeAABB(out proxy.aabb, xf, i); proxy.proxyId = broadPhase.CreateProxy(proxy.aabb, proxy); proxy.fixture = this; proxy.childIndex = i; m_proxies.Add(proxy); } }
public WorldQueryWrapper(object ignore) { broadPhase = new BroadPhase(); callback = null; }
public void Destroy() { BroadPhase.Remove(this); }
// We need separation create/destroy functions from the ructor/destructor because // the destructor cannot access the allocator or broad-phase (no destructor arguments allowed by C++). internal void Create(BroadPhase broadPhase, Body body, ref XForm xf, FixtureDef def) { _userData = def.userData; _friction = def.friction; _restitution = def.restitution; _density = def.density; _body = body; _next = null; _filter = def.filter; _isSensor = def.isSensor; _shape = def.shape.Clone(); // Create proxy in the broad-phase. AABB aabb; _shape.ComputeAABB(out aabb, ref xf); _proxyId = broadPhase.CreateProxy(ref aabb, this); }
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); } }
public void DrawDebugData() { if (_debugDraw == null) { return; } DebugDraw.DrawFlags flags = _debugDraw.Flags; if ((flags & DebugDraw.DrawFlags.Shape) != 0) { for (Body b = _bodyList; b != null; b = b.GetNext()) { Transform xf = b.GetTransform(); for (Fixture f = b.GetFixtureList(); f != null; f = f.GetNext()) { if (b.IsStatic()) { DrawShape(f, xf, new Color(0.5f, 0.9f, 0.5f)); } else if (b.IsSleeping()) { DrawShape(f, xf, new Color(0.5f, 0.5f, 0.9f)); } else { DrawShape(f, xf, new Color(0.9f, 0.9f, 0.9f)); } } } } if ((flags & DebugDraw.DrawFlags.Joint) != 0) { for (Joint j = _jointList; j != null; j = j.GetNext()) { if (j.GetType() != JointType.MouseJoint) { DrawJoint(j); } } } if ((flags & DebugDraw.DrawFlags.Pair) != 0) { // TODO_ERIN } if ((flags & DebugDraw.DrawFlags.Aabb) != 0) { Color color = new Color(0.9f, 0.3f, 0.9f); BroadPhase bp = _contactManager._broadPhase; for (Body b = _bodyList; b != null; b = b.GetNext()) { for (Fixture f = b.GetFixtureList(); f != null; f = f.GetNext()) { AABB aabb = bp.GetFatAABB(f.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); _debugDraw.DrawPolygon(vs, 4, color); } } } if ((flags & DebugDraw.DrawFlags.CenterOfMass) != 0) { for (Body b = _bodyList; b != null; b = b.GetNext()) { Transform xf = b.GetTransform(); xf.Position = b.GetWorldCenter(); _debugDraw.DrawXForm(xf); } } }
// These support body activation/deactivation. internal void CreateProxies(BroadPhase 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 = Proxies[i]; Shape.ComputeAABB(out proxy.AABB, ref xf, i); proxy.Fixture = this; proxy.ChildIndex = i; proxy.ProxyId = broadPhase.CreateProxy(ref proxy.AABB, ref proxy); Proxies[i] = proxy; } }
internal void Synchronize(BroadPhase broadPhase, ref Transform transform1, ref Transform transform2) { if (_proxyId == BroadPhase.NullProxy) { return; } // Compute an AABB that covers the swept shape (may miss some rotation effect). AABB aabb1, aabb2; _shape.ComputeAABB(out aabb1, ref transform1); _shape.ComputeAABB(out aabb2, ref transform2); _aabb.Combine(ref aabb1, ref aabb2); Vector2 displacement = transform2.Position - transform1.Position; broadPhase.MoveProxy(_proxyId, ref _aabb, displacement); }
/// <summary> /// 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. /// </summary> /// <param name="fixture">the fixture to be removed.</param> /// <warning>This function is locked during callbacks.</warning> public void DestroyFixture(Fixture fixture) { Debug.Assert(World.Locked == false); if (World.Locked == true) { return; } Debug.Assert(fixture.Body == this); // Remove the fixture from this body's singly linked list. Debug.Assert(FixtureCount > 0); Fixture node = FixtureList; Fixture last = null; // java change bool found = false; while (node != null) { if (node == fixture) { node = fixture.Next; found = true; break; } last = node; node = node.Next; } // You tried to remove a shape that is not attached to this body. Debug.Assert(found); // java change, remove it from the list if (last == null) { FixtureList = fixture.Next; } else { last.Next = fixture.Next; } // Destroy any contacts associated with the fixture. ContactEdge edge = ContactList; while (edge != null) { Contact c = edge.Contact; edge = edge.Next; Fixture fixtureA = c.FixtureA; Fixture fixtureB = c.FixtureB; if (fixture == fixtureA || fixture == fixtureB) { // This destroys the contact and removes it from // this body's contact list. World.ContactManager.Destroy(c); } } if ((Flags & TypeFlags.Active) == TypeFlags.Active) { BroadPhase broadPhase = World.ContactManager.BroadPhase; fixture.DestroyProxies(broadPhase); } fixture.Destroy(); fixture.Body = null; fixture.Next = null; --FixtureCount; // Reset the mass data. ResetMassData(); }
/** * 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) { if (m_world.isLocked()) { return; } // Remove the fixture from this body's singly linked list. Fixture node = m_fixtureList; Fixture last = null; // java change bool found = false; while (node != null) { if (node == fixture) { node = fixture.m_next; found = true; break; } last = node; node = node.m_next; } // You tried to remove a shape that is not attached to this body. // java change, remove it from the list if (last == null) { m_fixtureList = fixture.m_next; } else { last.m_next = fixture.m_next; } // Destroy any contacts associated with the fixture. ContactEdge edge = m_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. m_world.m_contactManager.destroy(c); } } if ((m_flags & e_activeFlag) == e_activeFlag) { BroadPhase broadPhase = m_world.m_contactManager.m_broadPhase; fixture.destroyProxies(broadPhase); } fixture.destroy(); fixture.m_body = null; fixture.m_next = null; fixture = null; --m_fixtureCount; // Reset the mass data. resetMassData(); }
internal void DestroyProxy(BroadPhase broadPhase) { if (_proxyId == BroadPhase.NullProxy) { return; } // Destroy proxy in the broad-phase. broadPhase.DestroyProxy(_proxyId); _proxyId = BroadPhase.NullProxy; }
internal void Destroy(BroadPhase broadPhase) { // Remove proxy from the broad-phase. if (_proxyId != BroadPhase.NullProxy) { broadPhase.DestroyProxy(_proxyId); _proxyId = BroadPhase.NullProxy; } _shape = null; }
/** * Internal method * * @param broadPhase */ public void destroyProxies(BroadPhase broadPhase) { // Destroy proxies in the broad-phase. for (int i = 0; i < m_proxyCount; ++i) { FixtureProxy proxy = m_proxies[i]; broadPhase.destroyProxy(proxy.proxyId); proxy.proxyId = (int) BroadPhaseProxy.Null; } m_proxyCount = 0; }
public void Create(BroadPhase broadPhase, Body body, Transform xf, FixtureDef def) { UserData = def.UserData; Friction = def.Friction; Restitution = def.Restitution; Density = def.Density; _body = body; _next = null; Filter = def.Filter; _isSensor = def.IsSensor; _type = def.Type; // Allocate and initialize the child shape. switch (_type) { case ShapeType.CircleShape: { CircleShape circle = new CircleShape(); CircleDef circleDef = (CircleDef)def; circle._position = circleDef.LocalPosition; circle._radius = circleDef.Radius; _shape = circle; } break; case ShapeType.PolygonShape: { PolygonShape polygon = new PolygonShape(); PolygonDef polygonDef = (PolygonDef)def; polygon.Set(polygonDef.Vertices, polygonDef.VertexCount); _shape = polygon; } break; case ShapeType.EdgeShape: { EdgeShape edge = new EdgeShape(); EdgeDef edgeDef = (EdgeDef)def; edge.Set(edgeDef.Vertex1, edgeDef.Vertex2); _shape = edge; } break; default: Box2DNetDebug.Assert(false); break; } // Create proxy in the broad-phase. AABB aabb; _shape.ComputeAABB(out aabb, xf); bool inRange = broadPhase.InRange(aabb); // You are creating a shape outside the world box. Box2DNetDebug.Assert(inRange); if (inRange) { _proxyId = broadPhase.CreateProxy(aabb, this); } else { _proxyId = PairManager.NullProxy; } }
/** * Internal method * * @param broadPhase * @param xf1 * @param xf2 */ internal void synchronize(BroadPhase broadPhase, Transform transform1, Transform transform2) { if (m_proxyCount == 0) { return; } for (int i = 0; i < m_proxyCount; ++i) { FixtureProxy proxy = m_proxies[i]; // Compute an AABB that covers the swept shape (may miss some rotation effect). AABB aabb1 = pool1; AABB aab = pool2; m_shape.computeAABB(aabb1, transform1, proxy.childIndex); m_shape.computeAABB(aab, transform2, proxy.childIndex); proxy.aabb.lowerBound.x = aabb1.lowerBound.x < aab.lowerBound.x ? aabb1.lowerBound.x : aab.lowerBound.x; proxy.aabb.lowerBound.y = aabb1.lowerBound.y < aab.lowerBound.y ? aabb1.lowerBound.y : aab.lowerBound.y; proxy.aabb.upperBound.x = aabb1.upperBound.x > aab.upperBound.x ? aabb1.upperBound.x : aab.upperBound.x; proxy.aabb.upperBound.y = aabb1.upperBound.y > aab.upperBound.y ? aabb1.upperBound.y : aab.upperBound.y; displacement.x = transform2.p.x - transform1.p.x; displacement.y = transform2.p.y - transform1.p.y; broadPhase.moveProxy(proxy.proxyId, proxy.aabb, displacement); } }
public InactiveBodyCollector(BroadPhase broadPhase, BufferPool pool) { this.pool = pool; this.broadPhase = broadPhase; InactiveBodyHandles = new QuickList <int>(32, pool); }
// These support body activation/deactivation. internal void CreateProxies(BroadPhase broadPhase, ref Transform xf) { Debug.Assert(_proxyCount == 0); // Create proxies in the broad-phase. _proxyCount = _shape.GetChildCount(); for (int i = 0; i < _proxyCount; ++i) { FixtureProxy proxy = _proxies[i]; _shape.ComputeAABB(out proxy.aabb, ref xf, i); proxy.fixture = this; proxy.childIndex = i; proxy.proxyId = broadPhase.CreateProxy(ref proxy.aabb, proxy); _proxies[i] = proxy; } }
///<summary> /// Removes a space object from the simulation. ///</summary> ///<param name="spaceObject">Space object to remove.</param> public void Remove(ISpaceObject spaceObject) { if (spaceObject.Space != this) { throw new ArgumentException("The object does not belong to this space; cannot remove it."); } SimulationIslandMember simulationIslandMember = spaceObject as SimulationIslandMember; if (simulationIslandMember != null) { DeactivationManager.Remove(simulationIslandMember); } ISimulationIslandMemberOwner simulationIslandMemberOwner = spaceObject as ISimulationIslandMemberOwner; if (simulationIslandMemberOwner != null) { DeactivationManager.Remove(simulationIslandMemberOwner.ActivityInformation); } //Go through each stage, removing the space object from it if necessary. IForceUpdateable velocityUpdateable = spaceObject as IForceUpdateable; if (velocityUpdateable != null) { ForceUpdater.Remove(velocityUpdateable); } MobileCollidable boundingBoxUpdateable = spaceObject as MobileCollidable; if (boundingBoxUpdateable != null) { BoundingBoxUpdater.Remove(boundingBoxUpdateable); } BroadPhaseEntry broadPhaseEntry = spaceObject as BroadPhaseEntry; if (broadPhaseEntry != null) { BroadPhase.Remove(broadPhaseEntry); } //Entites own collision proxies, but are not entries themselves. IBroadPhaseEntryOwner broadPhaseEntryOwner = spaceObject as IBroadPhaseEntryOwner; if (broadPhaseEntryOwner != null) { BroadPhase.Remove(broadPhaseEntryOwner.Entry); boundingBoxUpdateable = broadPhaseEntryOwner.Entry as MobileCollidable; if (boundingBoxUpdateable != null) { BoundingBoxUpdater.Remove(boundingBoxUpdateable); } } SolverUpdateable solverUpdateable = spaceObject as SolverUpdateable; if (solverUpdateable != null) { Solver.Remove(solverUpdateable); } IPositionUpdateable integrable = spaceObject as IPositionUpdateable; if (integrable != null) { PositionUpdater.Remove(integrable); } Entity entity = spaceObject as Entity; if (entity != null) { BufferedStates.Remove(entity); } IDeferredEventCreator deferredEventCreator = spaceObject as IDeferredEventCreator; if (deferredEventCreator != null) { DeferredEventDispatcher.RemoveEventCreator(deferredEventCreator); } IDeferredEventCreatorOwner deferredEventCreatorOwner = spaceObject as IDeferredEventCreatorOwner; if (deferredEventCreatorOwner != null) { DeferredEventDispatcher.RemoveEventCreator(deferredEventCreatorOwner.EventCreator); } //Updateable stages. IDuringForcesUpdateable duringForcesUpdateable = spaceObject as IDuringForcesUpdateable; if (duringForcesUpdateable != null) { DuringForcesUpdateables.Remove(duringForcesUpdateable); } IBeforeNarrowPhaseUpdateable beforeNarrowPhaseUpdateable = spaceObject as IBeforeNarrowPhaseUpdateable; if (beforeNarrowPhaseUpdateable != null) { BeforeNarrowPhaseUpdateables.Remove(beforeNarrowPhaseUpdateable); } IBeforeSolverUpdateable beforeSolverUpdateable = spaceObject as IBeforeSolverUpdateable; if (beforeSolverUpdateable != null) { BeforeSolverUpdateables.Remove(beforeSolverUpdateable); } IBeforePositionUpdateUpdateable beforePositionUpdateUpdateable = spaceObject as IBeforePositionUpdateUpdateable; if (beforePositionUpdateUpdateable != null) { BeforePositionUpdateUpdateables.Remove(beforePositionUpdateUpdateable); } IEndOfTimeStepUpdateable endOfStepUpdateable = spaceObject as IEndOfTimeStepUpdateable; if (endOfStepUpdateable != null) { EndOfTimeStepUpdateables.Remove(endOfStepUpdateable); } IEndOfFrameUpdateable endOfFrameUpdateable = spaceObject as IEndOfFrameUpdateable; if (endOfFrameUpdateable != null) { EndOfFrameUpdateables.Remove(endOfFrameUpdateable); } spaceObject.Space = null; spaceObject.OnRemovalFromSpace(this); }
// These support body activation/deactivation. internal void CreateProxy(BroadPhase broadPhase, ref Transform xf) { Debug.Assert(_proxyId == BroadPhase.NullProxy); // Create proxy in the broad-phase. _shape.ComputeAABB(out _aabb, ref xf); _proxyId = broadPhase.CreateProxy(ref _aabb, this); }
// These support body activation/deactivation. public void createProxies(BroadPhase broadPhase, Transform xf) { Debug.Assert(m_proxyCount == 0); // Create proxies in the broad-phase. m_proxyCount = m_shape.getChildCount(); for (int i = 0; i < m_proxyCount; ++i) { FixtureProxy proxy = m_proxies[i]; m_shape.computeAABB(proxy.aabb, xf, i); proxy.proxyId = broadPhase.createProxy(proxy.aabb, proxy); proxy.fixture = this; proxy.childIndex = i; } }
public ContactManager() { m_contactList = new List<Contact>(); m_contactFilter = _defaultFilter; m_contactListener = _defaultListener; m_broadPhase = new BroadPhase(); }