|
@@ -14,6 +14,8 @@ subject to the following restrictions:
|
|
*/
|
|
*/
|
|
|
|
|
|
//#define COMPUTE_IMPULSE_DENOM 1
|
|
//#define COMPUTE_IMPULSE_DENOM 1
|
|
|
|
+//#define BT_ADDITIONAL_DEBUG
|
|
|
|
+
|
|
//It is not necessary (redundant) to refresh contact manifolds, this refresh has been moved to the collision algorithms.
|
|
//It is not necessary (redundant) to refresh contact manifolds, this refresh has been moved to the collision algorithms.
|
|
|
|
|
|
#include "btSequentialImpulseConstraintSolver.h"
|
|
#include "btSequentialImpulseConstraintSolver.h"
|
|
@@ -63,8 +65,8 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
|
|
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
|
|
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
|
|
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
|
|
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
|
|
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
|
|
- __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
|
|
|
|
- __m128 deltaVel2Dotn = _mm_sub_ps(btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128),btSimdDot3((c.m_contactNormal).mVec128,body2.internalGetDeltaLinearVelocity().mVec128));
|
|
|
|
|
|
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
|
|
|
|
+ __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128,body2.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
|
|
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
|
|
@@ -77,12 +79,12 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
__m128 upperMinApplied = _mm_sub_ps(upperLimit1,cpAppliedImp);
|
|
__m128 upperMinApplied = _mm_sub_ps(upperLimit1,cpAppliedImp);
|
|
deltaImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied) );
|
|
deltaImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied) );
|
|
c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1) );
|
|
c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1) );
|
|
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
|
|
|
|
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
|
|
|
|
|
|
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128,body1.internalGetInvMass().mVec128);
|
|
|
|
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal2).mVec128,body2.internalGetInvMass().mVec128);
|
|
__m128 impulseMagnitude = deltaImpulse;
|
|
__m128 impulseMagnitude = deltaImpulse;
|
|
body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
|
|
body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
|
|
body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
|
|
body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
|
|
- body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
|
|
|
|
|
|
+ body2.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
|
|
body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
|
|
body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
|
|
#else
|
|
#else
|
|
resolveSingleConstraintRowGeneric(body1,body2,c);
|
|
resolveSingleConstraintRowGeneric(body1,body2,c);
|
|
@@ -93,8 +95,8 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
|
|
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
|
|
{
|
|
{
|
|
btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm;
|
|
btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm;
|
|
- const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
|
|
|
|
- const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
|
|
|
|
|
|
+ const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
|
|
|
|
+ const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
|
|
|
|
|
|
// const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
|
|
// const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
|
|
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
|
|
@@ -116,8 +118,8 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
c.m_appliedImpulse = sum;
|
|
c.m_appliedImpulse = sum;
|
|
}
|
|
}
|
|
|
|
|
|
- body1.internalApplyImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
|
|
|
|
- body2.internalApplyImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
|
|
|
|
|
|
+ body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
|
|
|
|
+ body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
|
|
}
|
|
}
|
|
|
|
|
|
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
|
|
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
|
|
@@ -127,8 +129,8 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
|
|
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
|
|
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
|
|
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
|
|
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
|
|
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
|
|
- __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
|
|
|
|
- __m128 deltaVel2Dotn = _mm_sub_ps(btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128),btSimdDot3((c.m_contactNormal).mVec128,body2.internalGetDeltaLinearVelocity().mVec128));
|
|
|
|
|
|
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
|
|
|
|
+ __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128,body2.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
|
|
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
|
|
@@ -138,24 +140,24 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
__m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
|
|
__m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
|
|
deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
|
|
deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
|
|
c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
|
|
c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
|
|
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
|
|
|
|
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
|
|
|
|
|
|
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128,body1.internalGetInvMass().mVec128);
|
|
|
|
+ __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128,body2.internalGetInvMass().mVec128);
|
|
__m128 impulseMagnitude = deltaImpulse;
|
|
__m128 impulseMagnitude = deltaImpulse;
|
|
body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
|
|
body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
|
|
body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
|
|
body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
|
|
- body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
|
|
|
|
|
|
+ body2.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
|
|
body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
|
|
body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
|
|
#else
|
|
#else
|
|
resolveSingleConstraintRowLowerLimit(body1,body2,c);
|
|
resolveSingleConstraintRowLowerLimit(body1,body2,c);
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-// Project Gauss Seidel or the equivalent Sequential Impulse
|
|
|
|
|
|
+// Projected Gauss Seidel or the equivalent Sequential Impulse
|
|
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
|
|
void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
|
|
{
|
|
{
|
|
btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm;
|
|
btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm;
|
|
- const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
|
|
|
|
- const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
|
|
|
|
|
|
+ const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
|
|
|
|
+ const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
|
|
|
|
|
|
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
|
|
@@ -169,8 +171,8 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
|
|
{
|
|
{
|
|
c.m_appliedImpulse = sum;
|
|
c.m_appliedImpulse = sum;
|
|
}
|
|
}
|
|
- body1.internalApplyImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
|
|
|
|
- body2.internalApplyImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
|
|
|
|
|
|
+ body1.internalApplyImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
|
|
|
|
+ body2.internalApplyImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -183,8 +185,8 @@ void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFri
|
|
{
|
|
{
|
|
gNumSplitImpulseRecoveries++;
|
|
gNumSplitImpulseRecoveries++;
|
|
btScalar deltaImpulse = c.m_rhsPenetration-btScalar(c.m_appliedPushImpulse)*c.m_cfm;
|
|
btScalar deltaImpulse = c.m_rhsPenetration-btScalar(c.m_appliedPushImpulse)*c.m_cfm;
|
|
- const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetTurnVelocity());
|
|
|
|
- const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetTurnVelocity());
|
|
|
|
|
|
+ const btScalar deltaVel1Dotn = c.m_contactNormal1.dot(body1.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetTurnVelocity());
|
|
|
|
+ const btScalar deltaVel2Dotn = c.m_contactNormal2.dot(body2.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetTurnVelocity());
|
|
|
|
|
|
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
|
|
deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
|
|
@@ -198,8 +200,8 @@ void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFri
|
|
{
|
|
{
|
|
c.m_appliedPushImpulse = sum;
|
|
c.m_appliedPushImpulse = sum;
|
|
}
|
|
}
|
|
- body1.internalApplyPushImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
|
|
|
|
- body2.internalApplyPushImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
|
|
|
|
|
|
+ body1.internalApplyPushImpulse(c.m_contactNormal1*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
|
|
|
|
+ body2.internalApplyPushImpulse(c.m_contactNormal2*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -215,8 +217,8 @@ void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFri
|
|
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
|
|
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
|
|
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
|
|
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
|
|
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse),_mm_set1_ps(c.m_cfm)));
|
|
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse),_mm_set1_ps(c.m_cfm)));
|
|
- __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal.mVec128,body1.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetTurnVelocity().mVec128));
|
|
|
|
- __m128 deltaVel2Dotn = _mm_sub_ps(btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetTurnVelocity().mVec128),btSimdDot3((c.m_contactNormal).mVec128,body2.internalGetPushVelocity().mVec128));
|
|
|
|
|
|
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal1.mVec128,body1.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetTurnVelocity().mVec128));
|
|
|
|
+ __m128 deltaVel2Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal2.mVec128,body2.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetTurnVelocity().mVec128));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
|
|
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
|
|
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
|
|
@@ -226,12 +228,12 @@ void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFri
|
|
__m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
|
|
__m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
|
|
deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
|
|
deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
|
|
c.m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
|
|
c.m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
|
|
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
|
|
|
|
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
|
|
|
|
|
|
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal1.mVec128,body1.internalGetInvMass().mVec128);
|
|
|
|
+ __m128 linearComponentB = _mm_mul_ps(c.m_contactNormal2.mVec128,body2.internalGetInvMass().mVec128);
|
|
__m128 impulseMagnitude = deltaImpulse;
|
|
__m128 impulseMagnitude = deltaImpulse;
|
|
body1.internalGetPushVelocity().mVec128 = _mm_add_ps(body1.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
|
|
body1.internalGetPushVelocity().mVec128 = _mm_add_ps(body1.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
|
|
body1.internalGetTurnVelocity().mVec128 = _mm_add_ps(body1.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
|
|
body1.internalGetTurnVelocity().mVec128 = _mm_add_ps(body1.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
|
|
- body2.internalGetPushVelocity().mVec128 = _mm_sub_ps(body2.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
|
|
|
|
|
|
+ body2.internalGetPushVelocity().mVec128 = _mm_add_ps(body2.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
|
|
body2.internalGetTurnVelocity().mVec128 = _mm_add_ps(body2.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
|
|
body2.internalGetTurnVelocity().mVec128 = _mm_add_ps(body2.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
|
|
#else
|
|
#else
|
|
resolveSplitPenetrationImpulseCacheFriendly(body1,body2,c);
|
|
resolveSplitPenetrationImpulseCacheFriendly(body1,body2,c);
|
|
@@ -278,7 +280,7 @@ int btSequentialImpulseConstraintSolver::btRandInt2 (int n)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject)
|
|
|
|
|
|
+void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject, btScalar timeStep)
|
|
{
|
|
{
|
|
|
|
|
|
btRigidBody* rb = collisionObject? btRigidBody::upcast(collisionObject) : 0;
|
|
btRigidBody* rb = collisionObject? btRigidBody::upcast(collisionObject) : 0;
|
|
@@ -297,6 +299,9 @@ void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBod
|
|
solverBody->m_linearFactor = rb->getLinearFactor();
|
|
solverBody->m_linearFactor = rb->getLinearFactor();
|
|
solverBody->m_linearVelocity = rb->getLinearVelocity();
|
|
solverBody->m_linearVelocity = rb->getLinearVelocity();
|
|
solverBody->m_angularVelocity = rb->getAngularVelocity();
|
|
solverBody->m_angularVelocity = rb->getAngularVelocity();
|
|
|
|
+ solverBody->m_externalForceImpulse = rb->getTotalForce()*rb->getInvMass()*timeStep;
|
|
|
|
+ solverBody->m_externalTorqueImpulse = rb->getTotalTorque()*rb->getInvInertiaTensorWorld()*timeStep ;
|
|
|
|
+
|
|
} else
|
|
} else
|
|
{
|
|
{
|
|
solverBody->m_worldTransform.setIdentity();
|
|
solverBody->m_worldTransform.setIdentity();
|
|
@@ -306,6 +311,8 @@ void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBod
|
|
solverBody->m_linearFactor.setValue(1,1,1);
|
|
solverBody->m_linearFactor.setValue(1,1,1);
|
|
solverBody->m_linearVelocity.setValue(0,0,0);
|
|
solverBody->m_linearVelocity.setValue(0,0,0);
|
|
solverBody->m_angularVelocity.setValue(0,0,0);
|
|
solverBody->m_angularVelocity.setValue(0,0,0);
|
|
|
|
+ solverBody->m_externalForceImpulse.setValue(0,0,0);
|
|
|
|
+ solverBody->m_externalTorqueImpulse.setValue(0,0,0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -324,8 +331,7 @@ btScalar btSequentialImpulseConstraintSolver::restitutionCurve(btScalar rel_vel,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-static void applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirection, int frictionMode);
|
|
|
|
-static void applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirection, int frictionMode)
|
|
|
|
|
|
+void btSequentialImpulseConstraintSolver::applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirection, int frictionMode)
|
|
{
|
|
{
|
|
|
|
|
|
|
|
|
|
@@ -349,7 +355,6 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
|
|
{
|
|
{
|
|
|
|
|
|
|
|
|
|
- solverConstraint.m_contactNormal = normalAxis;
|
|
|
|
btSolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
|
|
btSolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
|
|
btSolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB];
|
|
btSolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB];
|
|
|
|
|
|
@@ -365,15 +370,30 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
|
|
solverConstraint.m_appliedImpulse = 0.f;
|
|
solverConstraint.m_appliedImpulse = 0.f;
|
|
solverConstraint.m_appliedPushImpulse = 0.f;
|
|
solverConstraint.m_appliedPushImpulse = 0.f;
|
|
|
|
|
|
|
|
+ if (body0)
|
|
{
|
|
{
|
|
- btVector3 ftorqueAxis1 = rel_pos1.cross(solverConstraint.m_contactNormal);
|
|
|
|
|
|
+ solverConstraint.m_contactNormal1 = normalAxis;
|
|
|
|
+ btVector3 ftorqueAxis1 = rel_pos1.cross(solverConstraint.m_contactNormal1);
|
|
solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
|
|
solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
|
|
- solverConstraint.m_angularComponentA = body0 ? body0->getInvInertiaTensorWorld()*ftorqueAxis1*body0->getAngularFactor() : btVector3(0,0,0);
|
|
|
|
|
|
+ solverConstraint.m_angularComponentA = body0->getInvInertiaTensorWorld()*ftorqueAxis1*body0->getAngularFactor();
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ solverConstraint.m_contactNormal1.setZero();
|
|
|
|
+ solverConstraint.m_relpos1CrossNormal.setZero();
|
|
|
|
+ solverConstraint.m_angularComponentA .setZero();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (body1)
|
|
{
|
|
{
|
|
- btVector3 ftorqueAxis1 = rel_pos2.cross(-solverConstraint.m_contactNormal);
|
|
|
|
|
|
+ solverConstraint.m_contactNormal2 = -normalAxis;
|
|
|
|
+ btVector3 ftorqueAxis1 = rel_pos2.cross(solverConstraint.m_contactNormal2);
|
|
solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
|
|
solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
|
|
- solverConstraint.m_angularComponentB = body1 ? body1->getInvInertiaTensorWorld()*ftorqueAxis1*body1->getAngularFactor() : btVector3(0,0,0);
|
|
|
|
|
|
+ solverConstraint.m_angularComponentB = body1->getInvInertiaTensorWorld()*ftorqueAxis1*body1->getAngularFactor();
|
|
|
|
+ } else
|
|
|
|
+ {
|
|
|
|
+ solverConstraint.m_contactNormal2.setZero();
|
|
|
|
+ solverConstraint.m_relpos2CrossNormal.setZero();
|
|
|
|
+ solverConstraint.m_angularComponentB.setZero();
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
{
|
|
@@ -398,9 +418,9 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
|
|
|
|
|
|
|
|
|
|
btScalar rel_vel;
|
|
btScalar rel_vel;
|
|
- btScalar vel1Dotn = solverConstraint.m_contactNormal.dot(body0?solverBodyA.m_linearVelocity:btVector3(0,0,0))
|
|
|
|
|
|
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0))
|
|
+ solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0));
|
|
+ solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0));
|
|
- btScalar vel2Dotn = -solverConstraint.m_contactNormal.dot(body1?solverBodyB.m_linearVelocity:btVector3(0,0,0))
|
|
|
|
|
|
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(body1?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0))
|
|
+ solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:btVector3(0,0,0));
|
|
+ solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:btVector3(0,0,0));
|
|
|
|
|
|
rel_vel = vel1Dotn+vel2Dotn;
|
|
rel_vel = vel1Dotn+vel2Dotn;
|
|
@@ -411,8 +431,8 @@ void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstr
|
|
btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
|
|
btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
|
|
solverConstraint.m_rhs = velocityImpulse;
|
|
solverConstraint.m_rhs = velocityImpulse;
|
|
solverConstraint.m_cfm = cfmSlip;
|
|
solverConstraint.m_cfm = cfmSlip;
|
|
- solverConstraint.m_lowerLimit = 0;
|
|
|
|
- solverConstraint.m_upperLimit = 1e10f;
|
|
|
|
|
|
+ solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
|
|
|
|
+ solverConstraint.m_upperLimit = solverConstraint.m_friction;
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -436,7 +456,8 @@ void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint( btSolv
|
|
btVector3 normalAxis(0,0,0);
|
|
btVector3 normalAxis(0,0,0);
|
|
|
|
|
|
|
|
|
|
- solverConstraint.m_contactNormal = normalAxis;
|
|
|
|
|
|
+ solverConstraint.m_contactNormal1 = normalAxis;
|
|
|
|
+ solverConstraint.m_contactNormal2 = -normalAxis;
|
|
btSolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
|
|
btSolverBody& solverBodyA = m_tmpSolverBodyPool[solverBodyIdA];
|
|
btSolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB];
|
|
btSolverBody& solverBodyB = m_tmpSolverBodyPool[solverBodyIdB];
|
|
|
|
|
|
@@ -477,9 +498,9 @@ void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint( btSolv
|
|
|
|
|
|
|
|
|
|
btScalar rel_vel;
|
|
btScalar rel_vel;
|
|
- btScalar vel1Dotn = solverConstraint.m_contactNormal.dot(body0?solverBodyA.m_linearVelocity:btVector3(0,0,0))
|
|
|
|
|
|
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(body0?solverBodyA.m_linearVelocity+solverBodyA.m_externalForceImpulse:btVector3(0,0,0))
|
|
+ solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0));
|
|
+ solverConstraint.m_relpos1CrossNormal.dot(body0?solverBodyA.m_angularVelocity:btVector3(0,0,0));
|
|
- btScalar vel2Dotn = -solverConstraint.m_contactNormal.dot(body1?solverBodyB.m_linearVelocity:btVector3(0,0,0))
|
|
|
|
|
|
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(body1?solverBodyB.m_linearVelocity+solverBodyB.m_externalForceImpulse:btVector3(0,0,0))
|
|
+ solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:btVector3(0,0,0));
|
|
+ solverConstraint.m_relpos2CrossNormal.dot(body1?solverBodyB.m_angularVelocity:btVector3(0,0,0));
|
|
|
|
|
|
rel_vel = vel1Dotn+vel2Dotn;
|
|
rel_vel = vel1Dotn+vel2Dotn;
|
|
@@ -490,8 +511,8 @@ void btSequentialImpulseConstraintSolver::setupRollingFrictionConstraint( btSolv
|
|
btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
|
|
btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
|
|
solverConstraint.m_rhs = velocityImpulse;
|
|
solverConstraint.m_rhs = velocityImpulse;
|
|
solverConstraint.m_cfm = cfmSlip;
|
|
solverConstraint.m_cfm = cfmSlip;
|
|
- solverConstraint.m_lowerLimit = 0;
|
|
|
|
- solverConstraint.m_upperLimit = 1e10f;
|
|
|
|
|
|
+ solverConstraint.m_lowerLimit = -solverConstraint.m_friction;
|
|
|
|
+ solverConstraint.m_upperLimit = solverConstraint.m_friction;
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -513,7 +534,7 @@ btSolverConstraint& btSequentialImpulseConstraintSolver::addRollingFrictionConst
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body)
|
|
|
|
|
|
+int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body,btScalar timeStep)
|
|
{
|
|
{
|
|
|
|
|
|
int solverBodyIdA = -1;
|
|
int solverBodyIdA = -1;
|
|
@@ -531,11 +552,19 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject&
|
|
{
|
|
{
|
|
solverBodyIdA = m_tmpSolverBodyPool.size();
|
|
solverBodyIdA = m_tmpSolverBodyPool.size();
|
|
btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
|
|
btSolverBody& solverBody = m_tmpSolverBodyPool.expand();
|
|
- initSolverBody(&solverBody,&body);
|
|
|
|
|
|
+ initSolverBody(&solverBody,&body,timeStep);
|
|
body.setCompanionId(solverBodyIdA);
|
|
body.setCompanionId(solverBodyIdA);
|
|
} else
|
|
} else
|
|
{
|
|
{
|
|
- return 0;//assume first one is a fixed solver body
|
|
|
|
|
|
+
|
|
|
|
+ if (m_fixedBodyId<0)
|
|
|
|
+ {
|
|
|
|
+ m_fixedBodyId = m_tmpSolverBodyPool.size();
|
|
|
|
+ btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
|
|
|
|
+ initSolverBody(&fixedBody,0,timeStep);
|
|
|
|
+ }
|
|
|
|
+ return m_fixedBodyId;
|
|
|
|
+// return 0;//assume first one is a fixed solver body
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -548,8 +577,8 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject&
|
|
void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstraint& solverConstraint,
|
|
void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstraint& solverConstraint,
|
|
int solverBodyIdA, int solverBodyIdB,
|
|
int solverBodyIdA, int solverBodyIdB,
|
|
btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
|
|
btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
|
|
- btVector3& vel, btScalar& rel_vel, btScalar& relaxation,
|
|
|
|
- btVector3& rel_pos1, btVector3& rel_pos2)
|
|
|
|
|
|
+ btScalar& relaxation,
|
|
|
|
+ const btVector3& rel_pos1, const btVector3& rel_pos2)
|
|
{
|
|
{
|
|
|
|
|
|
const btVector3& pos1 = cp.getPositionWorldOnA();
|
|
const btVector3& pos1 = cp.getPositionWorldOnA();
|
|
@@ -563,8 +592,8 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra
|
|
|
|
|
|
// btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
|
|
// btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
|
|
// btVector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
|
|
// btVector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
|
|
- rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
|
|
|
|
- rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
|
|
|
|
|
|
+ //rel_pos1 = pos1 - bodyA->getWorldTransform().getOrigin();
|
|
|
|
+ //rel_pos2 = pos2 - bodyB->getWorldTransform().getOrigin();
|
|
|
|
|
|
relaxation = 1.f;
|
|
relaxation = 1.f;
|
|
|
|
|
|
@@ -597,9 +626,24 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra
|
|
solverConstraint.m_jacDiagABInv = denom;
|
|
solverConstraint.m_jacDiagABInv = denom;
|
|
}
|
|
}
|
|
|
|
|
|
- solverConstraint.m_contactNormal = cp.m_normalWorldOnB;
|
|
|
|
- solverConstraint.m_relpos1CrossNormal = torqueAxis0;
|
|
|
|
- solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
|
|
|
|
|
|
+ if (rb0)
|
|
|
|
+ {
|
|
|
|
+ solverConstraint.m_contactNormal1 = cp.m_normalWorldOnB;
|
|
|
|
+ solverConstraint.m_relpos1CrossNormal = torqueAxis0;
|
|
|
|
+ } else
|
|
|
|
+ {
|
|
|
|
+ solverConstraint.m_contactNormal1.setZero();
|
|
|
|
+ solverConstraint.m_relpos1CrossNormal.setZero();
|
|
|
|
+ }
|
|
|
|
+ if (rb1)
|
|
|
|
+ {
|
|
|
|
+ solverConstraint.m_contactNormal2 = -cp.m_normalWorldOnB;
|
|
|
|
+ solverConstraint.m_relpos2CrossNormal = -torqueAxis1;
|
|
|
|
+ }else
|
|
|
|
+ {
|
|
|
|
+ solverConstraint.m_contactNormal2.setZero();
|
|
|
|
+ solverConstraint.m_relpos2CrossNormal.setZero();
|
|
|
|
+ }
|
|
|
|
|
|
btScalar restitution = 0.f;
|
|
btScalar restitution = 0.f;
|
|
btScalar penetration = cp.getDistance()+infoGlobal.m_linearSlop;
|
|
btScalar penetration = cp.getDistance()+infoGlobal.m_linearSlop;
|
|
@@ -611,8 +655,8 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra
|
|
vel2 = rb1? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
|
|
vel2 = rb1? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
|
|
|
|
|
|
// btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
|
|
// btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
|
|
- vel = vel1 - vel2;
|
|
|
|
- rel_vel = cp.m_normalWorldOnB.dot(vel);
|
|
|
|
|
|
+ btVector3 vel = vel1 - vel2;
|
|
|
|
+ btScalar rel_vel = cp.m_normalWorldOnB.dot(vel);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -632,9 +676,9 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra
|
|
{
|
|
{
|
|
solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
|
|
solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
|
|
if (rb0)
|
|
if (rb0)
|
|
- bodyA->internalApplyImpulse(solverConstraint.m_contactNormal*bodyA->internalGetInvMass()*rb0->getLinearFactor(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
|
|
|
|
|
|
+ bodyA->internalApplyImpulse(solverConstraint.m_contactNormal1*bodyA->internalGetInvMass()*rb0->getLinearFactor(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
|
|
if (rb1)
|
|
if (rb1)
|
|
- bodyB->internalApplyImpulse(solverConstraint.m_contactNormal*bodyB->internalGetInvMass()*rb1->getLinearFactor(),-solverConstraint.m_angularComponentB,-(btScalar)solverConstraint.m_appliedImpulse);
|
|
|
|
|
|
+ bodyB->internalApplyImpulse(-solverConstraint.m_contactNormal2*bodyB->internalGetInvMass()*rb1->getLinearFactor(),-solverConstraint.m_angularComponentB,-(btScalar)solverConstraint.m_appliedImpulse);
|
|
} else
|
|
} else
|
|
{
|
|
{
|
|
solverConstraint.m_appliedImpulse = 0.f;
|
|
solverConstraint.m_appliedImpulse = 0.f;
|
|
@@ -643,10 +687,17 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra
|
|
solverConstraint.m_appliedPushImpulse = 0.f;
|
|
solverConstraint.m_appliedPushImpulse = 0.f;
|
|
|
|
|
|
{
|
|
{
|
|
- btScalar vel1Dotn = solverConstraint.m_contactNormal.dot(rb0?bodyA->m_linearVelocity:btVector3(0,0,0))
|
|
|
|
- + solverConstraint.m_relpos1CrossNormal.dot(rb0?bodyA->m_angularVelocity:btVector3(0,0,0));
|
|
|
|
- btScalar vel2Dotn = -solverConstraint.m_contactNormal.dot(rb1?bodyB->m_linearVelocity:btVector3(0,0,0))
|
|
|
|
- + solverConstraint.m_relpos2CrossNormal.dot(rb1?bodyB->m_angularVelocity:btVector3(0,0,0));
|
|
|
|
|
|
+
|
|
|
|
+ btVector3 externalForceImpulseA = bodyA->m_originalBody ? bodyA->m_externalForceImpulse: btVector3(0,0,0);
|
|
|
|
+ btVector3 externalTorqueImpulseA = bodyA->m_originalBody ? bodyA->m_externalTorqueImpulse: btVector3(0,0,0);
|
|
|
|
+ btVector3 externalForceImpulseB = bodyB->m_originalBody ? bodyB->m_externalForceImpulse: btVector3(0,0,0);
|
|
|
|
+ btVector3 externalTorqueImpulseB = bodyB->m_originalBody ?bodyB->m_externalTorqueImpulse : btVector3(0,0,0);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(bodyA->m_linearVelocity+externalForceImpulseA)
|
|
|
|
+ + solverConstraint.m_relpos1CrossNormal.dot(bodyA->m_angularVelocity+externalTorqueImpulseA);
|
|
|
|
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(bodyB->m_linearVelocity+externalForceImpulseB)
|
|
|
|
+ + solverConstraint.m_relpos2CrossNormal.dot(bodyB->m_angularVelocity+externalTorqueImpulseB);
|
|
btScalar rel_vel = vel1Dotn+vel2Dotn;
|
|
btScalar rel_vel = vel1Dotn+vel2Dotn;
|
|
|
|
|
|
btScalar positionalError = 0.f;
|
|
btScalar positionalError = 0.f;
|
|
@@ -675,7 +726,7 @@ void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstra
|
|
if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
|
|
if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
|
|
{
|
|
{
|
|
//combine position and velocity into rhs
|
|
//combine position and velocity into rhs
|
|
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
|
|
|
|
|
|
+ solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;//-solverConstraint.m_contactNormal1.dot(bodyA->m_externalForce*bodyA->m_invMass-bodyB->m_externalForce/bodyB->m_invMass)*solverConstraint.m_jacDiagABInv;
|
|
solverConstraint.m_rhsPenetration = 0.f;
|
|
solverConstraint.m_rhsPenetration = 0.f;
|
|
|
|
|
|
} else
|
|
} else
|
|
@@ -713,9 +764,9 @@ void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolver
|
|
{
|
|
{
|
|
frictionConstraint1.m_appliedImpulse = cp.m_appliedImpulseLateral1 * infoGlobal.m_warmstartingFactor;
|
|
frictionConstraint1.m_appliedImpulse = cp.m_appliedImpulseLateral1 * infoGlobal.m_warmstartingFactor;
|
|
if (rb0)
|
|
if (rb0)
|
|
- bodyA->internalApplyImpulse(frictionConstraint1.m_contactNormal*rb0->getInvMass()*rb0->getLinearFactor(),frictionConstraint1.m_angularComponentA,frictionConstraint1.m_appliedImpulse);
|
|
|
|
|
|
+ bodyA->internalApplyImpulse(frictionConstraint1.m_contactNormal1*rb0->getInvMass()*rb0->getLinearFactor(),frictionConstraint1.m_angularComponentA,frictionConstraint1.m_appliedImpulse);
|
|
if (rb1)
|
|
if (rb1)
|
|
- bodyB->internalApplyImpulse(frictionConstraint1.m_contactNormal*rb1->getInvMass()*rb1->getLinearFactor(),-frictionConstraint1.m_angularComponentB,-(btScalar)frictionConstraint1.m_appliedImpulse);
|
|
|
|
|
|
+ bodyB->internalApplyImpulse(-frictionConstraint1.m_contactNormal2*rb1->getInvMass()*rb1->getLinearFactor(),-frictionConstraint1.m_angularComponentB,-(btScalar)frictionConstraint1.m_appliedImpulse);
|
|
} else
|
|
} else
|
|
{
|
|
{
|
|
frictionConstraint1.m_appliedImpulse = 0.f;
|
|
frictionConstraint1.m_appliedImpulse = 0.f;
|
|
@@ -729,9 +780,9 @@ void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolver
|
|
{
|
|
{
|
|
frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
|
|
frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
|
|
if (rb0)
|
|
if (rb0)
|
|
- bodyA->internalApplyImpulse(frictionConstraint2.m_contactNormal*rb0->getInvMass(),frictionConstraint2.m_angularComponentA,frictionConstraint2.m_appliedImpulse);
|
|
|
|
|
|
+ bodyA->internalApplyImpulse(frictionConstraint2.m_contactNormal1*rb0->getInvMass(),frictionConstraint2.m_angularComponentA,frictionConstraint2.m_appliedImpulse);
|
|
if (rb1)
|
|
if (rb1)
|
|
- bodyB->internalApplyImpulse(frictionConstraint2.m_contactNormal*rb1->getInvMass(),-frictionConstraint2.m_angularComponentB,-(btScalar)frictionConstraint2.m_appliedImpulse);
|
|
|
|
|
|
+ bodyB->internalApplyImpulse(-frictionConstraint2.m_contactNormal2*rb1->getInvMass(),-frictionConstraint2.m_angularComponentB,-(btScalar)frictionConstraint2.m_appliedImpulse);
|
|
} else
|
|
} else
|
|
{
|
|
{
|
|
frictionConstraint2.m_appliedImpulse = 0.f;
|
|
frictionConstraint2.m_appliedImpulse = 0.f;
|
|
@@ -749,8 +800,8 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
colObj0 = (btCollisionObject*)manifold->getBody0();
|
|
colObj0 = (btCollisionObject*)manifold->getBody0();
|
|
colObj1 = (btCollisionObject*)manifold->getBody1();
|
|
colObj1 = (btCollisionObject*)manifold->getBody1();
|
|
|
|
|
|
- int solverBodyIdA = getOrInitSolverBody(*colObj0);
|
|
|
|
- int solverBodyIdB = getOrInitSolverBody(*colObj1);
|
|
|
|
|
|
+ int solverBodyIdA = getOrInitSolverBody(*colObj0,infoGlobal.m_timeStep);
|
|
|
|
+ int solverBodyIdB = getOrInitSolverBody(*colObj1,infoGlobal.m_timeStep);
|
|
|
|
|
|
// btRigidBody* bodyA = btRigidBody::upcast(colObj0);
|
|
// btRigidBody* bodyA = btRigidBody::upcast(colObj0);
|
|
// btRigidBody* bodyB = btRigidBody::upcast(colObj1);
|
|
// btRigidBody* bodyB = btRigidBody::upcast(colObj1);
|
|
@@ -761,7 +812,7 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
|
|
|
|
|
|
|
|
///avoid collision response between two static objects
|
|
///avoid collision response between two static objects
|
|
- if (!solverBodyA || (!solverBodyA->m_originalBody && (!solverBodyB || !solverBodyB->m_originalBody)))
|
|
|
|
|
|
+ if (!solverBodyA || (solverBodyA->m_invMass.isZero() && (!solverBodyB || solverBodyB->m_invMass.isZero())))
|
|
return;
|
|
return;
|
|
|
|
|
|
int rollingFriction=1;
|
|
int rollingFriction=1;
|
|
@@ -775,19 +826,35 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
btVector3 rel_pos1;
|
|
btVector3 rel_pos1;
|
|
btVector3 rel_pos2;
|
|
btVector3 rel_pos2;
|
|
btScalar relaxation;
|
|
btScalar relaxation;
|
|
- btScalar rel_vel;
|
|
|
|
- btVector3 vel;
|
|
|
|
|
|
+
|
|
|
|
|
|
int frictionIndex = m_tmpSolverContactConstraintPool.size();
|
|
int frictionIndex = m_tmpSolverContactConstraintPool.size();
|
|
btSolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expandNonInitializing();
|
|
btSolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expandNonInitializing();
|
|
-// btRigidBody* rb0 = btRigidBody::upcast(colObj0);
|
|
|
|
-// btRigidBody* rb1 = btRigidBody::upcast(colObj1);
|
|
|
|
|
|
+ btRigidBody* rb0 = btRigidBody::upcast(colObj0);
|
|
|
|
+ btRigidBody* rb1 = btRigidBody::upcast(colObj1);
|
|
solverConstraint.m_solverBodyIdA = solverBodyIdA;
|
|
solverConstraint.m_solverBodyIdA = solverBodyIdA;
|
|
solverConstraint.m_solverBodyIdB = solverBodyIdB;
|
|
solverConstraint.m_solverBodyIdB = solverBodyIdB;
|
|
|
|
|
|
solverConstraint.m_originalContactPoint = &cp;
|
|
solverConstraint.m_originalContactPoint = &cp;
|
|
|
|
|
|
- setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, vel, rel_vel, relaxation, rel_pos1, rel_pos2);
|
|
|
|
|
|
+ const btVector3& pos1 = cp.getPositionWorldOnA();
|
|
|
|
+ const btVector3& pos2 = cp.getPositionWorldOnB();
|
|
|
|
+
|
|
|
|
+ rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
|
|
|
|
+ rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
|
|
|
|
+
|
|
|
|
+ btVector3 vel1;// = rb0 ? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0,0,0);
|
|
|
|
+ btVector3 vel2;// = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
|
|
|
|
+
|
|
|
|
+ solverBodyA->getVelocityInLocalPointNoDelta(rel_pos1,vel1);
|
|
|
|
+ solverBodyB->getVelocityInLocalPointNoDelta(rel_pos2,vel2 );
|
|
|
|
+
|
|
|
|
+ btVector3 vel = vel1 - vel2;
|
|
|
|
+ btScalar rel_vel = cp.m_normalWorldOnB.dot(vel);
|
|
|
|
+
|
|
|
|
+ setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
// const btVector3& pos1 = cp.getPositionWorldOnA();
|
|
// const btVector3& pos1 = cp.getPositionWorldOnA();
|
|
// const btVector3& pos2 = cp.getPositionWorldOnB();
|
|
// const btVector3& pos2 = cp.getPositionWorldOnB();
|
|
@@ -796,9 +863,11 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
|
|
|
|
solverConstraint.m_frictionIndex = m_tmpSolverContactFrictionConstraintPool.size();
|
|
solverConstraint.m_frictionIndex = m_tmpSolverContactFrictionConstraintPool.size();
|
|
|
|
|
|
- btVector3 angVelA,angVelB;
|
|
|
|
- solverBodyA->getAngularVelocity(angVelA);
|
|
|
|
- solverBodyB->getAngularVelocity(angVelB);
|
|
|
|
|
|
+ btVector3 angVelA(0,0,0),angVelB(0,0,0);
|
|
|
|
+ if (rb0)
|
|
|
|
+ angVelA = rb0->getAngularVelocity();
|
|
|
|
+ if (rb1)
|
|
|
|
+ angVelB = rb1->getAngularVelocity();
|
|
btVector3 relAngVel = angVelB-angVelA;
|
|
btVector3 relAngVel = angVelB-angVelA;
|
|
|
|
|
|
if ((cp.m_combinedRollingFriction>0.f) && (rollingFriction>0))
|
|
if ((cp.m_combinedRollingFriction>0.f) && (rollingFriction>0))
|
|
@@ -852,6 +921,10 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
|
|
if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
|
|
{
|
|
{
|
|
cp.m_lateralFrictionDir1 *= 1.f/btSqrt(lat_rel_vel);
|
|
cp.m_lateralFrictionDir1 *= 1.f/btSqrt(lat_rel_vel);
|
|
|
|
+ applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
+ applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
+ addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
|
|
+
|
|
if((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
|
|
if((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
|
|
{
|
|
{
|
|
cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
|
|
cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
|
|
@@ -859,17 +932,16 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
|
|
-
|
|
|
|
} else
|
|
} else
|
|
{
|
|
{
|
|
btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
|
|
btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
|
|
|
|
|
|
|
|
+ applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
+ applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
+ addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
|
|
+
|
|
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
|
|
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
|
|
{
|
|
{
|
|
applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
@@ -877,9 +949,6 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
}
|
|
}
|
|
|
|
|
|
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1,btCollisionObject::CF_ANISOTROPIC_FRICTION);
|
|
|
|
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
|
|
|
|
|
|
|
|
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
|
|
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS) && (infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION))
|
|
{
|
|
{
|
|
@@ -894,8 +963,8 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
|
|
if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
|
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.m_contactMotion2, cp.m_contactCFM2);
|
|
addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.m_contactMotion2, cp.m_contactCFM2);
|
|
|
|
|
|
- setFrictionConstraintImpulse( solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
|
|
|
|
}
|
|
}
|
|
|
|
+ setFrictionConstraintImpulse( solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -904,15 +973,29 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
|
|
|
|
|
|
+void btSequentialImpulseConstraintSolver::convertContacts(btPersistentManifold** manifoldPtr,int numManifolds, const btContactSolverInfo& infoGlobal)
|
|
{
|
|
{
|
|
|
|
+ int i;
|
|
|
|
+ btPersistentManifold* manifold = 0;
|
|
|
|
+// btCollisionObject* colObj0=0,*colObj1=0;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ for (i=0;i<numManifolds;i++)
|
|
|
|
+ {
|
|
|
|
+ manifold = manifoldPtr[i];
|
|
|
|
+ convertContact(manifold,infoGlobal);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
|
|
|
|
+{
|
|
|
|
+ m_fixedBodyId = -1;
|
|
BT_PROFILE("solveGroupCacheFriendlySetup");
|
|
BT_PROFILE("solveGroupCacheFriendlySetup");
|
|
- (void)stackAlloc;
|
|
|
|
(void)debugDrawer;
|
|
(void)debugDrawer;
|
|
|
|
|
|
m_maxOverrideNumSolverIterations = 0;
|
|
m_maxOverrideNumSolverIterations = 0;
|
|
|
|
|
|
-#ifdef BT_DEBUG
|
|
|
|
|
|
+#ifdef BT_ADDITIONAL_DEBUG
|
|
//make sure that dynamic bodies exist for all (enabled) constraints
|
|
//make sure that dynamic bodies exist for all (enabled) constraints
|
|
for (int i=0;i<numConstraints;i++)
|
|
for (int i=0;i<numConstraints;i++)
|
|
{
|
|
{
|
|
@@ -979,7 +1062,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
btAssert(found);
|
|
btAssert(found);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-#endif //BT_DEBUG
|
|
|
|
|
|
+#endif //BT_ADDITIONAL_DEBUG
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < numBodies; i++)
|
|
for (int i = 0; i < numBodies; i++)
|
|
@@ -991,14 +1074,15 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
m_tmpSolverBodyPool.reserve(numBodies+1);
|
|
m_tmpSolverBodyPool.reserve(numBodies+1);
|
|
m_tmpSolverBodyPool.resize(0);
|
|
m_tmpSolverBodyPool.resize(0);
|
|
|
|
|
|
- btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
|
|
|
|
- initSolverBody(&fixedBody,0);
|
|
|
|
|
|
+ //btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
|
|
|
|
+ //initSolverBody(&fixedBody,0);
|
|
|
|
|
|
//convert all bodies
|
|
//convert all bodies
|
|
|
|
|
|
for (int i=0;i<numBodies;i++)
|
|
for (int i=0;i<numBodies;i++)
|
|
{
|
|
{
|
|
- int bodyId = getOrInitSolverBody(*bodies[i]);
|
|
|
|
|
|
+ int bodyId = getOrInitSolverBody(*bodies[i],infoGlobal.m_timeStep);
|
|
|
|
+
|
|
btRigidBody* body = btRigidBody::upcast(bodies[i]);
|
|
btRigidBody* body = btRigidBody::upcast(bodies[i]);
|
|
if (body && body->getInvMass())
|
|
if (body && body->getInvMass())
|
|
{
|
|
{
|
|
@@ -1007,9 +1091,8 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
if (body->getFlags()&BT_ENABLE_GYROPSCOPIC_FORCE)
|
|
if (body->getFlags()&BT_ENABLE_GYROPSCOPIC_FORCE)
|
|
{
|
|
{
|
|
gyroForce = body->computeGyroscopicForce(infoGlobal.m_maxGyroscopicForce);
|
|
gyroForce = body->computeGyroscopicForce(infoGlobal.m_maxGyroscopicForce);
|
|
|
|
+ solverBody.m_externalTorqueImpulse -= gyroForce*body->getInvInertiaTensorWorld()*infoGlobal.m_timeStep;
|
|
}
|
|
}
|
|
- solverBody.m_linearVelocity += body->getTotalForce()*body->getInvMass()*infoGlobal.m_timeStep;
|
|
|
|
- solverBody.m_angularVelocity += (body->getTotalTorque()-gyroForce)*body->getInvInertiaTensorWorld()*infoGlobal.m_timeStep;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1079,8 +1162,8 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
btRigidBody& rbA = constraint->getRigidBodyA();
|
|
btRigidBody& rbA = constraint->getRigidBodyA();
|
|
btRigidBody& rbB = constraint->getRigidBodyB();
|
|
btRigidBody& rbB = constraint->getRigidBodyB();
|
|
|
|
|
|
- int solverBodyIdA = getOrInitSolverBody(rbA);
|
|
|
|
- int solverBodyIdB = getOrInitSolverBody(rbB);
|
|
|
|
|
|
+ int solverBodyIdA = getOrInitSolverBody(rbA,infoGlobal.m_timeStep);
|
|
|
|
+ int solverBodyIdB = getOrInitSolverBody(rbB,infoGlobal.m_timeStep);
|
|
|
|
|
|
btSolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
|
|
btSolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
|
|
btSolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
|
|
btSolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
|
|
@@ -1119,9 +1202,9 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
btTypedConstraint::btConstraintInfo2 info2;
|
|
btTypedConstraint::btConstraintInfo2 info2;
|
|
info2.fps = 1.f/infoGlobal.m_timeStep;
|
|
info2.fps = 1.f/infoGlobal.m_timeStep;
|
|
info2.erp = infoGlobal.m_erp;
|
|
info2.erp = infoGlobal.m_erp;
|
|
- info2.m_J1linearAxis = currentConstraintRow->m_contactNormal;
|
|
|
|
|
|
+ info2.m_J1linearAxis = currentConstraintRow->m_contactNormal1;
|
|
info2.m_J1angularAxis = currentConstraintRow->m_relpos1CrossNormal;
|
|
info2.m_J1angularAxis = currentConstraintRow->m_relpos1CrossNormal;
|
|
- info2.m_J2linearAxis = 0;
|
|
|
|
|
|
+ info2.m_J2linearAxis = currentConstraintRow->m_contactNormal2;
|
|
info2.m_J2angularAxis = currentConstraintRow->m_relpos2CrossNormal;
|
|
info2.m_J2angularAxis = currentConstraintRow->m_relpos2CrossNormal;
|
|
info2.rowskip = sizeof(btSolverConstraint)/sizeof(btScalar);//check this
|
|
info2.rowskip = sizeof(btSolverConstraint)/sizeof(btScalar);//check this
|
|
///the size of btSolverConstraint needs be a multiple of btScalar
|
|
///the size of btSolverConstraint needs be a multiple of btScalar
|
|
@@ -1162,14 +1245,14 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
}
|
|
}
|
|
|
|
|
|
{
|
|
{
|
|
- btVector3 iMJlA = solverConstraint.m_contactNormal*rbA.getInvMass();
|
|
|
|
|
|
+ btVector3 iMJlA = solverConstraint.m_contactNormal1*rbA.getInvMass();
|
|
btVector3 iMJaA = rbA.getInvInertiaTensorWorld()*solverConstraint.m_relpos1CrossNormal;
|
|
btVector3 iMJaA = rbA.getInvInertiaTensorWorld()*solverConstraint.m_relpos1CrossNormal;
|
|
- btVector3 iMJlB = solverConstraint.m_contactNormal*rbB.getInvMass();//sign of normal?
|
|
|
|
|
|
+ btVector3 iMJlB = solverConstraint.m_contactNormal2*rbB.getInvMass();//sign of normal?
|
|
btVector3 iMJaB = rbB.getInvInertiaTensorWorld()*solverConstraint.m_relpos2CrossNormal;
|
|
btVector3 iMJaB = rbB.getInvInertiaTensorWorld()*solverConstraint.m_relpos2CrossNormal;
|
|
|
|
|
|
- btScalar sum = iMJlA.dot(solverConstraint.m_contactNormal);
|
|
|
|
|
|
+ btScalar sum = iMJlA.dot(solverConstraint.m_contactNormal1);
|
|
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
|
|
sum += iMJaA.dot(solverConstraint.m_relpos1CrossNormal);
|
|
- sum += iMJlB.dot(solverConstraint.m_contactNormal);
|
|
|
|
|
|
+ sum += iMJlB.dot(solverConstraint.m_contactNormal2);
|
|
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
|
|
sum += iMJaB.dot(solverConstraint.m_relpos2CrossNormal);
|
|
btScalar fsum = btFabs(sum);
|
|
btScalar fsum = btFabs(sum);
|
|
btAssert(fsum > SIMD_EPSILON);
|
|
btAssert(fsum > SIMD_EPSILON);
|
|
@@ -1177,15 +1260,22 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- ///fix rhs
|
|
|
|
- ///todo: add force/torque accelerators
|
|
|
|
|
|
+
|
|
{
|
|
{
|
|
btScalar rel_vel;
|
|
btScalar rel_vel;
|
|
- btScalar vel1Dotn = solverConstraint.m_contactNormal.dot(rbA.getLinearVelocity()) + solverConstraint.m_relpos1CrossNormal.dot(rbA.getAngularVelocity());
|
|
|
|
- btScalar vel2Dotn = -solverConstraint.m_contactNormal.dot(rbB.getLinearVelocity()) + solverConstraint.m_relpos2CrossNormal.dot(rbB.getAngularVelocity());
|
|
|
|
|
|
+ btVector3 externalForceImpulseA = bodyAPtr->m_originalBody ? bodyAPtr->m_externalForceImpulse : btVector3(0,0,0);
|
|
|
|
+ btVector3 externalTorqueImpulseA = bodyAPtr->m_originalBody ? bodyAPtr->m_externalTorqueImpulse : btVector3(0,0,0);
|
|
|
|
+
|
|
|
|
+ btVector3 externalForceImpulseB = bodyBPtr->m_originalBody ? bodyBPtr->m_externalForceImpulse : btVector3(0,0,0);
|
|
|
|
+ btVector3 externalTorqueImpulseB = bodyBPtr->m_originalBody ?bodyBPtr->m_externalTorqueImpulse : btVector3(0,0,0);
|
|
|
|
+
|
|
|
|
+ btScalar vel1Dotn = solverConstraint.m_contactNormal1.dot(rbA.getLinearVelocity()+externalForceImpulseA)
|
|
|
|
+ + solverConstraint.m_relpos1CrossNormal.dot(rbA.getAngularVelocity()+externalTorqueImpulseA);
|
|
|
|
+
|
|
|
|
+ btScalar vel2Dotn = solverConstraint.m_contactNormal2.dot(rbB.getLinearVelocity()+externalForceImpulseB)
|
|
|
|
+ + solverConstraint.m_relpos2CrossNormal.dot(rbB.getAngularVelocity()+externalTorqueImpulseB);
|
|
|
|
|
|
rel_vel = vel1Dotn+vel2Dotn;
|
|
rel_vel = vel1Dotn+vel2Dotn;
|
|
-
|
|
|
|
btScalar restitution = 0.f;
|
|
btScalar restitution = 0.f;
|
|
btScalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
|
|
btScalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
|
|
btScalar velocityError = restitution - rel_vel * info2.m_damping;
|
|
btScalar velocityError = restitution - rel_vel * info2.m_damping;
|
|
@@ -1194,6 +1284,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
|
|
solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
|
|
solverConstraint.m_appliedImpulse = 0.f;
|
|
solverConstraint.m_appliedImpulse = 0.f;
|
|
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1201,18 +1292,8 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- {
|
|
|
|
- int i;
|
|
|
|
- btPersistentManifold* manifold = 0;
|
|
|
|
-// btCollisionObject* colObj0=0,*colObj1=0;
|
|
|
|
-
|
|
|
|
|
|
+ convertContacts(manifoldPtr,numManifolds,infoGlobal);
|
|
|
|
|
|
- for (i=0;i<numManifolds;i++)
|
|
|
|
- {
|
|
|
|
- manifold = manifoldPtr[i];
|
|
|
|
- convertContact(manifold,infoGlobal);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
// btContactSolverInfo info = infoGlobal;
|
|
// btContactSolverInfo info = infoGlobal;
|
|
@@ -1251,7 +1332,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/,btStackAlloc* /*stackAlloc*/)
|
|
|
|
|
|
+btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/)
|
|
{
|
|
{
|
|
|
|
|
|
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
|
|
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
|
|
@@ -1304,14 +1385,14 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|
{
|
|
{
|
|
for (int j=0;j<numConstraints;j++)
|
|
for (int j=0;j<numConstraints;j++)
|
|
{
|
|
{
|
|
- if (constraints[j]->isEnabled())
|
|
|
|
- {
|
|
|
|
- int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA());
|
|
|
|
- int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB());
|
|
|
|
- btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
|
|
|
|
- btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
|
|
|
|
- constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
|
|
|
|
- }
|
|
|
|
|
|
+ if (constraints[j]->isEnabled())
|
|
|
|
+ {
|
|
|
|
+ int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(),infoGlobal.m_timeStep);
|
|
|
|
+ int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(),infoGlobal.m_timeStep);
|
|
|
|
+ btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
|
|
|
|
+ btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
|
|
|
|
+ constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
///solve all contact constraints using SIMD, if available
|
|
///solve all contact constraints using SIMD, if available
|
|
@@ -1371,7 +1452,8 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|
for (j=0;j<numPoolConstraints;j++)
|
|
for (j=0;j<numPoolConstraints;j++)
|
|
{
|
|
{
|
|
const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
|
|
const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
|
|
- resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
|
|
|
|
|
|
+ //resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
|
|
|
|
+ resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1390,7 +1472,8 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|
solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
|
|
solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
|
|
solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
|
|
solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
|
|
|
|
|
|
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
|
|
|
|
|
|
+ //resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
|
|
|
|
+ resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1432,14 +1515,14 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|
{
|
|
{
|
|
for (int j=0;j<numConstraints;j++)
|
|
for (int j=0;j<numConstraints;j++)
|
|
{
|
|
{
|
|
- if (constraints[j]->isEnabled())
|
|
|
|
- {
|
|
|
|
- int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA());
|
|
|
|
- int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB());
|
|
|
|
- btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
|
|
|
|
- btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
|
|
|
|
- constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
|
|
|
|
- }
|
|
|
|
|
|
+ if (constraints[j]->isEnabled())
|
|
|
|
+ {
|
|
|
|
+ int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA(),infoGlobal.m_timeStep);
|
|
|
|
+ int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB(),infoGlobal.m_timeStep);
|
|
|
|
+ btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
|
|
|
|
+ btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
|
|
|
|
+ constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
///solve all contact constraints
|
|
///solve all contact constraints
|
|
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
|
|
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
|
|
@@ -1487,7 +1570,7 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
|
|
|
|
|
|
+void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
|
|
{
|
|
{
|
|
int iteration;
|
|
int iteration;
|
|
if (infoGlobal.m_splitImpulse)
|
|
if (infoGlobal.m_splitImpulse)
|
|
@@ -1527,20 +1610,20 @@ void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIte
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
|
|
|
|
|
|
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
|
|
{
|
|
{
|
|
BT_PROFILE("solveGroupCacheFriendlyIterations");
|
|
BT_PROFILE("solveGroupCacheFriendlyIterations");
|
|
|
|
|
|
{
|
|
{
|
|
///this is a special step to resolve penetrations (just for contacts)
|
|
///this is a special step to resolve penetrations (just for contacts)
|
|
- solveGroupCacheFriendlySplitImpulseIterations(bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer,stackAlloc);
|
|
|
|
|
|
+ solveGroupCacheFriendlySplitImpulseIterations(bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
|
|
|
|
|
|
int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
|
|
int maxIterations = m_maxOverrideNumSolverIterations > infoGlobal.m_numIterations? m_maxOverrideNumSolverIterations : infoGlobal.m_numIterations;
|
|
|
|
|
|
for ( int iteration = 0 ; iteration< maxIterations ; iteration++)
|
|
for ( int iteration = 0 ; iteration< maxIterations ; iteration++)
|
|
//for ( int iteration = maxIterations-1 ; iteration >= 0;iteration--)
|
|
//for ( int iteration = maxIterations-1 ; iteration >= 0;iteration--)
|
|
{
|
|
{
|
|
- solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer,stackAlloc);
|
|
|
|
|
|
+ solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
@@ -1580,10 +1663,10 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCo
|
|
btJointFeedback* fb = constr->getJointFeedback();
|
|
btJointFeedback* fb = constr->getJointFeedback();
|
|
if (fb)
|
|
if (fb)
|
|
{
|
|
{
|
|
- fb->m_appliedForceBodyA += solverConstr.m_contactNormal*solverConstr.m_appliedImpulse*constr->getRigidBodyA().getLinearFactor()/infoGlobal.m_timeStep;
|
|
|
|
- fb->m_appliedForceBodyB += -solverConstr.m_contactNormal*solverConstr.m_appliedImpulse*constr->getRigidBodyB().getLinearFactor()/infoGlobal.m_timeStep;
|
|
|
|
|
|
+ fb->m_appliedForceBodyA += solverConstr.m_contactNormal1*solverConstr.m_appliedImpulse*constr->getRigidBodyA().getLinearFactor()/infoGlobal.m_timeStep;
|
|
|
|
+ fb->m_appliedForceBodyB += solverConstr.m_contactNormal2*solverConstr.m_appliedImpulse*constr->getRigidBodyB().getLinearFactor()/infoGlobal.m_timeStep;
|
|
fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal* constr->getRigidBodyA().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep;
|
|
fb->m_appliedTorqueBodyA += solverConstr.m_relpos1CrossNormal* constr->getRigidBodyA().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep;
|
|
- fb->m_appliedTorqueBodyB += -solverConstr.m_relpos1CrossNormal* constr->getRigidBodyB().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep;
|
|
|
|
|
|
+ fb->m_appliedTorqueBodyB += solverConstr.m_relpos2CrossNormal* constr->getRigidBodyB().getAngularFactor()*solverConstr.m_appliedImpulse/infoGlobal.m_timeStep; /*RGM ???? */
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1605,9 +1688,15 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCo
|
|
m_tmpSolverBodyPool[i].writebackVelocityAndTransform(infoGlobal.m_timeStep, infoGlobal.m_splitImpulseTurnErp);
|
|
m_tmpSolverBodyPool[i].writebackVelocityAndTransform(infoGlobal.m_timeStep, infoGlobal.m_splitImpulseTurnErp);
|
|
else
|
|
else
|
|
m_tmpSolverBodyPool[i].writebackVelocity();
|
|
m_tmpSolverBodyPool[i].writebackVelocity();
|
|
|
|
+
|
|
|
|
+ m_tmpSolverBodyPool[i].m_originalBody->setLinearVelocity(
|
|
|
|
+ m_tmpSolverBodyPool[i].m_linearVelocity+
|
|
|
|
+ m_tmpSolverBodyPool[i].m_externalForceImpulse);
|
|
|
|
+
|
|
|
|
+ m_tmpSolverBodyPool[i].m_originalBody->setAngularVelocity(
|
|
|
|
+ m_tmpSolverBodyPool[i].m_angularVelocity+
|
|
|
|
+ m_tmpSolverBodyPool[i].m_externalTorqueImpulse);
|
|
|
|
|
|
- m_tmpSolverBodyPool[i].m_originalBody->setLinearVelocity(m_tmpSolverBodyPool[i].m_linearVelocity);
|
|
|
|
- m_tmpSolverBodyPool[i].m_originalBody->setAngularVelocity(m_tmpSolverBodyPool[i].m_angularVelocity);
|
|
|
|
if (infoGlobal.m_splitImpulse)
|
|
if (infoGlobal.m_splitImpulse)
|
|
m_tmpSolverBodyPool[i].m_originalBody->setWorldTransform(m_tmpSolverBodyPool[i].m_worldTransform);
|
|
m_tmpSolverBodyPool[i].m_originalBody->setWorldTransform(m_tmpSolverBodyPool[i].m_worldTransform);
|
|
|
|
|
|
@@ -1627,15 +1716,15 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCo
|
|
|
|
|
|
|
|
|
|
/// btSequentialImpulseConstraintSolver Sequentially applies impulses
|
|
/// btSequentialImpulseConstraintSolver Sequentially applies impulses
|
|
-btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc,btDispatcher* /*dispatcher*/)
|
|
|
|
|
|
+btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btDispatcher* /*dispatcher*/)
|
|
{
|
|
{
|
|
|
|
|
|
BT_PROFILE("solveGroup");
|
|
BT_PROFILE("solveGroup");
|
|
//you need to provide at least some bodies
|
|
//you need to provide at least some bodies
|
|
|
|
|
|
- solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
|
|
|
|
|
|
+ solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer);
|
|
|
|
|
|
- solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
|
|
|
|
|
|
+ solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer);
|
|
|
|
|
|
solveGroupCacheFriendlyFinish(bodies, numBodies, infoGlobal);
|
|
solveGroupCacheFriendlyFinish(bodies, numBodies, infoGlobal);
|
|
|
|
|