22 #include <Box2D/Common/b2Math.h>
23 #include <Box2D/Collision/Shapes/b2Shape.h>
389 friend class b2Island;
391 friend class b2ContactSolver;
409 e_islandFlag = 0x0001,
410 e_awakeFlag = 0x0002,
411 e_autoSleepFlag = 0x0004,
412 e_bulletFlag = 0x0008,
413 e_fixedRotationFlag = 0x0010,
414 e_activeFlag = 0x0020,
421 void SynchronizeFixtures();
422 void SynchronizeTransform();
426 bool ShouldCollide(
const b2Body* other)
const;
428 void Advance(float32 t);
440 float32 m_angularVelocity;
450 int32 m_fixtureCount;
452 b2JointEdge* m_jointList;
453 b2ContactEdge* m_contactList;
455 float32 m_mass, m_invMass;
460 float32 m_linearDamping;
461 float32 m_angularDamping;
462 float32 m_gravityScale;
496 return m_sweep.localCenter;
501 if (m_type == b2_staticBody)
506 if (b2Dot(v,v) > 0.0f)
511 m_linearVelocity = v;
516 return m_linearVelocity;
521 if (m_type == b2_staticBody)
531 m_angularVelocity = w;
536 return m_angularVelocity;
546 return m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);
552 data->
I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);
553 data->
center = m_sweep.localCenter;
558 return b2Mul(m_xf, localPoint);
563 return b2Mul(m_xf.q, localVector);
568 return b2MulT(m_xf, worldPoint);
573 return b2MulT(m_xf.q, worldVector);
578 return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c);
588 return m_linearDamping;
593 m_linearDamping = linearDamping;
598 return m_angularDamping;
603 m_angularDamping = angularDamping;
608 return m_gravityScale;
613 m_gravityScale = scale;
620 m_flags |= e_bulletFlag;
624 m_flags &= ~e_bulletFlag;
630 return (m_flags & e_bulletFlag) == e_bulletFlag;
637 if ((m_flags & e_awakeFlag) == 0)
639 m_flags |= e_awakeFlag;
645 m_flags &= ~e_awakeFlag;
648 m_angularVelocity = 0.0f;
656 return (m_flags & e_awakeFlag) == e_awakeFlag;
661 return (m_flags & e_activeFlag) == e_activeFlag;
666 return (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;
673 m_flags |= e_autoSleepFlag;
677 m_flags &= ~e_autoSleepFlag;
684 return (m_flags & e_autoSleepFlag) == e_autoSleepFlag;
689 return m_fixtureList;
694 return m_fixtureList;
709 return m_contactList;
714 return m_contactList;
739 if (m_type != b2_dynamicBody)
744 if (wake && (m_flags & e_awakeFlag) == 0)
750 if (m_flags & e_awakeFlag)
753 m_torque += b2Cross(point - m_sweep.c, force);
759 if (m_type != b2_dynamicBody)
764 if (wake && (m_flags & e_awakeFlag) == 0)
770 if (m_flags & e_awakeFlag)
778 if (m_type != b2_dynamicBody)
783 if (wake && (m_flags & e_awakeFlag) == 0)
789 if (m_flags & e_awakeFlag)
797 if (m_type != b2_dynamicBody)
802 if (wake && (m_flags & e_awakeFlag) == 0)
808 if (m_flags & e_awakeFlag)
810 m_linearVelocity += m_invMass * impulse;
811 m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);
817 if (m_type != b2_dynamicBody)
822 if (wake && (m_flags & e_awakeFlag) == 0)
828 if (m_flags & e_awakeFlag)
830 m_angularVelocity += m_invI * impulse;
834 inline void b2Body::SynchronizeTransform()
836 m_xf.q.
Set(m_sweep.a);
837 m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);
840 inline void b2Body::Advance(float32 alpha)
843 m_sweep.Advance(alpha);
844 m_sweep.c = m_sweep.c0;
845 m_sweep.a = m_sweep.a0;
846 m_xf.q.
Set(m_sweep.a);
847 m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);