1 /* 2 * Copyright (c) 2006-2009 Erin Catto http://www.box2d.org 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 19 #ifndef B2_CONTACT_SOLVER_H 20 #define B2_CONTACT_SOLVER_H 21 22 #include <Box2D/Common/b2Math.h> 23 #include <Box2D/Collision/b2Collision.h> 24 #include <Box2D/Dynamics/b2TimeStep.h> 25 26 class b2Contact; 27 class b2Body; 28 class b2StackAllocator; 29 struct b2ContactPositionConstraint; 30 31 struct b2VelocityConstraintPoint 32 { 33 b2Vec2 rA; 34 b2Vec2 rB; 35 float32 normalImpulse; 36 float32 tangentImpulse; 37 float32 normalMass; 38 float32 tangentMass; 39 float32 velocityBias; 40 }; 41 42 struct b2ContactVelocityConstraint 43 { 44 b2VelocityConstraintPoint points[b2_maxManifoldPoints]; 45 b2Vec2 normal; 46 b2Mat22 normalMass; 47 b2Mat22 K; 48 int32 indexA; 49 int32 indexB; 50 float32 invMassA, invMassB; 51 float32 invIA, invIB; 52 float32 friction; 53 float32 restitution; 54 float32 tangentSpeed; 55 int32 pointCount; 56 int32 contactIndex; 57 }; 58 59 struct b2ContactSolverDef 60 { 61 b2TimeStep step; 62 b2Contact** contacts; 63 int32 count; 64 b2Position* positions; 65 b2Velocity* velocities; 66 b2StackAllocator* allocator; 67 }; 68 69 class b2ContactSolver 70 { 71 public: 72 b2ContactSolver(b2ContactSolverDef* def); 73 ~b2ContactSolver(); 74 75 void InitializeVelocityConstraints(); 76 77 void WarmStart(); 78 void SolveVelocityConstraints(); 79 void StoreImpulses(); 80 81 bool SolvePositionConstraints(); 82 bool SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB); 83 84 b2TimeStep m_step; 85 b2Position* m_positions; 86 b2Velocity* m_velocities; 87 b2StackAllocator* m_allocator; 88 b2ContactPositionConstraint* m_positionConstraints; 89 b2ContactVelocityConstraint* m_velocityConstraints; 90 b2Contact** m_contacts; 91 int m_count; 92 }; 93 94 #endif 95 96