105 #include <emmintrin.h>   108 #define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))   109 static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
   111         __m128 result = _mm_mul_ps( vec0, vec1);
   112         return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) );
   115 #if defined (BT_ALLOW_SSE4)   119 #define USE_FMA3_INSTEAD_FMA4   1   120 #define USE_SSE4_DOT                    1   122 #define SSE4_DP(a, b)                   _mm_dp_ps(a, b, 0x7f)   123 #define SSE4_DP_FP(a, b)                _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7f))   126 #define DOT_PRODUCT(a, b)               SSE4_DP(a, b)   128 #define DOT_PRODUCT(a, b)               btSimdDot3(a, b)   132 #if USE_FMA3_INSTEAD_FMA4   134 #define FMADD(a, b, c)          _mm_fmadd_ps(a, b, c)   136 #define FMNADD(a, b, c)         _mm_fnmadd_ps(a, b, c)   139 #define FMADD(a, b, c)          _mm_macc_ps(a, b, c)   141 #define FMNADD(a, b, c)         _mm_nmacc_ps(a, b, c)   145 #define FMADD(a, b, c)          _mm_add_ps(c, _mm_mul_ps(a, b))   147 #define FMNADD(a, b, c)         _mm_sub_ps(c, _mm_mul_ps(a, b))   160         deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
   161         deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
   164         resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
   165         resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
   166         __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
   167         deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
   168         c.
m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
   169         __m128 upperMinApplied = _mm_sub_ps(upperLimit1, cpAppliedImp);
   170         deltaImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied));
   174         __m128 impulseMagnitude = deltaImpulse;
   186 #if defined (BT_ALLOW_SSE4)   193         deltaImpulse                            = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
   194         deltaImpulse                            = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
   196         const __m128 maskLower          = _mm_cmpgt_ps(tmp, lowerLimit);
   197         const __m128 maskUpper          = _mm_cmpgt_ps(upperLimit, tmp);
   198         deltaImpulse                            = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.
m_appliedImpulse), _mm_blendv_ps(_mm_sub_ps(upperLimit, c.
m_appliedImpulse), deltaImpulse, maskUpper), maskLower);
   199         c.
m_appliedImpulse                      = _mm_blendv_ps(lowerLimit, _mm_blendv_ps(upperLimit, tmp, maskUpper), maskLower);
   206         return gResolveSingleConstraintRowGeneric_sse2(body1,body2,c);
   220         deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
   221         deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
   224         resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
   225         resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
   226         __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
   227         deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
   228         c.
m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
   231         __m128 impulseMagnitude = deltaImpulse;
   249         deltaImpulse                            = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
   250         deltaImpulse                            = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
   252         const __m128 mask                       = _mm_cmpgt_ps(tmp, lowerLimit);
   253         deltaImpulse                            = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.
m_appliedImpulse), deltaImpulse, mask);
   261         return gResolveSingleConstraintRowLowerLimit_sse2(body1,body2,c);
   262 #endif //BT_ALLOW_SSE4   344         deltaImpulse    =       _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
   345         deltaImpulse    =       _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
   348         resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
   349         resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
   350         __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
   351         deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
   352         c.
m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
   355         __m128 impulseMagnitude = deltaImpulse;
   384 #endif//BT_ALLOW_SSE4   406          return gResolveSingleConstraintRowGeneric_sse2;
   410          return gResolveSingleConstraintRowLowerLimit_sse2;
   415          return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
   419          return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
   421 #endif //BT_ALLOW_SSE4   436         const unsigned long un = 
