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   347         deltaImpulse    =       _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
   348         deltaImpulse    =       _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
   351         resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
   352         resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
   353         __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
   354         deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
   355         c.
m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
   358         __m128 impulseMagnitude = deltaImpulse;
   388 #endif//BT_ALLOW_SSE4   410          return gResolveSingleConstraintRowGeneric_sse2;
   414          return gResolveSingleConstraintRowLowerLimit_sse2;
   419          return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
   423          return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
   425 #endif //BT_ALLOW_SSE4   440         const unsigned long un = 
static_cast<unsigned long>(n);
   445         if (un <= 0x00010000UL) {
   447                 if (un <= 0x00000100UL) {
   449                         if (un <= 0x00000010UL) {
   451                                 if (un <= 0x00000004UL) {
   453                                         if (un <= 0x00000002UL) {
   461         return (
int) (r % un);
   511         btScalar rest = restitution * -rel_vel;
   527                 loc_lateral *= friction_scaling;
   537 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)
   596                 btScalar denom = relaxation/(denom0+denom1);
   609                 rel_vel = vel1Dotn+vel2Dotn;
   613                 btScalar velocityError =  desiredVelocity - rel_vel;
   615                 solverConstraint.
m_rhs = velocityImpulse;
   617                 solverConstraint.
m_cfm = cfmSlip;
   624 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)
   629                                                         colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
   630         return solverConstraint;
   654     solverConstraint.
m_friction = combinedTorsionalFriction;
   690                 rel_vel = vel1Dotn+vel2Dotn;
   696                 solverConstraint.
m_rhs = velocityImpulse;
   697                 solverConstraint.
m_cfm = cfmSlip;
   711 btSolverConstraint&     
btSequentialImpulseConstraintSolver::addTorsionalFrictionConstraint(
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
int frictionIndex,
btManifoldPoint& cp,
btScalar combinedTorsionalFriction, 
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1, 
btScalar relaxation, 
btScalar desiredVelocity, 
btScalar cfmSlip)
   716                                                         colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
   717         return solverConstraint;
   724     int solverBodyId = -1;
   730         if ( solverBodyId < 0 )
   751         const int INVALID_SOLVER_BODY_ID = -1;
   758         if ( solverBodyId == INVALID_SOLVER_BODY_ID )
   781 #else // BT_THREADSAFE   783     int solverBodyIdA = -1;
   814         return solverBodyIdA;
   815 #endif // BT_THREADSAFE   822                                                                                                                                  int solverBodyIdA, 
int solverBodyIdB,
   842                         relaxation = infoGlobal.
m_sor;
   880 #ifdef COMPUTE_IMPULSE_DENOM   897 #endif //COMPUTE_IMPULSE_DENOM   899                                         btScalar denom = relaxation/(denom0+denom1+cfm);
   975                                         btScalar rel_vel = vel1Dotn+vel2Dotn;
   978                                         btScalar        velocityError = restitution - rel_vel;
   986                                                 velocityError -= penetration *invTimeStep;
   989                                                 positionalError = -penetration * erp*invTimeStep;
   999                                                 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
  1005                                                 solverConstraint.
m_rhs = velocityImpulse;
  1021                                                                                                                                                 int solverBodyIdA, 
int solverBodyIdB,
  1088         int rollingFriction=1;
  1112                         rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
  1123                         setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
  1136                                         addTorsionalFrictionConstraint(cp.
m_normalWorldOnB,solverBodyIdA,solverBodyIdB,frictionIndex,cp,cp.
m_combinedSpinningFriction, rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
  1146                                         if (axis0.
length()>0.001)
  1149                                         if (axis1.
length()>0.001)
  1215                                 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.
m_contactMotion1, cp.
m_frictionCFM);
  1218                                         addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.
m_contactMotion2, cp.
m_frictionCFM);
  1237         for (i=0;i<numManifolds;i++)
  1239                 manifold = manifoldPtr[i];
  1252 #ifdef BT_ADDITIONAL_DEBUG  1254         for (
int i=0;i<numConstraints;i++)
  1262                                 for (
int b=0;b<numBodies;b++)
  1276                                 for (
int b=0;b<numBodies;b++)
  1289     for (
int i=0;i<numManifolds;i++)
  1291         if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
  1294             for (
int b=0;b<numBodies;b++)
  1297                 if (manifoldPtr[i]->getBody0()==bodies[b])
  1305         if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
  1308             for (
int b=0;b<numBodies;b++)
  1310                 if (manifoldPtr[i]->getBody1()==bodies[b])
  1319 #endif //BT_ADDITIONAL_DEBUG  1322         for (
int i = 0; i < numBodies; i++)
  1328 #endif // BT_THREADSAFE  1339         for (
