51 #include <emmintrin.h>
52 #define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))
53 static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
55 __m128 result = _mm_mul_ps( vec0, vec1);
56 return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) );
70 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
71 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
74 resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
75 resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
76 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
77 deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
78 c.
m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
79 __m128 upperMinApplied = _mm_sub_ps(upperLimit1,cpAppliedImp);
80 deltaImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied) );
84 __m128 impulseMagnitude = deltaImpulse;
134 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
135 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
138 resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
139 resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
140 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
141 deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
142 c.
m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
145 __m128 impulseMagnitude = deltaImpulse;
222 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
223 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
226 resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
227 resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
228 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
229 deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
230 c.
m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
233 __m128 impulseMagnitude = deltaImpulse;
257 const unsigned long un =
static_cast<unsigned long>(n);
262 if (un <= 0x00010000UL) {
264 if (un <= 0x00000100UL) {
266 if (un <= 0x00000010UL) {
268 if (un <= 0x00000004UL) {
270 if (un <= 0x00000002UL) {
278 return (
int) (r % un);
328 btScalar rest = restitution * -rel_vel;
344 loc_lateral *= friction_scaling;
354 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)
413 btScalar denom = relaxation/(denom0+denom1);
426 rel_vel = vel1Dotn+vel2Dotn;
432 solverConstraint.
m_rhs = velocityImpulse;
433 solverConstraint.
m_cfm = cfmSlip;
440 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)
445 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
446 return solverConstraint;
506 rel_vel = vel1Dotn+vel2Dotn;
512 solverConstraint.
m_rhs = velocityImpulse;
513 solverConstraint.
m_cfm = cfmSlip;
527 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)
532 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
533 return solverConstraint;
540 int solverBodyIdA = -1;
571 return solverBodyIdA;
578 int solverBodyIdA,
int solverBodyIdB,
606 #ifdef COMPUTE_IMPULSE_DENOM
623 #endif //COMPUTE_IMPULSE_DENOM
625 btScalar denom = relaxation/(denom0+denom1);
701 btScalar rel_vel = vel1Dotn+vel2Dotn;
704 btScalar velocityError = restitution - rel_vel;
710 erp = infoGlobal.
m_erp;
717 velocityError -= penetration / infoGlobal.
m_timeStep;
720 positionalError = -penetration * erp/infoGlobal.
m_timeStep;
729 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
735 solverConstraint.
m_rhs = velocityImpulse;
738 solverConstraint.
m_cfm = 0.f;
751 int solverBodyIdA,
int solverBodyIdB,
818 int rollingFriction=1;
844 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
855 setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
882 if (relAngVel.
length()>0.001)
961 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.
m_contactMotion1, cp.
m_contactCFM1);
964 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.
m_contactMotion2, cp.
m_contactCFM2);
983 for (i=0;i<numManifolds;i++)
985 manifold = manifoldPtr[i];
998 #ifdef BT_ADDITIONAL_DEBUG
1000 for (
int i=0;i<numConstraints;i++)
1008 for (
int b=0;b<numBodies;b++)
1022 for (
int b=0;b<numBodies;b++)
1035 for (
int i=0;i<numManifolds;i++)
1037 if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
1040 for (
int b=0;b<numBodies;b++)
1043 if (manifoldPtr[i]->getBody0()==bodies[b])
1051 if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
1054 for (
int b=0;b<numBodies;b++)
1056 if (manifoldPtr[i]->getBody1()==bodies[b])
1065 #endif //BT_ADDITIONAL_DEBUG
1068 for (
int i = 0; i < numBodies; i++)
1082 for (
int i=0;i<numBodies;i++)
1102 for (j=0;j<numConstraints;j++)
1116 int totalNumRows = 0;
1121 for (i=0;i<numConstraints;i++)
1133 if (constraints[i]->isEnabled())
1136 if (constraints[i]->isEnabled())
1152 for (i=0;i<numConstraints;i++)
1215 info2.
cfm = ¤tConstraintRow->
m_cfm;
1278 rel_vel = vel1Dotn+vel2Dotn;
1284 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1316 for (i=0;i<numNonContactPool;i++)
1320 for (i=0;i<numConstraintPool;i++)
1324 for (i=0;i<numFrictionPool;i++)
1347 for (
int j=0; j<numNonContactPool; ++j) {
1357 for (
int j=0; j<numConstraintPool; ++j) {
1364 for (
int j=0; j<numFrictionPool; ++j) {
1386 for (
int j=0;j<numConstraints;j++)
1388 if (constraints[j]->isEnabled())
1404 for (
int c=0;c<numPoolConstraints;c++)
1413 bool applyFriction =
true;
1452 for (j=0;j<numPoolConstraints;j++)
1465 for (j=0;j<numFrictionPoolConstraints;j++)
1482 for (j=0;j<numRollingFrictionPoolConstraints;j++)
1489 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1490 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1491 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1493 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1494 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1516 for (
int j=0;j<numConstraints;j++)
1518 if (constraints[j]->isEnabled())
1529 for (
int j=0;j<numPoolConstraints;j++)
1536 for (
int j=0;j<numFrictionPoolConstraints;j++)
1551 for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
1557 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1558 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1559 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1561 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1562 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1585 for (j=0;j<numPoolConstraints;j++)
1601 for (j=0;j<numPoolConstraints;j++)
1615 BT_PROFILE(
"solveGroupCacheFriendlyIterations");
1623 for (
int iteration = 0 ; iteration<
maxIterations ; iteration++)
1626 solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
1640 for (j=0;j<numPoolConstraints;j++)
1659 for (j=0;j<numPoolConstraints;j++)