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 "../../Common/b2Math.h" 23 #include "../../Collision/b2Collision.h" 24 #include "../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 int32 pointCount; 55 int32 contactIndex; 56 }; 57 58 struct b2ContactSolverDef 59 { 60 b2TimeStep step; 61 b2Contact** contacts; 62 int32 count; 63 b2Position* positions; 64 b2Velocity* velocities; 65 b2StackAllocator* allocator; 66 }; 67 68 class b2ContactSolver 69 { 70 public: 71 b2ContactSolver(b2ContactSolverDef* def); 72 ~b2ContactSolver(); 73 74 void InitializeVelocityConstraints(); 75 76 void WarmStart(); 77 void SolveVelocityConstraints(); 78 void StoreImpulses(); 79 80 bool SolvePositionConstraints(); 81 bool SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB); 82 83 b2TimeStep m_step; 84 b2Position* m_positions; 85 b2Velocity* m_velocities; 86 b2StackAllocator* m_allocator; 87 b2ContactPositionConstraint* m_positionConstraints; 88 b2ContactVelocityConstraint* m_velocityConstraints; 89 b2Contact** m_contacts; 90 int m_count; 91 }; 92 93 #endif 94