int i=0;i<numBodies;i++)
  1372                 for (j=0;j<numConstraints;j++)
  1386                         int totalNumRows = 0;
  1391                         for (i=0;i<numConstraints;i++)
  1403                                 if (constraints[i]->isEnabled())
  1406                                 if (constraints[i]->isEnabled())
  1422                         for (i=0;i<numConstraints;i++)
  1485                                         info2.
cfm = ¤tConstraintRow->
m_cfm;
  1548                                                         rel_vel = vel1Dotn+vel2Dotn;
  1554                                                         solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
  1586                 for (i=0;i<numNonContactPool;i++)
  1590                 for (i=0;i<numConstraintPool;i++)
  1594                 for (i=0;i<numFrictionPool;i++)
  1607         btScalar leastSquaresResidual = 0.f;
  1618                         for (
int j=0; j<numNonContactPool; ++j) {
  1628                                 for (
int j=0; j<numConstraintPool; ++j) {
  1635                                 for (
int j=0; j<numFrictionPool; ++j) {
  1654                                 leastSquaresResidual += residual*residual;
  1660                         for (
int j=0;j<numConstraints;j++)
  1662                                 if (constraints[j]->isEnabled())
  1678                                 for (
int c=0;c<numPoolConstraints;c++)
  1685                                                 leastSquaresResidual += residual*residual;
  1689                                         bool applyFriction = 
true;
  1702                                                                 leastSquaresResidual += residual*residual;
  1717                                                                 leastSquaresResidual += residual*residual;
  1730                                 for (j=0;j<numPoolConstraints;j++)
  1734                                         leastSquaresResidual += residual*residual;
  1742                                 for (j=0;j<numFrictionPoolConstraints;j++)
  1753                                                 leastSquaresResidual += residual*residual;
  1759                                 for (j=0;j<numRollingFrictionPoolConstraints;j++)
  1766                                                 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
  1767                                                 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
  1768                                                         rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
  1770                                                 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
  1771                                                 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
  1774                                                 leastSquaresResidual += residual*residual;
  1791                                 leastSquaresResidual += residual*residual;
  1797                         for (
int j=0;j<numConstraints;j++)
  1799                                 if (constraints[j]->isEnabled())
  1810                         for (
int j=0;j<numPoolConstraints;j++)
  1814                                 leastSquaresResidual += residual*residual;
  1818                         for (
int j=0;j<numFrictionPoolConstraints;j++)
  1829                                         leastSquaresResidual += residual*residual;
  1834                         for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
  1840                                         btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
  1841                                         if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
  1842                                                 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
  1844                                         rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
  1845                                         rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
  1848                                         leastSquaresResidual += residual*residual;
  1853         return leastSquaresResidual;
  1866                                 btScalar leastSquaresResidual =0.f;
  1870                                         for (j=0;j<numPoolConstraints;j++)
  1875                                                 leastSquaresResidual += residual*residual;
  1878                                 if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration>=(infoGlobal.
m_numIterations-1))
  1880 #ifdef VERBOSE_RESIDUAL_PRINTF  1881                                         printf(
"residual = %f at iteration #%d\n",leastSquaresResidual,iteration);
  1891                                 btScalar leastSquaresResidual = 0.f;
  1895                                         for (j=0;j<numPoolConstraints;j++)
  1900                                                 leastSquaresResidual += residual*residual;
  1902                                         if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration>=(infoGlobal.
m_numIterations-1))
  1904 #ifdef VERBOSE_RESIDUAL_PRINTF  1905                                                 printf(
"residual = %f at iteration #%d\n",leastSquaresResidual,iteration);
  1917         BT_PROFILE(
"solveGroupCacheFriendlyIterations");
  1925                 for ( 
int iteration = 0 ; iteration< 
maxIterations ; iteration++)
  1932 #ifdef VERBOSE_RESIDUAL_PRINTF  1950                 for (j=0;j<numPoolConstraints;j++)
  1969         for (j=0;j<numPoolConstraints;j++)
 btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric()
