示例#1
0
        // 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);
            }
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
            }
        }
示例#4
0
        /// 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);
        }
示例#5
0
 public WorldQueryWrapper(object ignore)
 {
     broadPhase = new BroadPhase();
     callback   = null;
 }
示例#6
0
        /// 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();
        }
示例#7
0
        /// 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);
                }
            }
        }
示例#8
0
        /// 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);
                }
            }
        }