static_cast<unsigned long>(n);
   441         if (un <= 0x00010000UL) {
   443                 if (un <= 0x00000100UL) {
   445                         if (un <= 0x00000010UL) {
   447                                 if (un <= 0x00000004UL) {
   449                                         if (un <= 0x00000002UL) {
   457         return (
int) (r % un);
   507         btScalar rest = restitution * -rel_vel;
   523                 loc_lateral *= friction_scaling;
   533 void btSequentialImpulseConstraintSolver::setupFrictionConstraint(
btSolverConstraint& solverConstraint, 
const btVector3& normalAxis,
int  solverBodyIdA,
int solverBodyIdB,
btManifoldPoint& cp,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1, 
btScalar relaxation, 
btScalar desiredVelocity, 
btScalar cfmSlip)
   592                 btScalar denom = relaxation/(denom0+denom1);
   605                 rel_vel = vel1Dotn+vel2Dotn;
   609                 btScalar velocityError =  desiredVelocity - rel_vel;
   611                 solverConstraint.
m_rhs = velocityImpulse;
   613                 solverConstraint.
m_cfm = cfmSlip;
   620 btSolverConstraint&     
btSequentialImpulseConstraintSolver::addFrictionConstraint(
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
int frictionIndex,
btManifoldPoint& cp,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1, 
btScalar relaxation, 
btScalar desiredVelocity, 
btScalar cfmSlip)
   625                                                         colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
   626         return solverConstraint;
   686                 rel_vel = vel1Dotn+vel2Dotn;
   692                 solverConstraint.
m_rhs = velocityImpulse;
   693                 solverConstraint.
m_cfm = cfmSlip;
   707 btSolverConstraint&     
btSequentialImpulseConstraintSolver::addRollingFrictionConstraint(
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
int frictionIndex,
btManifoldPoint& cp,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1, 
btScalar relaxation, 
btScalar desiredVelocity, 
btScalar cfmSlip)
   712                                                         colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
   713         return solverConstraint;
   720         int solverBodyIdA = -1;
   751         return solverBodyIdA;
   758                                                                                                                                  int solverBodyIdA, 
int solverBodyIdB,
   786 #ifdef COMPUTE_IMPULSE_DENOM   803 #endif //COMPUTE_IMPULSE_DENOM   805                                         btScalar denom = relaxation/(denom0+denom1);
   881                                         btScalar rel_vel = vel1Dotn+vel2Dotn;
   884                                         btScalar        velocityError = restitution - rel_vel;
   890                                                 erp = infoGlobal.
m_erp;
   897                                                 velocityError -= penetration / infoGlobal.
m_timeStep;
   900                                                 positionalError = -penetration * erp/infoGlobal.
m_timeStep;
   909                                                 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
   915                                                 solverConstraint.
m_rhs = velocityImpulse;
   918                                         solverConstraint.
m_cfm = 0.f;
   931                                                                                                                                                 int solverBodyIdA, 
int solverBodyIdB,
   998         int rollingFriction=1;
  1024                         rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
  1035                         setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
  1046                         btVector3 angVelA(0,0,0),angVelB(0,0,0);
  1062                                         if (relAngVel.
length()>0.001)
  1074                                         if (axis0.
length()>0.001)
  1076                                         if (axis1.
length()>0.001)
  1141                                 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.
m_contactMotion1, cp.
m_contactCFM1);
  1144                                         addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.
m_contactMotion2, cp.
m_contactCFM2);
  1163         for (i=0;i<numManifolds;i++)
  1165                 manifold = manifoldPtr[i];
  1178 #ifdef BT_ADDITIONAL_DEBUG  1180         for (
int i=0;i<numConstraints;i++)
  1188                                 for (
int b=0;b<numBodies;b++)
  1202                                 for (
int b=0;b<numBodies;b++)
  1215     for (
int i=0;i<numManifolds;i++)
  1217         if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
  1220             for (
int b=0;b<numBodies;b++)
  1223                 if (manifoldPtr[i]->getBody0()==bodies[b])
  1231         if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
  1234             for (
int b=0;b<numBodies;b++)
  1236                 if (manifoldPtr[i]->getBody1()==bodies[b])
  1245 #endif //BT_ADDITIONAL_DEBUG  1248         for (
int i = 0; i < numBodies; i++)
  1263         for (
int i=0;i<numBodies;i++)
  1296                 for (j=0;j<numConstraints;j++)
  1310                         int totalNumRows = 0;
  1315                         for (i=0;i<numConstraints;i++)
  1327                                 if (constraints[i]->isEnabled())
  1330                                 if (constraints[i]->isEnabled())
  1346                         for (i=0;i<numConstraints;i++)
  1409                                         info2.
cfm = ¤tConstraintRow->
m_cfm;
  1472                                                         rel_vel = vel1Dotn+vel2Dotn;
  1478                                                         solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
  1510                 for (i=0;i<numNonContactPool;i++)
  1514                 for (i=0;i<numConstraintPool;i++)
  1518                 for (i=0;i<numFrictionPool;i++)
  1541                         for (
int j=0; j<numNonContactPool; ++j) {
  1551                                 for (
int j=0; j<numConstraintPool; ++j) {
  1558                                 for (
int j=0; j<numFrictionPool; ++j) {
  1580                         for (
int j=0;j<numConstraints;j++)
  1582                                 if (constraints[j]->isEnabled())
  1598                                 for (
int c=0;c<numPoolConstraints;c++)
  1607                                         bool applyFriction = 
true;
  1646                                 for (j=0;j<numPoolConstraints;j++)
  1658                                 for (j=0;j<numFrictionPoolConstraints;j++)
  1674                                 for (j=0;j<numRollingFrictionPoolConstraints;j++)
  1681                                                 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
  1682                                                 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
  1683                                                         rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
  1685                                                 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
  1686                                                 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
  1708                         for (
int j=0;j<numConstraints;j++)
  1710                                 if (constraints[j]->isEnabled())
  1721                         for (
int j=0;j<numPoolConstraints;j++)
  1728                         for (
int j=0;j<numFrictionPoolConstraints;j++)
  1743                         for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
  1749                                         btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
  1750                                         if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
  1751                                                 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
  1753                                         rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
  1754                                         rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
  1777                                         for (j=0;j<numPoolConstraints;j++)
  1793                                         for (j=0;j<numPoolConstraints;j++)
  1807         BT_PROFILE(
"solveGroupCacheFriendlyIterations");
  1815                 for ( 
int iteration = 0 ; iteration< 
maxIterations ; iteration++)
  1818                         solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
  1832                 for (j=0;j<numPoolConstraints;j++)
  1851         for (j=0;j<numPoolConstraints;j++)
 btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric()
btScalar * m_constraintError
btScalar getInvMass() const 
static T sum(const btAlignedObjectArray< T > &items)
btVector3 m_linearVelocity
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don't store a rigidbody pointer but a rigidbody ...
btVector3 m_angularVelocity
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
static btSimdScalar gResolveSingleConstraintRowGeneric_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
This is the scalar reference implementation of solving a single constraint row, the innerloop of the ...
int m_overrideNumSolverIterations
btScalar * m_J2angularAxis
virtual ~btSequentialImpulseConstraintSolver()
virtual void getInfo1(btConstraintInfo1 *info)=0
internal method used by the constraint solver, don't use them directly 
btConstraintArray m_tmpSolverContactFrictionConstraintPool
const btVector3 & getTotalForce() const 
btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool
btVector3 m_lateralFrictionDir1
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btVector3 m_relpos1CrossNormal
void internalApplyImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, const btScalar impulseMagnitude)
const btVector3 & getAngularFactor() const 
btScalar m_appliedImpulseLateral1
btScalar m_rhsPenetration
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
virtual void getInfo2(btConstraintInfo2 *info)=0
internal method used by the constraint solver, don't use them directly 
btScalar m_combinedRestitution
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const 
perform implicit force computation in world space 
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher)
btSequentialImpulseConstraintSolver Sequentially applies impulses 
static int getCpuFeatures()
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
void btPlaneSpace1(const T &n, T &p, T &q)
void resizeNoInitialize(int newsize)
resize changes the number of elements in the array. 
btScalar btSqrt(btScalar y)
btScalar m_appliedImpulse
btVector3 m_relpos2CrossNormal
const btVector3 & getTotalTorque() const 
btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit()
btScalar getBreakingImpulseThreshold() const 
btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric
static btSimdScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
btScalar computeImpulseDenominator(const btVector3 &pos, const btVector3 &normal) const 
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btSimdScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
ManifoldContactPoint collects and maintains persistent contactpoints. 
btScalar * m_J1angularAxis
const btCollisionObject * getBody0() const 
btScalar m_contactMotion1
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const 
btAlignedObjectArray< int > m_orderTmpConstraintPool
btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric()
Various implementations of solving a single constraint row using a generic equality constraint...
btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit()
Various implementations of solving a single constraint row using an inequality (lower limit) constrai...
void initSolverBody(btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep)
virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution)
btScalar dot(const btVector3 &v) const 
Return the dot product. 
virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btVector3 m_externalTorqueImpulse
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1. 
const btVector3 & getAnisotropicFriction() const 
btVector3 m_appliedForceBodyB
btVector3 getVelocityInLocalPoint(const btVector3 &rel_pos) const 
const btJointFeedback * getJointFeedback() const 
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
btVector3 m_externalForceImpulse
BT_ENABLE_GYROPSCOPIC_FORCE flags is enabled by default in Bullet 2.83 and onwards. 
btVector3 & internalGetTurnVelocity()
#define btSimdScalar
Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later...
btVector3 m_angularComponentA
btScalar m_combinedRollingFriction
btAlignedObjectArray< btSolverBody > m_tmpSolverBodyPool
void internalSetInvMass(const btVector3 &invMass)
btTransform & getWorldTransform()
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const 
explicit version is best avoided, it gains energy 
btVector3 m_normalWorldOnB
btScalar * m_J1linearAxis
int size() const 
return the number of elements in the array 
btSimdScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btVector3 m_appliedForceBodyA
void setFrictionConstraintImpulse(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal)
bool isKinematicObject() const 
virtual void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
btVector3 m_angularFactor
btScalar m_appliedImpulseLateral2
btConstraintArray m_tmpSolverContactConstraintPool
const btVector3 & getAngularVelocity() const 
btVector3 cross(const btVector3 &v) const 
Return the cross product between this and another vector. 
bool isStaticOrKinematicObject() const 
btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric()
btCollisionObject can be used to manage collision detection objects. 
btScalar getContactProcessingThreshold() const 
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations...
The btRigidBody is the main class for rigid body objects. 
btScalar length() const 
Return the length of the vector. 
btVector3 m_angularComponentB
int m_maxOverrideNumSolverIterations
const btManifoldPoint & getContactPoint(int index) const 
void setCompanionId(int id)
const btVector3 & internalGetInvMass() const 
btSimdScalar resolveSingleConstraintRowGenericSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
const btVector3 & getPositionWorldOnB() const 
btVector3 can be used to represent 3D points and vectors. 
btSolverConstraint & addFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit()
int getCompanionId() const 
btScalar length2() const 
Return the length of the vector squared. 
virtual void solveConstraintObsolete(btSolverBody &, btSolverBody &, btScalar)
internal method used by the constraint solver, don't use them directly 
void convertContact(btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal)
btVector3 m_appliedTorqueBodyB
btSimdScalar m_appliedPushImpulse
btSolverConstraint & addRollingFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0, btScalar cfmSlip=0.f)
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...
void * m_originalContactPoint
btAlignedObjectArray< btTypedConstraint::btConstraintInfo1 > m_tmpConstraintSizesPool
btScalar * m_J2linearAxis
bool hasAnisotropicFriction(int frictionMode=CF_ANISOTROPIC_FRICTION) const 
TypedConstraint is the baseclass for Bullet constraints and vehicles. 
void resize(int newsize, const T &fillData=T())
void setupFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btRigidBody * m_originalBody
void internalApplyPushImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, btScalar impulseMagnitude)
int getNumContacts() const 
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them 
const btRigidBody & getRigidBodyA() const 
void resolveSplitPenetrationSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
int gNumSplitImpulseRecoveries
void setEnabled(bool enabled)
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
void setupRollingFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btScalar m_contactMotion2
const btMatrix3x3 & getInvInertiaTensorWorld() const 
btScalar m_combinedFriction
bool m_lateralFrictionInitialized
T & expand(const T &fillValue=T())
btVector3 m_appliedTorqueBodyA
const btVector3 & getPositionWorldOnA() const 
btVector3 & internalGetPushVelocity()
btVector3 m_contactNormal1
btAlignedObjectArray< int > m_orderFrictionConstraintPool
const btVector3 & getLinearVelocity() const 
void setupContactConstraint(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btScalar &relaxation, const btVector3 &rel_pos1, const btVector3 &rel_pos2)
btAlignedObjectArray< int > m_orderNonContactConstraintPool
btSimdScalar resolveSingleConstraintRowLowerLimitSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btVector3 & internalGetDeltaAngularVelocity()
void internalSetAppliedImpulse(btScalar appliedImpulse)
internal method used by the constraint solver, don't use them directly 
virtual void reset()
clear internal cached data and reset random seed 
unsigned long m_btSeed2
m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction ...
btVector3 m_lateralFrictionDir2
btSimdScalar m_appliedImpulse
btScalar getDistance() const 
btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const 
perform implicit force computation in body space (inertial frame) 
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
const btVector3 & getLinearFactor() const 
T & expandNonInitializing()
btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit
const btRigidBody & getRigidBodyB() const 
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
int getOverrideNumSolverIterations() const 
const btCollisionObject * getBody1() const 
btSequentialImpulseConstraintSolver()
virtual void buildJacobian()
internal method used by the constraint solver, don't use them directly 
btConstraintArray m_tmpSolverNonContactConstraintPool
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3 m_contactNormal2
void resolveSplitPenetrationImpulseCacheFriendly(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btScalar btFabs(btScalar x)
btSimdScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
btTransform m_worldTransform