btScalar * m_constraintError
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
btScalar computeImpulseDenominator(const btVector3 &pos, const btVector3 &normal) const
virtual ~btSequentialImpulseConstraintSolver()
const btVector3 & getAngularVelocity() const
virtual void getInfo1(btConstraintInfo1 *info)=0
internal method used by the constraint solver, don't use them directly 
btConstraintArray m_tmpSolverContactFrictionConstraintPool
btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool
const btVector3 & getPositionWorldOnA() const
btScalar m_combinedContactStiffness1
btVector3 m_lateralFrictionDir1
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
const btVector3 & getTotalTorque() const
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const
explicit version is best avoided, it gains energy 
btVector3 m_relpos1CrossNormal
void internalApplyImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, const btScalar impulseMagnitude)
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
btScalar length2() const
Return the length of the vector squared. 
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 
const btRigidBody & getRigidBodyA() const
int getNumContacts() const
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
bool isKinematicObject() const
btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit()
btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric
static btSimdScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
const btVector3 & getLinearFactor() const
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
const btVector3 & internalGetInvMass() const
btSimdScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
const btJointFeedback * getJointFeedback() const
ManifoldContactPoint collects and maintains persistent contactpoints. 
btScalar * m_J1angularAxis
btScalar m_contactMotion1
btAlignedObjectArray< int > m_orderTmpConstraintPool
btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric()
Various implementations of solving a single constraint row using a generic equality constraint...
const btRigidBody & getRigidBodyB() const
btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit()
Various implementations of solving a single constraint row using an inequality (lower limit) constrai...
void initSolverBody(btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep)
btScalar getBreakingImpulseThreshold() const
bool isStaticOrKinematicObject() const
virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
const btVector3 & getAngularFactor() const
btSimdScalar resolveSplitPenetrationSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution)
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. 
btVector3 m_appliedForceBodyB
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
const btManifoldPoint & getContactPoint(int index) const
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)
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const
perform implicit force computation in world space 
void setupTorsionalFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, btScalar combinedTorsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btTransform & getWorldTransform()
btVector3 m_normalWorldOnB
btScalar * m_J1linearAxis
btSimdScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btVector3 m_appliedForceBodyA
const btVector3 & getLinearVelocity() const
void setFrictionConstraintImpulse(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal)
const btVector3 & getAnisotropicFriction() const
const btVector3 & getPositionWorldOnB() const
virtual void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
const btCollisionObject * getBody0() const
btVector3 m_angularFactor
btScalar m_appliedImpulseLateral2
btScalar getInvMass() const
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector. 
btScalar dot(const btVector3 &v) const
Return the dot product. 
btConstraintArray m_tmpSolverContactConstraintPool
btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric()
int getOverrideNumSolverIterations() const
btCollisionObject can be used to manage collision detection objects. 
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations...
The btRigidBody is the main class for rigid body objects. 
btVector3 m_angularComponentB
btScalar getContactProcessingThreshold() const
int m_maxOverrideNumSolverIterations
void setCompanionId(int id)
int getWorldArrayIndex() const
btSimdScalar resolveSingleConstraintRowGenericSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btVector3 can be used to represent 3D points and vectors. 
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const
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 size() const
return the number of elements in the array 
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 getVelocityInLocalPoint(const btVector3 &rel_pos) const
btScalar m_combinedContactDamping1
btVector3 m_appliedTorqueBodyB
btSimdScalar m_appliedPushImpulse
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
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)
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them 
const btCollisionObject * getBody1() const
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)
btScalar m_contactMotion2
btScalar m_combinedFriction
T & expand(const T &fillValue=T())
btVector3 m_appliedTorqueBodyA
btSolverConstraint & addTorsionalFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, btScalar torsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0, btScalar cfmSlip=0.f)
btVector3 & internalGetPushVelocity()
btVector3 m_contactNormal1
btAlignedObjectArray< int > m_orderFrictionConstraintPool
bool hasAnisotropicFriction(int frictionMode=CF_ANISOTROPIC_FRICTION) const
const btVector3 & getTotalForce() 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()
const btMatrix3x3 & getInvInertiaTensorWorld() const
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 resolveSplitPenetrationImpulseCacheFriendly(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
T & expandNonInitializing()
btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
int getCompanionId() const
btScalar getDistance() const
btSequentialImpulseConstraintSolver()
btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const
perform implicit force computation in body space (inertial frame) 
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...
btScalar m_combinedSpinningFriction
btVector3 m_contactNormal2
btScalar length() const
Return the length of the vector. 
btAlignedObjectArray< int > m_kinematicBodyUniqueIdToSolverBodyTable
btScalar btFabs(btScalar x)
btSimdScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
btTransform m_worldTransform
btScalar m_leastSquaresResidual