b2Body.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:21k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty.  In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. * Permission is granted to anyone to use this software for any purpose,
  8. * including commercial applications, and to alter it and redistribute it
  9. * freely, subject to the following restrictions:
  10. * 1. The origin of this software must not be misrepresented; you must not
  11. * claim that you wrote the original software. If you use this software
  12. * in a product, an acknowledgment in the product documentation would be
  13. * appreciated but is not required.
  14. * 2. Altered source versions must be plainly marked as such, and must not be
  15. * misrepresented as being the original software.
  16. * 3. This notice may not be removed or altered from any source distribution.
  17. */
  18. #ifndef B2_BODY_H
  19. #define B2_BODY_H
  20. #include <Box2D/Common/b2Math.h>
  21. #include <Box2D/Collision/Shapes/b2Shape.h>
  22. #include <memory>
  23. class b2Fixture;
  24. class b2Joint;
  25. class b2Contact;
  26. class b2Controller;
  27. class b2World;
  28. struct b2FixtureDef;
  29. struct b2JointEdge;
  30. struct b2ContactEdge;
  31. /// The body type.
  32. /// static: zero mass, zero velocity, may be manually moved
  33. /// kinematic: zero mass, non-zero velocity set by user, moved by solver
  34. /// dynamic: positive mass, non-zero velocity determined by forces, moved by solver
  35. enum b2BodyType
  36. {
  37. b2_staticBody = 0,
  38. b2_kinematicBody,
  39. b2_dynamicBody,
  40. };
  41. /// A body definition holds all the data needed to construct a rigid body.
  42. /// You can safely re-use body definitions. Shapes are added to a body after construction.
  43. struct b2BodyDef
  44. {
  45. /// This constructor sets the body definition default values.
  46. b2BodyDef()
  47. {
  48. userData = NULL;
  49. position.Set(0.0f, 0.0f);
  50. angle = 0.0f;
  51. linearVelocity.Set(0.0f, 0.0f);
  52. angularVelocity = 0.0f;
  53. linearDamping = 0.0f;
  54. angularDamping = 0.0f;
  55. allowSleep = true;
  56. awake = true;
  57. fixedRotation = false;
  58. bullet = false;
  59. type = b2_staticBody;
  60. active = true;
  61. inertiaScale = 1.0f;
  62. }
  63. /// The body type: static, kinematic, or dynamic.
  64. /// Note: if a dynamic body would have zero mass, the mass is set to one.
  65. b2BodyType type;
  66. /// The world position of the body. Avoid creating bodies at the origin
  67. /// since this can lead to many overlapping shapes.
  68. b2Vec2 position;
  69. /// The world angle of the body in radians.
  70. float32 angle;
  71. /// The linear velocity of the body's origin in world co-ordinates.
  72. b2Vec2 linearVelocity;
  73. /// The angular velocity of the body.
  74. float32 angularVelocity;
  75. /// Linear damping is use to reduce the linear velocity. The damping parameter
  76. /// can be larger than 1.0f but the damping effect becomes sensitive to the
  77. /// time step when the damping parameter is large.
  78. float32 linearDamping;
  79. /// Angular damping is use to reduce the angular velocity. The damping parameter
  80. /// can be larger than 1.0f but the damping effect becomes sensitive to the
  81. /// time step when the damping parameter is large.
  82. float32 angularDamping;
  83. /// Set this flag to false if this body should never fall asleep. Note that
  84. /// this increases CPU usage.
  85. bool allowSleep;
  86. /// Is this body initially awake or sleeping?
  87. bool awake;
  88. /// Should this body be prevented from rotating? Useful for characters.
  89. bool fixedRotation;
  90. /// Is this a fast moving body that should be prevented from tunneling through
  91. /// other moving bodies? Note that all bodies are prevented from tunneling through
  92. /// kinematic and static bodies. This setting is only considered on dynamic bodies.
  93. /// @warning You should use this flag sparingly since it increases processing time.
  94. bool bullet;
  95. /// Does this body start out active?
  96. bool active;
  97. /// Use this to store application specific body data.
  98. void* userData;
  99. /// Experimental: scales the inertia tensor.
  100. float32 inertiaScale;
  101. };
  102. /// A rigid body. These are created via b2World::CreateBody.
  103. class b2Body
  104. {
  105. public:
  106. /// Creates a fixture and attach it to this body. Use this function if you need
  107. /// to set some fixture parameters, like friction. Otherwise you can create the
  108. /// fixture directly from a shape.
  109. /// If the density is non-zero, this function automatically updates the mass of the body.
  110. /// Contacts are not created until the next time step.
  111. /// @param def the fixture definition.
  112. /// @warning This function is locked during callbacks.
  113. b2Fixture* CreateFixture(const b2FixtureDef* def);
  114. /// Creates a fixture from a shape and attach it to this body.
  115. /// This is a convenience function. Use b2FixtureDef if you need to set parameters
  116. /// like friction, restitution, user data, or filtering.
  117. /// If the density is non-zero, this function automatically updates the mass of the body.
  118. /// @param shape the shape to be cloned.
  119. /// @param density the shape density (set to zero for static bodies).
  120. /// @warning This function is locked during callbacks.
  121. b2Fixture* CreateFixture(const b2Shape* shape, float32 density);
  122. /// Destroy a fixture. This removes the fixture from the broad-phase and
  123. /// destroys all contacts associated with this fixture. This will
  124. /// automatically adjust the mass of the body if the body is dynamic and the
  125. /// fixture has positive density.
  126. /// All fixtures attached to a body are implicitly destroyed when the body is destroyed.
  127. /// @param fixture the fixture to be removed.
  128. /// @warning This function is locked during callbacks.
  129. void DestroyFixture(b2Fixture* fixture);
  130. /// Set the position of the body's origin and rotation.
  131. /// This breaks any contacts and wakes the other bodies.
  132. /// Manipulating a body's transform may cause non-physical behavior.
  133. /// @param position the world position of the body's local origin.
  134. /// @param angle the world rotation in radians.
  135. void SetTransform(const b2Vec2& position, float32 angle);
  136. /// Get the body transform for the body's origin.
  137. /// @return the world transform of the body's origin.
  138. const b2Transform& GetTransform() const;
  139. /// Get the world body origin position.
  140. /// @return the world position of the body's origin.
  141. const b2Vec2& GetPosition() const;
  142. /// Get the angle in radians.
  143. /// @return the current world rotation angle in radians.
  144. float32 GetAngle() const;
  145. /// Get the world position of the center of mass.
  146. const b2Vec2& GetWorldCenter() const;
  147. /// Get the local position of the center of mass.
  148. const b2Vec2& GetLocalCenter() const;
  149. /// Set the linear velocity of the center of mass.
  150. /// @param v the new linear velocity of the center of mass.
  151. void SetLinearVelocity(const b2Vec2& v);
  152. /// Get the linear velocity of the center of mass.
  153. /// @return the linear velocity of the center of mass.
  154. b2Vec2 GetLinearVelocity() const;
  155. /// Set the angular velocity.
  156. /// @param omega the new angular velocity in radians/second.
  157. void SetAngularVelocity(float32 omega);
  158. /// Get the angular velocity.
  159. /// @return the angular velocity in radians/second.
  160. float32 GetAngularVelocity() const;
  161. /// Apply a force at a world point. If the force is not
  162. /// applied at the center of mass, it will generate a torque and
  163. /// affect the angular velocity. This wakes up the body.
  164. /// @param force the world force vector, usually in Newtons (N).
  165. /// @param point the world position of the point of application.
  166. void ApplyForce(const b2Vec2& force, const b2Vec2& point);
  167. /// Apply a torque. This affects the angular velocity
  168. /// without affecting the linear velocity of the center of mass.
  169. /// This wakes up the body.
  170. /// @param torque about the z-axis (out of the screen), usually in N-m.
  171. void ApplyTorque(float32 torque);
  172. /// Apply an impulse at a point. This immediately modifies the velocity.
  173. /// It also modifies the angular velocity if the point of application
  174. /// is not at the center of mass. This wakes up the body.
  175. /// @param impulse the world impulse vector, usually in N-seconds or kg-m/s.
  176. /// @param point the world position of the point of application.
  177. void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point);
  178. /// Apply an angular impulse.
  179. /// @param impulse the angular impulse in units of kg*m*m/s
  180. void ApplyAngularImpulse(float32 impulse);
  181. /// Get the total mass of the body.
  182. /// @return the mass, usually in kilograms (kg).
  183. float32 GetMass() const;
  184. /// Get the rotational inertia of the body about the local origin.
  185. /// @return the rotational inertia, usually in kg-m^2.
  186. float32 GetInertia() const;
  187. /// Get the mass data of the body.
  188. /// @return a struct containing the mass, inertia and center of the body.
  189. void GetMassData(b2MassData* data) const;
  190. /// Set the mass properties to override the mass properties of the fixtures.
  191. /// Note that this changes the center of mass position.
  192. /// Note that creating or destroying fixtures can also alter the mass.
  193. /// This function has no effect if the body isn't dynamic.
  194. /// @param massData the mass properties.
  195. void SetMassData(const b2MassData* data);
  196. /// This resets the mass properties to the sum of the mass properties of the fixtures.
  197. /// This normally does not need to be called unless you called SetMassData to override
  198. /// the mass and you later want to reset the mass.
  199. void ResetMassData();
  200. /// Get the world coordinates of a point given the local coordinates.
  201. /// @param localPoint a point on the body measured relative the the body's origin.
  202. /// @return the same point expressed in world coordinates.
  203. b2Vec2 GetWorldPoint(const b2Vec2& localPoint) const;
  204. /// Get the world coordinates of a vector given the local coordinates.
  205. /// @param localVector a vector fixed in the body.
  206. /// @return the same vector expressed in world coordinates.
  207. b2Vec2 GetWorldVector(const b2Vec2& localVector) const;
  208. /// Gets a local point relative to the body's origin given a world point.
  209. /// @param a point in world coordinates.
  210. /// @return the corresponding local point relative to the body's origin.
  211. b2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const;
  212. /// Gets a local vector given a world vector.
  213. /// @param a vector in world coordinates.
  214. /// @return the corresponding local vector.
  215. b2Vec2 GetLocalVector(const b2Vec2& worldVector) const;
  216. /// Get the world linear velocity of a world point attached to this body.
  217. /// @param a point in world coordinates.
  218. /// @return the world velocity of a point.
  219. b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const;
  220. /// Get the world velocity of a local point.
  221. /// @param a point in local coordinates.
  222. /// @return the world velocity of a point.
  223. b2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const;
  224. /// Get the linear damping of the body.
  225. float32 GetLinearDamping() const;
  226. /// Set the linear damping of the body.
  227. void SetLinearDamping(float32 linearDamping);
  228. /// Get the angular damping of the body.
  229. float32 GetAngularDamping() const;
  230. /// Set the angular damping of the body.
  231. void SetAngularDamping(float32 angularDamping);
  232. /// Set the type of this body. This may alter the mass and velocity.
  233. void SetType(b2BodyType type);
  234. /// Get the type of this body.
  235. b2BodyType GetType() const;
  236. /// Should this body be treated like a bullet for continuous collision detection?
  237. void SetBullet(bool flag);
  238. /// Is this body treated like a bullet for continuous collision detection?
  239. bool IsBullet() const;
  240. /// You can disable sleeping on this body. If you disable sleeping, the
  241. /// body will be woken.
  242. void SetSleepingAllowed(bool flag);
  243. /// Is this body allowed to sleep
  244. bool IsSleepingAllowed() const;
  245. /// Set the sleep state of the body. A sleeping body has very
  246. /// low CPU cost.
  247. /// @param flag set to true to put body to sleep, false to wake it.
  248. void SetAwake(bool flag);
  249. /// Get the sleeping state of this body.
  250. /// @return true if the body is sleeping.
  251. bool IsAwake() const;
  252. /// Set the active state of the body. An inactive body is not
  253. /// simulated and cannot be collided with or woken up.
  254. /// If you pass a flag of true, all fixtures will be added to the
  255. /// broad-phase.
  256. /// If you pass a flag of false, all fixtures will be removed from
  257. /// the broad-phase and all contacts will be destroyed.
  258. /// Fixtures and joints are otherwise unaffected. You may continue
  259. /// to create/destroy fixtures and joints on inactive bodies.
  260. /// Fixtures on an inactive body are implicitly inactive and will
  261. /// not participate in collisions, ray-casts, or queries.
  262. /// Joints connected to an inactive body are implicitly inactive.
  263. /// An inactive body is still owned by a b2World object and remains
  264. /// in the body list.
  265. void SetActive(bool flag);
  266. /// Get the active state of the body.
  267. bool IsActive() const;
  268. /// Set this body to have fixed rotation. This causes the mass
  269. /// to be reset.
  270. void SetFixedRotation(bool flag);
  271. /// Does this body have fixed rotation?
  272. bool IsFixedRotation() const;
  273. /// Get the list of all fixtures attached to this body.
  274. b2Fixture* GetFixtureList();
  275. const b2Fixture* GetFixtureList() const;
  276. /// Get the list of all joints attached to this body.
  277. b2JointEdge* GetJointList();
  278. const b2JointEdge* GetJointList() const;
  279. /// Get the list of all contacts attached to this body.
  280. /// @warning this list changes during the time step and you may
  281. /// miss some collisions if you don't use b2ContactListener.
  282. b2ContactEdge* GetContactList();
  283. const b2ContactEdge* GetContactList() const;
  284. /// Get the next body in the world's body list.
  285. b2Body* GetNext();
  286. const b2Body* GetNext() const;
  287. /// Get the user data pointer that was provided in the body definition.
  288. void* GetUserData() const;
  289. /// Set the user data. Use this to store your application specific data.
  290. void SetUserData(void* data);
  291. /// Get the parent world of this body.
  292. b2World* GetWorld();
  293. const b2World* GetWorld() const;
  294. private:
  295. friend class b2World;
  296. friend class b2Island;
  297. friend class b2ContactManager;
  298. friend class b2ContactSolver;
  299. friend class b2TOISolver;
  300. friend class b2DistanceJoint;
  301. friend class b2GearJoint;
  302. friend class b2LineJoint;
  303. friend class b2MouseJoint;
  304. friend class b2PrismaticJoint;
  305. friend class b2PulleyJoint;
  306. friend class b2RevoluteJoint;
  307. friend class b2WeldJoint;
  308. friend class b2FrictionJoint;
  309. // m_flags
  310. enum
  311. {
  312. e_islandFlag = 0x0001,
  313. e_awakeFlag = 0x0002,
  314. e_autoSleepFlag = 0x0004,
  315. e_bulletFlag = 0x0008,
  316. e_fixedRotationFlag = 0x0010,
  317. e_activeFlag = 0x0020,
  318. e_toiFlag = 0x0040,
  319. };
  320. b2Body(const b2BodyDef* bd, b2World* world);
  321. ~b2Body();
  322. void SynchronizeFixtures();
  323. void SynchronizeTransform();
  324. // This is used to prevent connected bodies from colliding.
  325. // It may lie, depending on the collideConnected flag.
  326. bool ShouldCollide(const b2Body* other) const;
  327. void Advance(float32 t);
  328. b2BodyType m_type;
  329. uint16 m_flags;
  330. int32 m_islandIndex;
  331. b2Transform m_xf; // the body origin transform
  332. b2Sweep m_sweep; // the swept motion for CCD
  333. b2Vec2 m_linearVelocity;
  334. float32 m_angularVelocity;
  335. b2Vec2 m_force;
  336. float32 m_torque;
  337. b2World* m_world;
  338. b2Body* m_prev;
  339. b2Body* m_next;
  340. b2Fixture* m_fixtureList;
  341. int32 m_fixtureCount;
  342. b2JointEdge* m_jointList;
  343. b2ContactEdge* m_contactList;
  344. float32 m_mass, m_invMass;
  345. // Rotational inertia about the center of mass.
  346. float32 m_I, m_invI;
  347. float32 m_linearDamping;
  348. float32 m_angularDamping;
  349. float32 m_sleepTime;
  350. void* m_userData;
  351. };
  352. inline b2BodyType b2Body::GetType() const
  353. {
  354. return m_type;
  355. }
  356. inline const b2Transform& b2Body::GetTransform() const
  357. {
  358. return m_xf;
  359. }
  360. inline const b2Vec2& b2Body::GetPosition() const
  361. {
  362. return m_xf.position;
  363. }
  364. inline float32 b2Body::GetAngle() const
  365. {
  366. return m_sweep.a;
  367. }
  368. inline const b2Vec2& b2Body::GetWorldCenter() const
  369. {
  370. return m_sweep.c;
  371. }
  372. inline const b2Vec2& b2Body::GetLocalCenter() const
  373. {
  374. return m_sweep.localCenter;
  375. }
  376. inline void b2Body::SetLinearVelocity(const b2Vec2& v)
  377. {
  378. if (m_type == b2_staticBody)
  379. {
  380. return;
  381. }
  382. if (b2Dot(v,v) > 0.0f)
  383. {
  384. SetAwake(true);
  385. }
  386. m_linearVelocity = v;
  387. }
  388. inline b2Vec2 b2Body::GetLinearVelocity() const
  389. {
  390. return m_linearVelocity;
  391. }
  392. inline void b2Body::SetAngularVelocity(float32 w)
  393. {
  394. if (m_type == b2_staticBody)
  395. {
  396. return;
  397. }
  398. if (w * w > 0.0f)
  399. {
  400. SetAwake(true);
  401. }
  402. m_angularVelocity = w;
  403. }
  404. inline float32 b2Body::GetAngularVelocity() const
  405. {
  406. return m_angularVelocity;
  407. }
  408. inline float32 b2Body::GetMass() const
  409. {
  410. return m_mass;
  411. }
  412. inline float32 b2Body::GetInertia() const
  413. {
  414. return m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);
  415. }
  416. inline void b2Body::GetMassData(b2MassData* data) const
  417. {
  418. data->mass = m_mass;
  419. data->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter);
  420. data->center = m_sweep.localCenter;
  421. }
  422. inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const
  423. {
  424. return b2Mul(m_xf, localPoint);
  425. }
  426. inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const
  427. {
  428. return b2Mul(m_xf.R, localVector);
  429. }
  430. inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const
  431. {
  432. return b2MulT(m_xf, worldPoint);
  433. }
  434. inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const
  435. {
  436. return b2MulT(m_xf.R, worldVector);
  437. }
  438. inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const
  439. {
  440. return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c);
  441. }
  442. inline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const
  443. {
  444. return GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint));
  445. }
  446. inline float32 b2Body::GetLinearDamping() const
  447. {
  448. return m_linearDamping;
  449. }
  450. inline void b2Body::SetLinearDamping(float32 linearDamping)
  451. {
  452. m_linearDamping = linearDamping;
  453. }
  454. inline float32 b2Body::GetAngularDamping() const
  455. {
  456. return m_angularDamping;
  457. }
  458. inline void b2Body::SetAngularDamping(float32 angularDamping)
  459. {
  460. m_angularDamping = angularDamping;
  461. }
  462. inline void b2Body::SetBullet(bool flag)
  463. {
  464. if (flag)
  465. {
  466. m_flags |= e_bulletFlag;
  467. }
  468. else
  469. {
  470. m_flags &= ~e_bulletFlag;
  471. }
  472. }
  473. inline bool b2Body::IsBullet() const
  474. {
  475. return (m_flags & e_bulletFlag) == e_bulletFlag;
  476. }
  477. inline void b2Body::SetAwake(bool flag)
  478. {
  479. if (flag)
  480. {
  481. if ((m_flags & e_awakeFlag) == 0)
  482. {
  483. m_flags |= e_awakeFlag;
  484. m_sleepTime = 0.0f;
  485. }
  486. }
  487. else
  488. {
  489. m_flags &= ~e_awakeFlag;
  490. m_sleepTime = 0.0f;
  491. m_linearVelocity.SetZero();
  492. m_angularVelocity = 0.0f;
  493. m_force.SetZero();
  494. m_torque = 0.0f;
  495. }
  496. }
  497. inline bool b2Body::IsAwake() const
  498. {
  499. return (m_flags & e_awakeFlag) == e_awakeFlag;
  500. }
  501. inline bool b2Body::IsActive() const
  502. {
  503. return (m_flags & e_activeFlag) == e_activeFlag;
  504. }
  505. inline void b2Body::SetFixedRotation(bool flag)
  506. {
  507. if (flag)
  508. {
  509. m_flags |= e_fixedRotationFlag;
  510. }
  511. else
  512. {
  513. m_flags &= ~e_fixedRotationFlag;
  514. }
  515. ResetMassData();
  516. }
  517. inline bool b2Body::IsFixedRotation() const
  518. {
  519. return (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag;
  520. }
  521. inline void b2Body::SetSleepingAllowed(bool flag)
  522. {
  523. if (flag)
  524. {
  525. m_flags |= e_autoSleepFlag;
  526. }
  527. else
  528. {
  529. m_flags &= ~e_autoSleepFlag;
  530. SetAwake(true);
  531. }
  532. }
  533. inline bool b2Body::IsSleepingAllowed() const
  534. {
  535. return (m_flags & e_autoSleepFlag) == e_autoSleepFlag;
  536. }
  537. inline b2Fixture* b2Body::GetFixtureList()
  538. {
  539. return m_fixtureList;
  540. }
  541. inline const b2Fixture* b2Body::GetFixtureList() const
  542. {
  543. return m_fixtureList;
  544. }
  545. inline b2JointEdge* b2Body::GetJointList()
  546. {
  547. return m_jointList;
  548. }
  549. inline const b2JointEdge* b2Body::GetJointList() const
  550. {
  551. return m_jointList;
  552. }
  553. inline b2ContactEdge* b2Body::GetContactList()
  554. {
  555. return m_contactList;
  556. }
  557. inline const b2ContactEdge* b2Body::GetContactList() const
  558. {
  559. return m_contactList;
  560. }
  561. inline b2Body* b2Body::GetNext()
  562. {
  563. return m_next;
  564. }
  565. inline const b2Body* b2Body::GetNext() const
  566. {
  567. return m_next;
  568. }
  569. inline void b2Body::SetUserData(void* data)
  570. {
  571. m_userData = data;
  572. }
  573. inline void* b2Body::GetUserData() const
  574. {
  575. return m_userData;
  576. }
  577. inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point)
  578. {
  579. if (m_type != b2_dynamicBody)
  580. {
  581. return;
  582. }
  583. if (IsAwake() == false)
  584. {
  585. SetAwake(true);
  586. }
  587. m_force += force;
  588. m_torque += b2Cross(point - m_sweep.c, force);
  589. }
  590. inline void b2Body::ApplyTorque(float32 torque)
  591. {
  592. if (m_type != b2_dynamicBody)
  593. {
  594. return;
  595. }
  596. if (IsAwake() == false)
  597. {
  598. SetAwake(true);
  599. }
  600. m_torque += torque;
  601. }
  602. inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point)
  603. {
  604. if (m_type != b2_dynamicBody)
  605. {
  606. return;
  607. }
  608. if (IsAwake() == false)
  609. {
  610. SetAwake(true);
  611. }
  612. m_linearVelocity += m_invMass * impulse;
  613. m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse);
  614. }
  615. inline void b2Body::ApplyAngularImpulse(float32 impulse)
  616. {
  617. if (m_type != b2_dynamicBody)
  618. {
  619. return;
  620. }
  621. if (IsAwake() == false)
  622. {
  623. SetAwake(true);
  624. }
  625. m_angularVelocity += m_invI * impulse;
  626. }
  627. inline void b2Body::SynchronizeTransform()
  628. {
  629. m_xf.R.Set(m_sweep.a);
  630. m_xf.position = m_sweep.c - b2Mul(m_xf.R, m_sweep.localCenter);
  631. }
  632. inline void b2Body::Advance(float32 t)
  633. {
  634. // Advance to the new safe time.
  635. m_sweep.Advance(t);
  636. m_sweep.c = m_sweep.c0;
  637. m_sweep.a = m_sweep.a0;
  638. SynchronizeTransform();
  639. }
  640. inline b2World* b2Body::GetWorld()
  641. {
  642. return m_world;
  643. }
  644. inline const b2World* b2Body::GetWorld() const
  645. {
  646. return m_world;
  647. }
  648. #endif