Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef B2_BODY_H
00020 #define B2_BODY_H
00021
00022 #include <Box2D/Common/b2Math.h>
00023 #include <Box2D/Collision/Shapes/b2Shape.h>
00024 #include <memory>
00025
00026 class b2Fixture;
00027 class b2Joint;
00028 class b2Contact;
00029 class b2Controller;
00030 class b2World;
00031 struct b2FixtureDef;
00032 struct b2JointEdge;
00033 struct b2ContactEdge;
00034
00039 enum b2BodyType
00040 {
00041 b2_staticBody = 0,
00042 b2_kinematicBody,
00043 b2_dynamicBody
00044
00045
00046
00047 };
00048
00051 struct b2BodyDef
00052 {
00054 b2BodyDef()
00055 {
00056 userData = NULL;
00057 position.Set(0.0f, 0.0f);
00058 angle = 0.0f;
00059 linearVelocity.Set(0.0f, 0.0f);
00060 angularVelocity = 0.0f;
00061 linearDamping = 0.0f;
00062 angularDamping = 0.0f;
00063 allowSleep = true;
00064 awake = true;
00065 fixedRotation = false;
00066 bullet = false;
00067 type = b2_staticBody;
00068 active = true;
00069 gravityScale = 1.0f;
00070 }
00071
00074 b2BodyType type;
00075
00078 b2Vec2 position;
00079
00081 float32 angle;
00082
00084 b2Vec2 linearVelocity;
00085
00087 float32 angularVelocity;
00088
00092 float32 linearDamping;
00093
00097 float32 angularDamping;
00098
00101 bool allowSleep;
00102
00104 bool awake;
00105
00107 bool fixedRotation;
00108
00113 bool bullet;
00114
00116 bool active;
00117
00119 void* userData;
00120
00122 float32 gravityScale;
00123 };
00124
00126 class b2Body
00127 {
00128 public:
00136 b2Fixture* CreateFixture(const b2FixtureDef* def);
00137
00145 b2Fixture* CreateFixture(const b2Shape* shape, float32 density);
00146
00154 void DestroyFixture(b2Fixture* fixture);
00155
00161 void SetTransform(const b2Vec2& position, float32 angle);
00162
00165 const b2Transform& GetTransform() const;
00166
00169 const b2Vec2& GetPosition() const;
00170
00173 float32 GetAngle() const;
00174
00176 const b2Vec2& GetWorldCenter() const;
00177
00179 const b2Vec2& GetLocalCenter() const;
00180
00183 void SetLinearVelocity(const b2Vec2& v);
00184
00187 const b2Vec2& GetLinearVelocity() const;
00188
00191 void SetAngularVelocity(float32 omega);
00192
00195 float32 GetAngularVelocity() const;
00196
00203 void ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake);
00204
00208 void ApplyForceToCenter(const b2Vec2& force, bool wake);
00209
00215 void ApplyTorque(float32 torque, bool wake);
00216
00223 void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake);
00224
00228 void ApplyAngularImpulse(float32 impulse, bool wake);
00229
00232 float32 GetMass() const;
00233
00236 float32 GetInertia() const;
00237
00240 void GetMassData(b2MassData* data) const;
00241
00247 void SetMassData(const b2MassData* data);
00248
00252 void ResetMassData();
00253
00257 b2Vec2 GetWorldPoint(const b2Vec2& localPoint) const;
00258
00262 b2Vec2 GetWorldVector(const b2Vec2& localVector) const;
00263
00267 b2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const;
00268
00272 b2Vec2 GetLocalVector(const b2Vec2& worldVector) const;
00273
00277 b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const;
00278
00282 b2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const;
00283
00285 float32 GetLinearDamping() const;
00286
00288 void SetLinearDamping(float32 linearDamping);
00289
00291 float32 GetAngularDamping() const;
00292
00294 void SetAngularDamping(float32 angularDamping);
00295
00297 float32 GetGravityScale() const;
00298
00300 void SetGravityScale(float32 scale);
00301
00303 void SetType(b2BodyType type);
00304
00306 b2BodyType GetType() const;
00307
00309 void SetBullet(bool flag);
00310
00312 bool IsBullet() const;
00313
00316 void SetSleepingAllowed(bool flag);
00317
00319 bool IsSleepingAllowed() const;
00320
00324 void SetAwake(bool flag);
00325
00328 bool IsAwake() const;
00329
00343 void SetActive(bool flag);
00344
00346 bool IsActive() const;
00347
00350 void SetFixedRotation(bool flag);
00351
00353 bool IsFixedRotation() const;
00354
00356 b2Fixture* GetFixtureList();
00357 const b2Fixture* GetFixtureList() const;
00358
00360 b2JointEdge* GetJointList();
00361 const b2JointEdge* GetJointList() const;
00362
00366 b2ContactEdge* GetContactList();
00367 const b2ContactEdge* GetContactList() const;
00368
00370 b2Body* GetNext();
00371 const b2Body* GetNext() const;
00372
00374 void* GetUserData() const;
00375
00377 void SetUserData(void* data);
00378
00380 b2World* GetWorld();
00381 const b2World* GetWorld() const;
00382
00384 void Dump();
00385
00386 private:
00387
00388 friend class b2World;
00389 friend class b2Island;
00390 friend class b2ContactManager;
00391 friend class b2ContactSolver;
00392 friend class b2Contact;
00393
00394 friend class b2DistanceJoint;
00395 friend class b2FrictionJoint;
00396 friend class b2GearJoint;
00397 friend class b2MotorJoint;
00398 friend class b2MouseJoint;
00399 friend class b2PrismaticJoint;
00400 friend class b2PulleyJoint;
00401 friend class b2RevoluteJoint;
00402 friend class b2RopeJoint;
00403 friend class b2WeldJoint;
00404 friend class b2WheelJoint;
00405
00406
00407 enum
00408 {
00409 e_islandFlag = 0x0001,
00410 e_awakeFlag = 0x0002,
00411 e_autoSleepFlag = 0x0004,
00412 e_bulletFlag = 0x0008,
00413 e_fixedRotationFlag = 0x0010,
00414 e_activeFlag = 0x0020,
00415 e_toiFlag = 0x0040
00416 };
00417
00418 b2Body(const b2BodyDef* bd, b2World* world);
00419 ~b2Body();
00420
00421 void SynchronizeFixtures();
00422 void SynchronizeTransform();
00423
00424
00425
00426 bool ShouldCollide(const b2Body* other) const;
00427
00428 void Advance(float32 t);
00429
00430 b2BodyType m_type;
00431
00432 uint16 m_flags;
00433
00434 int32 m_islandIndex;
00435
00436 b2Transform m_xf;
00437 b2Sweep m_sweep;
00438
00439 b2Vec2 m_linearVelocity;
00440 float32 m_angularVelocity;
00441
00442 b2Vec2 m_force;
00443 float32 m_torque;
00444
00445 b2World* m_world;
00446 b2Body* m_prev;
00447 b2Body* m_next;
00448
00449 b2Fixture* m_fixtureList;
00450 int32 m_fixtureCount;
00451
00452 b2JointEdge* m_jointList;
00453 b2ContactEdge* m_contactList;
00454
00455 float32 m_mass, m_invMass;
00456
00457
00458 float32 m_I, m_invI;
00459
00460 float32 m_linearDamping;
00461 float32 m_angularDamping;
00462 float32 m_gravityScale;
00463
00464 float32 m_sleepTime;
00465
00466 void* m_userData;
00467 };
00468
00469 inline b2BodyType b2Body::GetType() const
00470 {
00471 return m_type;
00472 }
00473
00474 inline const b2Transform& b2Body::GetTransform() const
00475 {
00476 return m_xf;
00477 }
00478
00479 inline const b2Vec2& b2Body::GetPosition() const
00480 {
00481 return m_xf.p;
00482 }
00483
00484 inline float32 b2Body::GetAngle() const
00485 {
00486 return m_sweep.a;
00487 }
00488
00489 inline const b2Vec2& b2Body::GetWorldCenter() const
00490 {
00491 return m_sweep.c;
00492 }
00493
00494 inline const b2Vec2& b2Body::GetLocalCenter() const
00495 {
00496 return m_sweep.localCenter;
00497 }
00498
00499 inline void b2Body::SetLinearVelocity(const b2Vec2& v)
00500 {
00501 if (m_type == b2_staticBody)
00502 {
00503 return;
00504 }
00505
00506 if (b2Dot(v,v) > 0.0f)
00507 {
00508 SetAwake(true);
00509 }
00510
00511 m_linearVelocity = v;
00512 }
00513
00514 inline const b2Vec2& b2Body::GetLinearVelocity() const
00515 {
00516 return m_linearVelocity;
00517 }
00518
00519 inline void b2Body::SetAngularVelocity(float32 w)
00520 {
00521 if (m_type == b2_staticBody)
00522 {
00523 return;
00524 }
00525
00526 if (w * w > 0.0f)
00527 {
00528 SetAwake(true);
00529 }
00530
00531 m_angularVelocity = w;
00532 }
00533
00534 inline float32 b2Body::GetAngularVelocity() const
00535 {
00536 return m_angularVelocity;
00537 }
00538
00539 inline float32 b2Body::GetMass() const
00540 {
00541 return m_mass;
00542 }
00543
00544 inline float32 b2Body::GetInertia() const
00545 {
00546 return m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);
00547 }
00548
00549 inline void b2Body::GetMassData(b2MassData* data) const
00550 {
00551 data->mass = m_mass;
00552 data->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);
00553 data->center = m_sweep.localCenter;
00554 }
00555
00556 inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const
00557 {
00558 return b2Mul(m_xf, localPoint);
00559 }
00560
00561 inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const
00562 {
00563 return b2Mul(m_xf.q, localVector);
00564 }
00565
00566 inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const
00567 {
00568 return b2MulT(m_xf, worldPoint);
00569 }
00570
00571 inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const
00572 {
00573 return b2MulT(m_xf.q, worldVector);
00574 }
00575
00576 inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const
00577 {
00578 return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c);
00579 }
00580
00581 inline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const
00582 {
00583 return GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint));
00584 }
00585
00586 inline float32 b2Body::GetLinearDamping() const
00587 {
00588 return m_linearDamping;
00589 }
00590
00591 inline void b2Body::SetLinearDamping(float32 linearDamping)
00592 {
00593 m_linearDamping = linearDamping;
00594 }
00595
00596 inline float32 b2Body::GetAngularDamping() const
00597 {
00598 return m_angularDamping;
00599 }
00600
00601 inline void b2Body::SetAngularDamping(float32 angularDamping)
00602 {
00603 m_angularDamping = angularDamping;
00604 }
00605
00606 inline float32 b2Body::GetGravityScale() const
00607 {
00608 return m_gravityScale;
00609 }
00610
00611 inline void b2Body::SetGravityScale(float32 scale)
00612 {
00613 m_gravityScale = scale;
00614 }
00615
00616 inline void b2Body::SetBullet(bool flag)
00617 {
00618 if (flag)
00619 {
00620 m_flags |= e_bulletFlag;
00621 }
00622 else
00623 {
00624 m_flags &= ~e_bulletFlag;
00625 }
00626 }
00627
00628 inline bool b2Body::IsBullet() const
00629 {
00630 return (m_flags & e_bulletFlag) == e_bulletFlag;
00631 }
00632
00633 inline void b2Body::SetAwake(bool flag)
00634 {
00635 if (flag)
00636 {
00637 if ((m_flags & e_awakeFlag) == 0)
00638 {
00639 m_flags |= e_awakeFlag;
00640 m_sleepTime = 0.0f;
00641 }
00642 }
00643 else
00644 {
00645 m_flags &= ~e_awakeFlag;
00646 m_sleepTime = 0.0f;
00647 m_linearVelocity.SetZero();
00648 m_angularVelocity = 0.0f;
00649 m_force.SetZero();
00650 m_torque = 0.0f;
00651 }
00652 }
00653
00654 inline bool b2Body::IsAwake() const
00655 {
00656 return (m_flags & e_awakeFlag) == e_awakeFlag;
00657 }
00658
00659 inline bool b2Body::IsActive() const
00660 {
00661 return (m_flags & e_activeFlag) == e_activeFlag;
00662 }
00663
00664 inline bool b2Body::IsFixedRotation() const
00665 {
00666 return (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;
00667 }
00668
00669 inline void b2Body::SetSleepingAllowed(bool flag)
00670 {
00671 if (flag)
00672 {
00673 m_flags |= e_autoSleepFlag;
00674 }
00675 else
00676 {
00677 m_flags &= ~e_autoSleepFlag;
00678 SetAwake(true);
00679 }
00680 }
00681
00682 inline bool b2Body::IsSleepingAllowed() const
00683 {
00684 return (m_flags & e_autoSleepFlag) == e_autoSleepFlag;
00685 }
00686
00687 inline b2Fixture* b2Body::GetFixtureList()
00688 {
00689 return m_fixtureList;
00690 }
00691
00692 inline const b2Fixture* b2Body::GetFixtureList() const
00693 {
00694 return m_fixtureList;
00695 }
00696
00697 inline b2JointEdge* b2Body::GetJointList()
00698 {
00699 return m_jointList;
00700 }
00701
00702 inline const b2JointEdge* b2Body::GetJointList() const
00703 {
00704 return m_jointList;
00705 }
00706
00707 inline b2ContactEdge* b2Body::GetContactList()
00708 {
00709 return m_contactList;
00710 }
00711
00712 inline const b2ContactEdge* b2Body::GetContactList() const
00713 {
00714 return m_contactList;
00715 }
00716
00717 inline b2Body* b2Body::GetNext()
00718 {
00719 return m_next;
00720 }
00721
00722 inline const b2Body* b2Body::GetNext() const
00723 {
00724 return m_next;
00725 }
00726
00727 inline void b2Body::SetUserData(void* data)
00728 {
00729 m_userData = data;
00730 }
00731
00732 inline void* b2Body::GetUserData() const
00733 {
00734 return m_userData;
00735 }
00736
00737 inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake)
00738 {
00739 if (m_type != b2_dynamicBody)
00740 {
00741 return;
00742 }
00743
00744 if (wake && (m_flags & e_awakeFlag) == 0)
00745 {
00746 SetAwake(true);
00747 }
00748
00749
00750 if (m_flags & e_awakeFlag)
00751 {
00752 m_force += force;
00753 m_torque += b2Cross(point - m_sweep.c, force);
00754 }
00755 }
00756
00757 inline void b2Body::ApplyForceToCenter(const b2Vec2& force, bool wake)
00758 {
00759 if (m_type != b2_dynamicBody)
00760 {
00761 return;
00762 }
00763
00764 if (wake && (m_flags & e_awakeFlag) == 0)
00765 {
00766 SetAwake(true);
00767 }
00768
00769
00770 if (m_flags & e_awakeFlag)
00771 {
00772 m_force += force;
00773 }
00774 }
00775
00776 inline void b2Body::ApplyTorque(float32 torque, bool wake)
00777 {
00778 if (m_type != b2_dynamicBody)
00779 {
00780 return;
00781 }
00782
00783 if (wake && (m_flags & e_awakeFlag) == 0)
00784 {
00785 SetAwake(true);
00786 }
00787
00788
00789 if (m_flags & e_awakeFlag)
00790 {
00791 m_torque += torque;
00792 }
00793 }
00794
00795 inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake)
00796 {
00797 if (m_type != b2_dynamicBody)
00798 {
00799 return;
00800 }
00801
00802 if (wake && (m_flags & e_awakeFlag) == 0)
00803 {
00804 SetAwake(true);
00805 }
00806
00807
00808 if (m_flags & e_awakeFlag)
00809 {
00810 m_linearVelocity += m_invMass * impulse;
00811 m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);
00812 }
00813 }
00814
00815 inline void b2Body::ApplyAngularImpulse(float32 impulse, bool wake)
00816 {
00817 if (m_type != b2_dynamicBody)
00818 {
00819 return;
00820 }
00821
00822 if (wake && (m_flags & e_awakeFlag) == 0)
00823 {
00824 SetAwake(true);
00825 }
00826
00827
00828 if (m_flags & e_awakeFlag)
00829 {
00830 m_angularVelocity += m_invI * impulse;
00831 }
00832 }
00833
00834 inline void b2Body::SynchronizeTransform()
00835 {
00836 m_xf.q.Set(m_sweep.a);
00837 m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);
00838 }
00839
00840 inline void b2Body::Advance(float32 alpha)
00841 {
00842
00843 m_sweep.Advance(alpha);
00844 m_sweep.c = m_sweep.c0;
00845 m_sweep.a = m_sweep.a0;
00846 m_xf.q.Set(m_sweep.a);
00847 m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter);
00848 }
00849
00850 inline b2World* b2Body::GetWorld()
00851 {
00852 return m_world;
00853 }
00854
00855 inline const b2World* b2Body::GetWorld() const
00856 {
00857 return m_world;
00858 }
00859
00860 #endif