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);
323 btScalar rest = restitution * -rel_vel;
340 loc_lateral *= friction_scaling;
350 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)
396 btScalar denom = relaxation/(denom0+denom1);
409 rel_vel = vel1Dotn+vel2Dotn;
415 solverConstraint.
m_rhs = velocityImpulse;
416 solverConstraint.
m_cfm = cfmSlip;
423 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)
428 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
429 return solverConstraint;
489 rel_vel = vel1Dotn+vel2Dotn;
495 solverConstraint.
m_rhs = velocityImpulse;
496 solverConstraint.
m_cfm = cfmSlip;
510 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)
515 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
516 return solverConstraint;
523 int solverBodyIdA = -1;
546 return solverBodyIdA;
553 int solverBodyIdA,
int solverBodyIdB,
581 #ifdef COMPUTE_IMPULSE_DENOM
598 #endif //COMPUTE_IMPULSE_DENOM
600 btScalar denom = relaxation/(denom0+denom1);
655 btScalar rel_vel = vel1Dotn+vel2Dotn;
658 btScalar velocityError = restitution - rel_vel;
664 erp = infoGlobal.
m_erp;
671 velocityError -= penetration / infoGlobal.
m_timeStep;
674 positionalError = -penetration * erp/infoGlobal.
m_timeStep;
683 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
689 solverConstraint.
m_rhs = velocityImpulse;
692 solverConstraint.
m_cfm = 0.f;
705 int solverBodyIdA,
int solverBodyIdB,
772 int rollingFriction=1;
795 setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, vel, rel_vel, relaxation, rel_pos1, rel_pos2);
818 if (relAngVel.
length()>0.001)
897 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.
m_contactMotion1, cp.
m_contactCFM1);
900 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.
m_contactMotion2, cp.
m_contactCFM2);
920 #ifdef BT_ADDITIONAL_DEBUG
922 for (
int i=0;i<numConstraints;i++)
930 for (
int b=0;b<numBodies;b++)
944 for (
int b=0;b<numBodies;b++)
957 for (
int i=0;i<numManifolds;i++)
959 if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
962 for (
int b=0;b<numBodies;b++)
965 if (manifoldPtr[i]->getBody0()==bodies[b])
973 if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
976 for (
int b=0;b<numBodies;b++)
978 if (manifoldPtr[i]->getBody1()==bodies[b])
987 #endif //BT_ADDITIONAL_DEBUG
990 for (
int i = 0; i < numBodies; i++)
1004 for (
int i=0;i<numBodies;i++)
1024 for (j=0;j<numConstraints;j++)
1038 int totalNumRows = 0;
1043 for (i=0;i<numConstraints;i++)
1055 if (constraints[i]->isEnabled())
1058 if (constraints[i]->isEnabled())
1074 for (i=0;i<numConstraints;i++)
1137 info2.
cfm = ¤tConstraintRow->
m_cfm;
1192 rel_vel = vel1Dotn+vel2Dotn;
1199 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1215 for (i=0;i<numManifolds;i++)
1217 manifold = manifoldPtr[i];
1240 for (i=0;i<numNonContactPool;i++)
1244 for (i=0;i<numConstraintPool;i++)
1248 for (i=0;i<numFrictionPool;i++)
1271 for (
int j=0; j<numNonContactPool; ++j) {
1281 for (
int j=0; j<numConstraintPool; ++j) {
1288 for (
int j=0; j<numFrictionPool; ++j) {
1310 for (
int j=0;j<numConstraints;j++)
1312 if (constraints[j]->isEnabled())
1328 for (
int c=0;c<numPoolConstraints;c++)
1337 bool applyFriction =
true;
1376 for (j=0;j<numPoolConstraints;j++)
1388 for (j=0;j<numFrictionPoolConstraints;j++)
1404 for (j=0;j<numRollingFrictionPoolConstraints;j++)
1411 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1412 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1413 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1415 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1416 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1438 for (
int j=0;j<numConstraints;j++)
1440 if (constraints[j]->isEnabled())
1451 for (
int j=0;j<numPoolConstraints;j++)
1458 for (
int j=0;j<numFrictionPoolConstraints;j++)
1473 for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
1479 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1480 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1481 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1483 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1484 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1507 for (j=0;j<numPoolConstraints;j++)
1523 for (j=0;j<numPoolConstraints;j++)
1537 BT_PROFILE(
"solveGroupCacheFriendlyIterations");
1545 for (
int iteration = 0 ; iteration<
maxIterations ; iteration++)
1548 solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer,stackAlloc);
1562 for (j=0;j<numPoolConstraints;j++)
1581 for (j=0;j<numPoolConstraints;j++)
1641 solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);