106 #include <emmintrin.h> 109 #define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e)) 110 static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
112 __m128 result = _mm_mul_ps( vec0, vec1);
113 return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) );
116 #if defined (BT_ALLOW_SSE4) 120 #define USE_FMA3_INSTEAD_FMA4 1 121 #define USE_SSE4_DOT 1 123 #define SSE4_DP(a, b) _mm_dp_ps(a, b, 0x7f) 124 #define SSE4_DP_FP(a, b) _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7f)) 127 #define DOT_PRODUCT(a, b) SSE4_DP(a, b) 129 #define DOT_PRODUCT(a, b) btSimdDot3(a, b) 133 #if USE_FMA3_INSTEAD_FMA4 135 #define FMADD(a, b, c) _mm_fmadd_ps(a, b, c) 137 #define FMNADD(a, b, c) _mm_fnmadd_ps(a, b, c) 140 #define FMADD(a, b, c) _mm_macc_ps(a, b, c) 142 #define FMNADD(a, b, c) _mm_nmacc_ps(a, b, c) 146 #define FMADD(a, b, c) _mm_add_ps(c, _mm_mul_ps(a, b)) 148 #define FMNADD(a, b, c) _mm_sub_ps(c, _mm_mul_ps(a, b)) 161 deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
162 deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
165 resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
166 resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
167 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
168 deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
169 c.
m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
170 __m128 upperMinApplied = _mm_sub_ps(upperLimit1, cpAppliedImp);
171 deltaImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied));
175 __m128 impulseMagnitude = deltaImpulse;
187 #if defined (BT_ALLOW_SSE4) 194 deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
195 deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
197 const __m128 maskLower = _mm_cmpgt_ps(tmp, lowerLimit);
198 const __m128 maskUpper = _mm_cmpgt_ps(upperLimit, tmp);
199 deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.
m_appliedImpulse), _mm_blendv_ps(_mm_sub_ps(upperLimit, c.
m_appliedImpulse), deltaImpulse, maskUpper), maskLower);
200 c.
m_appliedImpulse = _mm_blendv_ps(lowerLimit, _mm_blendv_ps(upperLimit, tmp, maskUpper), maskLower);
208 return gResolveSingleConstraintRowGeneric_sse2(bodyA,bodyB,c);
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_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
233 __m128 impulseMagnitude = deltaImpulse;
251 deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
252 deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
254 const __m128 mask = _mm_cmpgt_ps(tmp, lowerLimit);
255 deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.
m_appliedImpulse), deltaImpulse, mask);
264 return gResolveSingleConstraintRowLowerLimit_sse2(bodyA,bodyB,c);
265 #endif //BT_ALLOW_SSE4 342 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
343 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
346 resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
347 resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
348 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
349 deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
350 c.
m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
353 __m128 impulseMagnitude = deltaImpulse;
393 #endif//BT_ALLOW_SSE4 416 return gResolveSingleConstraintRowGeneric_sse2;
420 return gResolveSingleConstraintRowLowerLimit_sse2;
425 return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
429 return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
431 #endif //BT_ALLOW_SSE4 446 const unsigned long un =
static_cast<unsigned long>(n);
451 if (un <= 0x00010000UL) {
453 if (un <= 0x00000100UL) {
455 if (un <= 0x00000010UL) {
457 if (un <= 0x00000004UL) {
459 if (un <= 0x00000002UL) {
467 return (
int) (r % un);
518 if (
btFabs(rel_vel)<velocityThreshold)
521 btScalar rest = restitution * -rel_vel;
537 loc_lateral *= friction_scaling;
547 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,
const btContactSolverInfo& infoGlobal,
btScalar desiredVelocity,
btScalar cfmSlip)
606 btScalar denom = relaxation/(denom0+denom1);
619 rel_vel = vel1Dotn+vel2Dotn;
623 btScalar velocityError = desiredVelocity - rel_vel;
632 penetrationImpulse = positionalError*solverConstraint.
m_jacDiagABInv;
635 solverConstraint.
m_rhs = penetrationImpulse + velocityImpulse;
637 solverConstraint.
m_cfm = cfmSlip;
644 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,
const btContactSolverInfo& infoGlobal,
btScalar desiredVelocity,
btScalar cfmSlip)
649 colObj0, colObj1, relaxation, infoGlobal, desiredVelocity, cfmSlip);
650 return solverConstraint;
674 solverConstraint.
m_friction = combinedTorsionalFriction;
710 rel_vel = vel1Dotn+vel2Dotn;
716 solverConstraint.
m_rhs = velocityImpulse;
717 solverConstraint.
m_cfm = cfmSlip;
731 btSolverConstraint&
btSequentialImpulseConstraintSolver::addTorsionalFrictionConstraint(
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
int frictionIndex,
btManifoldPoint& cp,
btScalar combinedTorsionalFriction,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1,
btScalar relaxation,
btScalar desiredVelocity,
btScalar cfmSlip)
736 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
737 return solverConstraint;
744 int solverBodyId = -1;
751 if ( solverBodyId < 0 )
769 const int INVALID_SOLVER_BODY_ID = -1;
776 if ( solverBodyId == INVALID_SOLVER_BODY_ID )
789 if (!isMultiBodyType)
805 #else // BT_THREADSAFE 807 int solverBodyIdA = -1;
838 return solverBodyIdA;
839 #endif // BT_THREADSAFE 846 int solverBodyIdA,
int solverBodyIdB,
866 relaxation = infoGlobal.
m_sor;
904 #ifdef COMPUTE_IMPULSE_DENOM 921 #endif //COMPUTE_IMPULSE_DENOM 923 btScalar denom = relaxation/(denom0+denom1+cfm);
999 btScalar rel_vel = vel1Dotn+vel2Dotn;
1002 btScalar velocityError = restitution - rel_vel;
1008 positionalError = 0;
1010 velocityError -= penetration *invTimeStep;
1013 positionalError = -penetration * erp*invTimeStep;
1023 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1029 solverConstraint.
m_rhs = velocityImpulse;
1045 int solverBodyIdA,
int solverBodyIdB,
1112 int rollingFriction=1;
1136 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
1147 setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
1160 addTorsionalFrictionConstraint(cp.
m_normalWorldOnB,solverBodyIdA,solverBodyIdB,frictionIndex,cp,cp.
m_combinedSpinningFriction, rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
1170 if (axis0.
length()>0.001)
1173 if (axis1.
length()>0.001)
1205 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,infoGlobal);
1213 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
1222 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
1228 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
1240 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal, cp.
m_contactMotion1, cp.
m_frictionCFM);
1243 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal, cp.
m_contactMotion2, cp.
m_frictionCFM);
1262 for (i=0;i<numManifolds;i++)
1264 manifold = manifoldPtr[i];
1321 info2.erp = infoGlobal.
m_erp;
1329 info2.m_constraintError = ¤tConstraintRow->
m_rhs;
1332 info2.cfm = ¤tConstraintRow->
m_cfm;
1333 info2.m_lowerLimit = ¤tConstraintRow->
m_lowerLimit;
1334 info2.m_upperLimit = ¤tConstraintRow->
m_upperLimit;
1394 rel_vel = vel1Dotn+vel2Dotn;
1397 btScalar velocityError = restitution - rel_vel * info2.m_damping;
1400 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1410 for (
int j=0;j<numConstraints;j++)
1417 int totalNumRows = 0;
1421 for (
int i=0;i<numConstraints;i++)
1433 if (constraints[i]->isEnabled())
1449 for (
int i=0;i<numConstraints;i++)
1465 convertJoint(currentConstraintRow, constraint, info1, solverBodyIdA, solverBodyIdB, infoGlobal);
1475 for (
int i = 0; i < numBodies; i++)
1481 #endif // BT_THREADSAFE 1489 for (
int i=0;i<numBodies;i++)
1535 #ifdef BT_ADDITIONAL_DEBUG 1537 for (
int i=0;i<numConstraints;i++)
1545 for (
int b=0;b<numBodies;b++)
1559 for (
int b=0;b<numBodies;b++)
1572 for (
int i=0;i<numManifolds;i++)
1574 if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
1577 for (
int b=0;b<numBodies;b++)
1580 if (manifoldPtr[i]->getBody0()==bodies[b])
1588 if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
1591 for (
int b=0;b<numBodies;b++)
1593 if (manifoldPtr[i]->getBody1()==bodies[b])
1602 #endif //BT_ADDITIONAL_DEBUG 1630 for (i=0;i<numNonContactPool;i++)
1634 for (i=0;i<numConstraintPool;i++)
1638 for (i=0;i<numFrictionPool;i++)
1652 btScalar leastSquaresResidual = 0.f;
1663 for (
int j=0; j<numNonContactPool; ++j) {
1673 for (
int j=0; j<numConstraintPool; ++j) {
1680 for (
int j=0; j<numFrictionPool; ++j) {
1697 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1703 for (
int j=0;j<numConstraints;j++)
1705 if (constraints[j]->isEnabled())
1721 for (
int c=0;c<numPoolConstraints;c++)
1728 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1732 bool applyFriction =
true;
1745 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1760 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1773 for (j=0;j<numPoolConstraints;j++)
1777 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1785 for (j=0;j<numFrictionPoolConstraints;j++)
1796 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1803 for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
1810 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1811 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1812 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1814 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1815 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1818 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1824 return leastSquaresResidual;
1830 BT_PROFILE(
"solveGroupCacheFriendlySplitImpulseIterations");
1837 btScalar leastSquaresResidual =0.f;
1841 for (j=0;j<numPoolConstraints;j++)
1846 leastSquaresResidual =
btMax(leastSquaresResidual, residual*residual);
1849 if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration>=(infoGlobal.
m_numIterations-1))
1851 #ifdef VERBOSE_RESIDUAL_PRINTF 1852 printf(
"residual = %f at iteration #%d\n",leastSquaresResidual,iteration);
1863 BT_PROFILE(
"solveGroupCacheFriendlyIterations");
1871 for (
int iteration = 0 ; iteration<
maxIterations ; iteration++)
1878 #ifdef VERBOSE_RESIDUAL_PRINTF 1891 for (
int j=iBegin; j<iEnd; j++)
1911 for (
int j=iBegin; j<iEnd; j++)
1936 for (
int i=iBegin; i<iEnd; i++)
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric()
btScalar getInvMass() const
static T sum(const btAlignedObjectArray< T > &items)
btVector3 m_linearVelocity
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don't store a rigidbody pointer but a rigidbody ...
btVector3 m_angularVelocity
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
int m_overrideNumSolverIterations
virtual ~btSequentialImpulseConstraintSolver()
void setupFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
virtual void getInfo1(btConstraintInfo1 *info)=0
internal method used by the constraint solver, don't use them directly
btConstraintArray m_tmpSolverContactFrictionConstraintPool
const btVector3 & getTotalForce() const
btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool
btScalar m_combinedContactStiffness1
btVector3 m_lateralFrictionDir1
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btVector3 m_relpos1CrossNormal
const btVector3 & getPushVelocity() const
void internalApplyImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, const btScalar impulseMagnitude)
const btVector3 & getAngularFactor() const
btScalar m_appliedImpulseLateral1
btScalar m_rhsPenetration
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
virtual void getInfo2(btConstraintInfo2 *info)=0
internal method used by the constraint solver, don't use them directly
btScalar m_combinedRestitution
static btScalar gResolveSplitPenetrationImpulse_scalar_reference(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &c)
virtual void convertBodies(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const
perform implicit force computation in world space
int getInternalType() const
reserved for Bullet internal usage
virtual btScalar solveGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher)
btSequentialImpulseConstraintSolver Sequentially applies impulses
static int getCpuFeatures()
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
void btPlaneSpace1(const T &n, T &p, T &q)
void resizeNoInitialize(int newsize)
resize changes the number of elements in the array.
btScalar btSqrt(btScalar y)
btScalar m_appliedImpulse
btVector3 m_relpos2CrossNormal
const btVector3 & getTotalTorque() const
btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit()
btScalar getBreakingImpulseThreshold() const
btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric
btScalar computeImpulseDenominator(const btVector3 &pos, const btVector3 &normal) const
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btScalar resolveSingleConstraintRowLowerLimitSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
ManifoldContactPoint collects and maintains persistent contactpoints.
const btCollisionObject * getBody0() const
btScalar m_contactMotion1
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const
btAlignedObjectArray< int > m_orderTmpConstraintPool
static btScalar gResolveSplitPenetrationImpulse_sse2(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &c)
static btScalar gResolveSingleConstraintRowGeneric_scalar_reference(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &c)
This is the scalar reference implementation of solving a single constraint row, the innerloop of the ...
btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric()
Various implementations of solving a single constraint row using a generic equality constraint...
btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit()
Various implementations of solving a single constraint row using an inequality (lower limit) constrai...
void initSolverBody(btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep)
virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btScalar dot(const btVector3 &v) const
Return the dot product.
virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btVector3 m_externalTorqueImpulse
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btVector3 & getAnisotropicFriction() const
btVector3 m_appliedForceBodyB
btVector3 getVelocityInLocalPoint(const btVector3 &rel_pos) const
const btJointFeedback * getJointFeedback() const
static btScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &c)
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
btVector3 m_externalForceImpulse
BT_ENABLE_GYROPSCOPIC_FORCE flags is enabled by default in Bullet 2.83 and onwards.
btVector3 & internalGetTurnVelocity()
#define btSimdScalar
Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later...
btVector3 m_angularComponentA
btScalar m_combinedRollingFriction
btAlignedObjectArray< btSolverBody > m_tmpSolverBodyPool
void internalSetInvMass(const btVector3 &invMass)
void setupTorsionalFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, btScalar combinedTorsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
int getWorldArrayIndex() const
btScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
btTransform & getWorldTransform()
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const
explicit version is best avoided, it gains energy
btVector3 m_normalWorldOnB
int size() const
return the number of elements in the array
const btVector3 & getDeltaLinearVelocity() const
btVector3 m_appliedForceBodyA
void setFrictionConstraintImpulse(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal)
bool isKinematicObject() const
virtual void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
btVector3 m_angularFactor
btScalar m_appliedImpulseLateral2
void setupSolverFunctions(bool useSimd)
btConstraintArray m_tmpSolverContactConstraintPool
const btVector3 & getAngularVelocity() const
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
bool isStaticOrKinematicObject() const
btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric()
btCollisionObject can be used to manage collision detection objects.
btScalar getContactProcessingThreshold() const
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations...
The btRigidBody is the main class for rigid body objects.
btScalar length() const
Return the length of the vector.
btVector3 m_angularComponentB
void writeBackContacts(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
int m_maxOverrideNumSolverIterations
const btManifoldPoint & getContactPoint(int index) const
void setCompanionId(int id)
const btVector3 & internalGetInvMass() const
const btVector3 & getPositionWorldOnB() const
const btVector3 & getDeltaAngularVelocity() const
btVector3 can be used to represent 3D points and vectors.
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit()
int getCompanionId() const
btScalar length2() const
Return the length of the vector squared.
btScalar resolveSplitPenetrationImpulse(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
virtual void solveConstraintObsolete(btSolverBody &, btSolverBody &, btScalar)
internal method used by the constraint solver, don't use them directly
void convertContact(btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal)
btScalar m_combinedContactDamping1
btSolverConstraint & addFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, const btContactSolverInfo &infoGlobal, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btVector3 m_appliedTorqueBodyB
btSimdScalar m_appliedPushImpulse
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...
void * m_originalContactPoint
btAlignedObjectArray< btTypedConstraint::btConstraintInfo1 > m_tmpConstraintSizesPool
bool hasAnisotropicFriction(int frictionMode=CF_ANISOTROPIC_FRICTION) const
TypedConstraint is the baseclass for Bullet constraints and vehicles.
void resize(int newsize, const T &fillData=T())
btRigidBody * m_originalBody
void internalApplyPushImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, btScalar impulseMagnitude)
int getNumContacts() const
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them
const btRigidBody & getRigidBodyA() const
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold)
int gNumSplitImpulseRecoveries
const btVector3 & getTurnVelocity() const
void setEnabled(bool enabled)
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btScalar resolveSingleConstraintRowGenericSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btScalar m_contactMotion2
const T & btMax(const T &a, const T &b)
const btMatrix3x3 & getInvInertiaTensorWorld() const
btScalar m_combinedFriction
virtual void convertJoints(btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal)
T & expand(const T &fillValue=T())
btVector3 m_appliedTorqueBodyA
btSolverConstraint & addTorsionalFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, btScalar torsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0, btScalar cfmSlip=0.f)
const btVector3 & getPositionWorldOnA() const
btVector3 & internalGetPushVelocity()
void writeBackBodies(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
btVector3 m_contactNormal1
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
btAlignedObjectArray< int > m_orderFrictionConstraintPool
const btVector3 & getLinearVelocity() const
void setupContactConstraint(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btScalar &relaxation, const btVector3 &rel_pos1, const btVector3 &rel_pos2)
btAlignedObjectArray< int > m_orderNonContactConstraintPool
btVector3 & internalGetDeltaAngularVelocity()
void internalSetAppliedImpulse(btScalar appliedImpulse)
internal method used by the constraint solver, don't use them directly
virtual void reset()
clear internal cached data and reset random seed
unsigned long m_btSeed2
m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction ...
btVector3 m_lateralFrictionDir2
btSimdScalar m_appliedImpulse
btScalar getDistance() const
btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const
perform implicit force computation in body space (inertial frame)
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
const btVector3 & getLinearFactor() const
T & expandNonInitializing()
btScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit
const btRigidBody & getRigidBodyB() const
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
int getOverrideNumSolverIterations() const
const btCollisionObject * getBody1() const
btSequentialImpulseConstraintSolver()
virtual void buildJacobian()
internal method used by the constraint solver, don't use them directly
btConstraintArray m_tmpSolverNonContactConstraintPool
void convertJoint(btSolverConstraint *currentConstraintRow, btTypedConstraint *constraint, const btTypedConstraint::btConstraintInfo1 &info1, int solverBodyIdA, int solverBodyIdB, const btContactSolverInfo &infoGlobal)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar m_combinedSpinningFriction
btVector3 m_contactNormal2
btAlignedObjectArray< int > m_kinematicBodyUniqueIdToSolverBodyTable
btScalar btFabs(btScalar x)
btTransform m_worldTransform
btSingleConstraintRowSolver m_resolveSplitPenetrationImpulse
btScalar m_leastSquaresResidual
void writeBackJoints(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)