Blender V2.61 - r43446
|
00001 /* 00002 Bullet Continuous Collision Detection and Physics Library 00003 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ 00004 00005 This software is provided 'as-is', without any express or implied warranty. 00006 In no event will the authors be held liable for any damages arising from the use of this software. 00007 Permission is granted to anyone to use this software for any purpose, 00008 including commercial applications, and to alter it and redistribute it freely, 00009 subject to the following restrictions: 00010 00011 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 00012 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 00013 3. This notice may not be removed or altered from any source distribution. 00014 */ 00015 00016 #ifndef SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H 00017 #define SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H 00018 00019 #include "btConstraintSolver.h" 00020 class btIDebugDraw; 00021 #include "btContactConstraint.h" 00022 #include "btSolverBody.h" 00023 #include "btSolverConstraint.h" 00024 #include "btTypedConstraint.h" 00025 #include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h" 00026 00028 class btSequentialImpulseConstraintSolver : public btConstraintSolver 00029 { 00030 protected: 00031 00032 btConstraintArray m_tmpSolverContactConstraintPool; 00033 btConstraintArray m_tmpSolverNonContactConstraintPool; 00034 btConstraintArray m_tmpSolverContactFrictionConstraintPool; 00035 btAlignedObjectArray<int> m_orderTmpConstraintPool; 00036 btAlignedObjectArray<int> m_orderFrictionConstraintPool; 00037 btAlignedObjectArray<btTypedConstraint::btConstraintInfo1> m_tmpConstraintSizesPool; 00038 00039 void setupFrictionConstraint( btSolverConstraint& solverConstraint, const btVector3& normalAxis,btRigidBody* solverBodyA,btRigidBody* solverBodyIdB, 00040 btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2, 00041 btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, 00042 btScalar desiredVelocity=0., btScalar cfmSlip=0.); 00043 00044 btSolverConstraint& addFrictionConstraint(const btVector3& normalAxis,btRigidBody* solverBodyA,btRigidBody* solverBodyB,int frictionIndex,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.); 00045 00046 void setupContactConstraint(btSolverConstraint& solverConstraint, btCollisionObject* colObj0, btCollisionObject* colObj1, btManifoldPoint& cp, 00047 const btContactSolverInfo& infoGlobal, btVector3& vel, btScalar& rel_vel, btScalar& relaxation, 00048 btVector3& rel_pos1, btVector3& rel_pos2); 00049 00050 void setFrictionConstraintImpulse( btSolverConstraint& solverConstraint, btRigidBody* rb0, btRigidBody* rb1, 00051 btManifoldPoint& cp, const btContactSolverInfo& infoGlobal); 00052 00054 unsigned long m_btSeed2; 00055 00056 // void initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject); 00057 btScalar restitutionCurve(btScalar rel_vel, btScalar restitution); 00058 00059 void convertContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal); 00060 00061 00062 void resolveSplitPenetrationSIMD( 00063 btRigidBody& body1, 00064 btRigidBody& body2, 00065 const btSolverConstraint& contactConstraint); 00066 00067 void resolveSplitPenetrationImpulseCacheFriendly( 00068 btRigidBody& body1, 00069 btRigidBody& body2, 00070 const btSolverConstraint& contactConstraint); 00071 00072 //internal method 00073 int getOrInitSolverBody(btCollisionObject& body); 00074 00075 void resolveSingleConstraintRowGeneric(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint); 00076 00077 void resolveSingleConstraintRowGenericSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint); 00078 00079 void resolveSingleConstraintRowLowerLimit(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint); 00080 00081 void resolveSingleConstraintRowLowerLimitSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint); 00082 00083 protected: 00084 static btRigidBody& getFixedBody(); 00085 00086 virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc); 00087 virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc); 00088 btScalar solveSingleIteration(int iteration, btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc); 00089 00090 virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc); 00091 virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc); 00092 00093 00094 public: 00095 00096 00097 btSequentialImpulseConstraintSolver(); 00098 virtual ~btSequentialImpulseConstraintSolver(); 00099 00100 virtual btScalar solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btStackAlloc* stackAlloc,btDispatcher* dispatcher); 00101 00102 00103 00105 virtual void reset(); 00106 00107 unsigned long btRand2(); 00108 00109 int btRandInt2 (int n); 00110 00111 void setRandSeed(unsigned long seed) 00112 { 00113 m_btSeed2 = seed; 00114 } 00115 unsigned long getRandSeed() const 00116 { 00117 return m_btSeed2; 00118 } 00119 00120 }; 00121 00122 #ifndef BT_PREFER_SIMD 00123 typedef btSequentialImpulseConstraintSolver btSequentialImpulseConstraintSolverPrefered; 00124 #endif 00125 00126 00127 #endif //SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H 00128