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

游戏引擎

开发平台:

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_CONTACT_H
  19. #define B2_CONTACT_H
  20. #include <Box2D/Common/b2Math.h>
  21. #include <Box2D/Collision/b2Collision.h>
  22. #include <Box2D/Collision/Shapes/b2Shape.h>
  23. #include <Box2D/Dynamics/Contacts/b2Contact.h>
  24. #include <Box2D/Dynamics/b2Fixture.h>
  25. class b2Body;
  26. class b2Contact;
  27. class b2Fixture;
  28. class b2World;
  29. class b2BlockAllocator;
  30. class b2StackAllocator;
  31. class b2ContactListener;
  32. typedef b2Contact* b2ContactCreateFcn(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator);
  33. typedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator);
  34. struct b2ContactRegister
  35. {
  36. b2ContactCreateFcn* createFcn;
  37. b2ContactDestroyFcn* destroyFcn;
  38. bool primary;
  39. };
  40. /// A contact edge is used to connect bodies and contacts together
  41. /// in a contact graph where each body is a node and each contact
  42. /// is an edge. A contact edge belongs to a doubly linked list
  43. /// maintained in each attached body. Each contact has two contact
  44. /// nodes, one for each attached body.
  45. struct b2ContactEdge
  46. {
  47. b2Body* other; ///< provides quick access to the other body attached.
  48. b2Contact* contact; ///< the contact
  49. b2ContactEdge* prev; ///< the previous contact edge in the body's contact list
  50. b2ContactEdge* next; ///< the next contact edge in the body's contact list
  51. };
  52. /// The class manages contact between two shapes. A contact exists for each overlapping
  53. /// AABB in the broad-phase (except if filtered). Therefore a contact object may exist
  54. /// that has no contact points.
  55. class b2Contact
  56. {
  57. public:
  58. /// Get the contact manifold. Do not modify the manifold unless you understand the
  59. /// internals of Box2D.
  60. b2Manifold* GetManifold();
  61. const b2Manifold* GetManifold() const;
  62. /// Get the world manifold.
  63. void GetWorldManifold(b2WorldManifold* worldManifold) const;
  64. /// Is this contact touching?
  65. bool IsTouching() const;
  66. /// Enable/disable this contact. This can be used inside the pre-solve
  67. /// contact listener. The contact is only disabled for the current
  68. /// time step (or sub-step in continuous collisions).
  69. void SetEnabled(bool flag);
  70. /// Has this contact been disabled?
  71. bool IsEnabled() const;
  72. /// Get the next contact in the world's contact list.
  73. b2Contact* GetNext();
  74. const b2Contact* GetNext() const;
  75. /// Get the first fixture in this contact.
  76. b2Fixture* GetFixtureA();
  77. const b2Fixture* GetFixtureA() const;
  78. /// Get the second fixture in this contact.
  79. b2Fixture* GetFixtureB();
  80. const b2Fixture* GetFixtureB() const;
  81. /// Evaluate this contact with your own manifold and transforms.
  82. virtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0;
  83. protected:
  84. friend class b2ContactManager;
  85. friend class b2World;
  86. friend class b2ContactSolver;
  87. friend class b2Body;
  88. friend class b2Fixture;
  89. // Flags stored in m_flags
  90. enum
  91. {
  92. // Used when crawling contact graph when forming islands.
  93. e_islandFlag = 0x0001,
  94.         // Set when the shapes are touching.
  95. e_touchingFlag = 0x0002,
  96. // This contact can be disabled (by user)
  97. e_enabledFlag = 0x0004,
  98. // This contact needs filtering because a fixture filter was changed.
  99. e_filterFlag = 0x0008,
  100. // This bullet contact had a TOI event
  101. e_bulletHitFlag = 0x0010,
  102. };
  103. /// Flag this contact for filtering. Filtering will occur the next time step.
  104. void FlagForFiltering();
  105. static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn,
  106. b2Shape::Type typeA, b2Shape::Type typeB);
  107. static void InitializeRegisters();
  108. static b2Contact* Create(b2Fixture* fixtureA, b2Fixture* fixtureB, b2BlockAllocator* allocator);
  109. static void Destroy(b2Contact* contact, b2Shape::Type typeA, b2Shape::Type typeB, b2BlockAllocator* allocator);
  110. static void Destroy(b2Contact* contact, b2BlockAllocator* allocator);
  111. b2Contact() : m_fixtureA(NULL), m_fixtureB(NULL) {}
  112. b2Contact(b2Fixture* fixtureA, b2Fixture* fixtureB);
  113. virtual ~b2Contact() {}
  114. void Update(b2ContactListener* listener);
  115. static b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount];
  116. static bool s_initialized;
  117. uint32 m_flags;
  118. // World pool and list pointers.
  119. b2Contact* m_prev;
  120. b2Contact* m_next;
  121. // Nodes for connecting bodies.
  122. b2ContactEdge m_nodeA;
  123. b2ContactEdge m_nodeB;
  124. b2Fixture* m_fixtureA;
  125. b2Fixture* m_fixtureB;
  126. b2Manifold m_manifold;
  127. int32 m_toiCount;
  128. // float32 m_toi;
  129. };
  130. inline b2Manifold* b2Contact::GetManifold()
  131. {
  132. return &m_manifold;
  133. }
  134. inline const b2Manifold* b2Contact::GetManifold() const
  135. {
  136. return &m_manifold;
  137. }
  138. inline void b2Contact::GetWorldManifold(b2WorldManifold* worldManifold) const
  139. {
  140. const b2Body* bodyA = m_fixtureA->GetBody();
  141. const b2Body* bodyB = m_fixtureB->GetBody();
  142. const b2Shape* shapeA = m_fixtureA->GetShape();
  143. const b2Shape* shapeB = m_fixtureB->GetShape();
  144. worldManifold->Initialize(&m_manifold, bodyA->GetTransform(), shapeA->m_radius, bodyB->GetTransform(), shapeB->m_radius);
  145. }
  146. inline void b2Contact::SetEnabled(bool flag)
  147. {
  148. if (flag)
  149. {
  150. m_flags |= e_enabledFlag;
  151. }
  152. else
  153. {
  154. m_flags &= ~e_enabledFlag;
  155. }
  156. }
  157. inline bool b2Contact::IsEnabled() const
  158. {
  159. return (m_flags & e_enabledFlag) == e_enabledFlag;
  160. }
  161. inline bool b2Contact::IsTouching() const
  162. {
  163. return (m_flags & e_touchingFlag) == e_touchingFlag;
  164. }
  165. inline b2Contact* b2Contact::GetNext()
  166. {
  167. return m_next;
  168. }
  169. inline const b2Contact* b2Contact::GetNext() const
  170. {
  171. return m_next;
  172. }
  173. inline b2Fixture* b2Contact::GetFixtureA()
  174. {
  175. return m_fixtureA;
  176. }
  177. inline const b2Fixture* b2Contact::GetFixtureA() const
  178. {
  179. return m_fixtureA;
  180. }
  181. inline b2Fixture* b2Contact::GetFixtureB()
  182. {
  183. return m_fixtureB;
  184. }
  185. inline const b2Fixture* b2Contact::GetFixtureB() const
  186. {
  187. return m_fixtureB;
  188. }
  189. inline void b2Contact::FlagForFiltering()
  190. {
  191. m_flags |= e_filterFlag;
  192. }
  193. #endif