22 #include <Box2D/Common/b2Math.h>
24 #include <Box2D/Collision/Shapes/b2Shape.h>
25 #include <Box2D/Dynamics/b2Fixture.h>
37 inline float32 b2MixFriction(float32 friction1, float32 friction2)
39 return b2Sqrt(friction1 * friction2);
44 inline float32 b2MixRestitution(float32 restitution1, float32 restitution2)
46 return restitution1 > restitution2 ? restitution1 : restitution2;
54 struct b2ContactRegister
56 b2ContactCreateFcn* createFcn;
57 b2ContactDestroyFcn* destroyFcn;
150 friend class b2ContactSolver;
158 e_islandFlag = 0x0001,
161 e_touchingFlag = 0x0002,
164 e_enabledFlag = 0x0004,
167 e_filterFlag = 0x0008,
170 e_bulletHitFlag = 0x0010,
179 static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn,
180 b2Shape::Type typeA, b2Shape::Type typeB);
181 static void InitializeRegisters();
186 b2Contact() : m_fixtureA(NULL), m_fixtureB(NULL) {}
192 static b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount];
193 static bool s_initialized;
202 b2ContactEdge m_nodeA;
203 b2ContactEdge m_nodeB;
217 float32 m_restitution;
219 float32 m_tangentSpeed;
246 m_flags |= e_enabledFlag;
250 m_flags &= ~e_enabledFlag;
256 return (m_flags & e_enabledFlag) == e_enabledFlag;
261 return (m_flags & e_touchingFlag) == e_touchingFlag;
306 m_flags |= e_filterFlag;
311 m_friction = friction;
321 m_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction);
326 m_restitution = restitution;
331 return m_restitution;
336 m_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution);
341 m_tangentSpeed = speed;
346 return m_tangentSpeed;