105 #include <emmintrin.h> 108 #define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e)) 109 static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
111 __m128 result = _mm_mul_ps( vec0, vec1);
112 return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) );
115 #if defined (BT_ALLOW_SSE4) 119 #define USE_FMA3_INSTEAD_FMA4 1 120 #define USE_SSE4_DOT 1 122 #define SSE4_DP(a, b) _mm_dp_ps(a, b, 0x7f) 123 #define SSE4_DP_FP(a, b) _mm_cvtss_f32(_mm_dp_ps(a, b, 0x7f)) 126 #define DOT_PRODUCT(a, b) SSE4_DP(a, b) 128 #define DOT_PRODUCT(a, b) btSimdDot3(a, b) 132 #if USE_FMA3_INSTEAD_FMA4 134 #define FMADD(a, b, c) _mm_fmadd_ps(a, b, c) 136 #define FMNADD(a, b, c) _mm_fnmadd_ps(a, b, c) 139 #define FMADD(a, b, c) _mm_macc_ps(a, b, c) 141 #define FMNADD(a, b, c) _mm_nmacc_ps(a, b, c) 145 #define FMADD(a, b, c) _mm_add_ps(c, _mm_mul_ps(a, b)) 147 #define FMNADD(a, b, c) _mm_sub_ps(c, _mm_mul_ps(a, b)) 160 deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
161 deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
164 resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
165 resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
166 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
167 deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
168 c.
m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
169 __m128 upperMinApplied = _mm_sub_ps(upperLimit1, cpAppliedImp);
170 deltaImpulse = _mm_or_ps(_mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied));
174 __m128 impulseMagnitude = deltaImpulse;
186 #if defined (BT_ALLOW_SSE4) 193 deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
194 deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
196 const __m128 maskLower = _mm_cmpgt_ps(tmp, lowerLimit);
197 const __m128 maskUpper = _mm_cmpgt_ps(upperLimit, tmp);
198 deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.
m_appliedImpulse), _mm_blendv_ps(_mm_sub_ps(upperLimit, c.
m_appliedImpulse), deltaImpulse, maskUpper), maskLower);
199 c.
m_appliedImpulse = _mm_blendv_ps(lowerLimit, _mm_blendv_ps(upperLimit, tmp, maskUpper), maskLower);
206 return gResolveSingleConstraintRowGeneric_sse2(body1,body2,c);
220 deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel1Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
221 deltaImpulse = _mm_sub_ps(deltaImpulse, _mm_mul_ps(deltaVel2Dotn, _mm_set1_ps(c.
m_jacDiagABInv)));
224 resultLowerLess = _mm_cmplt_ps(sum, lowerLimit1);
225 resultUpperLess = _mm_cmplt_ps(sum, upperLimit1);
226 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1, cpAppliedImp);
227 deltaImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse));
228 c.
m_appliedImpulse = _mm_or_ps(_mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum));
231 __m128 impulseMagnitude = deltaImpulse;
249 deltaImpulse = FMNADD(deltaVel1Dotn, tmp, deltaImpulse);
250 deltaImpulse = FMNADD(deltaVel2Dotn, tmp, deltaImpulse);
252 const __m128 mask = _mm_cmpgt_ps(tmp, lowerLimit);
253 deltaImpulse = _mm_blendv_ps(_mm_sub_ps(lowerLimit, c.
m_appliedImpulse), deltaImpulse, mask);
261 return gResolveSingleConstraintRowLowerLimit_sse2(body1,body2,c);
262 #endif //BT_ALLOW_SSE4 344 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
345 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
348 resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
349 resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
350 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
351 deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
352 c.
m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
355 __m128 impulseMagnitude = deltaImpulse;
384 #endif//BT_ALLOW_SSE4 406 return gResolveSingleConstraintRowGeneric_sse2;
410 return gResolveSingleConstraintRowLowerLimit_sse2;
415 return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
419 return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
421 #endif //BT_ALLOW_SSE4 436 const unsigned long un =
static_cast<unsigned long>(n);
441 if (un <= 0x00010000UL) {
443 if (un <= 0x00000100UL) {
445 if (un <= 0x00000010UL) {
447 if (un <= 0x00000004UL) {
449 if (un <= 0x00000002UL) {
457 return (
int) (r % un);
507 btScalar rest = restitution * -rel_vel;
523 loc_lateral *= friction_scaling;
533 void btSequentialImpulseConstraintSolver::setupFrictionConstraint(
btSolverConstraint& solverConstraint,
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
btManifoldPoint& cp,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1,
btScalar relaxation,
btScalar desiredVelocity,
btScalar cfmSlip)
592 btScalar denom = relaxation/(denom0+denom1);
605 rel_vel = vel1Dotn+vel2Dotn;
609 btScalar velocityError = desiredVelocity - rel_vel;
611 solverConstraint.
m_rhs = velocityImpulse;
613 solverConstraint.
m_cfm = cfmSlip;
620 btSolverConstraint&
btSequentialImpulseConstraintSolver::addFrictionConstraint(
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
int frictionIndex,
btManifoldPoint& cp,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1,
btScalar relaxation,
btScalar desiredVelocity,
btScalar cfmSlip)
625 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
626 return solverConstraint;
686 rel_vel = vel1Dotn+vel2Dotn;
692 solverConstraint.
m_rhs = velocityImpulse;
693 solverConstraint.
m_cfm = cfmSlip;
707 btSolverConstraint&
btSequentialImpulseConstraintSolver::addRollingFrictionConstraint(
const btVector3& normalAxis,
int solverBodyIdA,
int solverBodyIdB,
int frictionIndex,
btManifoldPoint& cp,
const btVector3& rel_pos1,
const btVector3& rel_pos2,
btCollisionObject* colObj0,
btCollisionObject* colObj1,
btScalar relaxation,
btScalar desiredVelocity,
btScalar cfmSlip)
712 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
713 return solverConstraint;
720 int solverBodyIdA = -1;
751 return solverBodyIdA;
758 int solverBodyIdA,
int solverBodyIdB,
786 #ifdef COMPUTE_IMPULSE_DENOM 803 #endif //COMPUTE_IMPULSE_DENOM 805 btScalar denom = relaxation/(denom0+denom1);
881 btScalar rel_vel = vel1Dotn+vel2Dotn;
884 btScalar velocityError = restitution - rel_vel;
890 erp = infoGlobal.
m_erp;
897 velocityError -= penetration / infoGlobal.
m_timeStep;
900 positionalError = -penetration * erp/infoGlobal.
m_timeStep;
909 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
915 solverConstraint.
m_rhs = velocityImpulse;
918 solverConstraint.
m_cfm = 0.f;
931 int solverBodyIdA,
int solverBodyIdB,
998 int rollingFriction=1;
1024 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
1035 setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
1046 btVector3 angVelA(0,0,0),angVelB(0,0,0);
1062 if (relAngVel.
length()>0.001)
1074 if (axis0.
length()>0.001)
1076 if (axis1.
length()>0.001)
1141 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.
m_contactMotion1, cp.
m_contactCFM1);
1144 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.
m_contactMotion2, cp.
m_contactCFM2);
1163 for (i=0;i<numManifolds;i++)
1165 manifold = manifoldPtr[i];
1178 #ifdef BT_ADDITIONAL_DEBUG 1180 for (
int i=0;i<numConstraints;i++)
1188 for (
int b=0;b<numBodies;b++)
1202 for (
int b=0;b<numBodies;b++)
1215 for (
int i=0;i<numManifolds;i++)
1217 if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
1220 for (
int b=0;b<numBodies;b++)
1223 if (manifoldPtr[i]->getBody0()==bodies[b])
1231 if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
1234 for (
int b=0;b<numBodies;b++)
1236 if (manifoldPtr[i]->getBody1()==bodies[b])
1245 #endif //BT_ADDITIONAL_DEBUG 1248 for (
int i = 0; i < numBodies; i++)
1263 for (
int i=0;i<numBodies;i++)
1296 for (j=0;j<numConstraints;j++)
1310 int totalNumRows = 0;
1315 for (i=0;i<numConstraints;i++)
1327 if (constraints[i]->isEnabled())
1330 if (constraints[i]->isEnabled())
1346 for (i=0;i<numConstraints;i++)
1409 info2.
cfm = ¤tConstraintRow->
m_cfm;
1472 rel_vel = vel1Dotn+vel2Dotn;
1478 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1510 for (i=0;i<numNonContactPool;i++)
1514 for (i=0;i<numConstraintPool;i++)
1518 for (i=0;i<numFrictionPool;i++)
1541 for (
int j=0; j<numNonContactPool; ++j) {
1551 for (
int j=0; j<numConstraintPool; ++j) {
1558 for (
int j=0; j<numFrictionPool; ++j) {
1580 for (
int j=0;j<numConstraints;j++)
1582 if (constraints[j]->isEnabled())
1598 for (
int c=0;c<numPoolConstraints;c++)
1607 bool applyFriction =
true;
1646 for (j=0;j<numPoolConstraints;j++)
1658 for (j=0;j<numFrictionPoolConstraints;j++)
1674 for (j=0;j<numRollingFrictionPoolConstraints;j++)
1681 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1682 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1683 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1685 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1686 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1708 for (
int j=0;j<numConstraints;j++)
1710 if (constraints[j]->isEnabled())
1721 for (
int j=0;j<numPoolConstraints;j++)
1728 for (
int j=0;j<numFrictionPoolConstraints;j++)
1743 for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
1749 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1750 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1751 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1753 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1754 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1777 for (j=0;j<numPoolConstraints;j++)
1793 for (j=0;j<numPoolConstraints;j++)
1807 BT_PROFILE(
"solveGroupCacheFriendlyIterations");
1815 for (
int iteration = 0 ; iteration<
maxIterations ; iteration++)
1818 solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer);
1832 for (j=0;j<numPoolConstraints;j++)
1851 for (j=0;j<numPoolConstraints;j++)
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric()
btScalar * m_constraintError
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...
static btSimdScalar gResolveSingleConstraintRowGeneric_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
This is the scalar reference implementation of solving a single constraint row, the innerloop of the ...
int m_overrideNumSolverIterations
btScalar * m_J2angularAxis
virtual ~btSequentialImpulseConstraintSolver()
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
btVector3 m_lateralFrictionDir1
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btVector3 m_relpos1CrossNormal
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
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const
perform implicit force computation in world space
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
static btSimdScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
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)
btSimdScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
ManifoldContactPoint collects and maintains persistent contactpoints.
btScalar * m_J1angularAxis
const btCollisionObject * getBody0() const
btScalar m_contactMotion1
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const
btAlignedObjectArray< int > m_orderTmpConstraintPool
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 restitutionCurve(btScalar rel_vel, btScalar restitution)
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
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)
btTransform & getWorldTransform()
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const
explicit version is best avoided, it gains energy
btVector3 m_normalWorldOnB
btScalar * m_J1linearAxis
int size() const
return the number of elements in the array
btSimdScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
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
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
int m_maxOverrideNumSolverIterations
const btManifoldPoint & getContactPoint(int index) const
void setCompanionId(int id)
const btVector3 & internalGetInvMass() const
btSimdScalar resolveSingleConstraintRowGenericSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
const btVector3 & getPositionWorldOnB() const
btVector3 can be used to represent 3D points and vectors.
btSolverConstraint & addFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit()
int getCompanionId() const
btScalar length2() const
Return the length of the vector squared.
virtual void solveConstraintObsolete(btSolverBody &, btSolverBody &, btScalar)
internal method used by the constraint solver, don't use them directly
void convertContact(btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal)
btVector3 m_appliedTorqueBodyB
btSimdScalar m_appliedPushImpulse
btSolverConstraint & addRollingFrictionConstraint(const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, int frictionIndex, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0, btScalar cfmSlip=0.f)
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...
void * m_originalContactPoint
btAlignedObjectArray< btTypedConstraint::btConstraintInfo1 > m_tmpConstraintSizesPool
btScalar * m_J2linearAxis
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())
void setupFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btRigidBody * m_originalBody
void internalApplyPushImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, btScalar impulseMagnitude)
int getNumContacts() const
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them
const btRigidBody & getRigidBodyA() const
void resolveSplitPenetrationSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
int gNumSplitImpulseRecoveries
void setEnabled(bool enabled)
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
void setupRollingFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
btScalar m_contactMotion2
const btMatrix3x3 & getInvInertiaTensorWorld() const
btScalar m_combinedFriction
bool m_lateralFrictionInitialized
T & expand(const T &fillValue=T())
btVector3 m_appliedTorqueBodyA
const btVector3 & getPositionWorldOnA() const
btVector3 & internalGetPushVelocity()
btVector3 m_contactNormal1
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
btSimdScalar resolveSingleConstraintRowLowerLimitSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
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()
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
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btVector3 m_contactNormal2
void resolveSplitPenetrationImpulseCacheFriendly(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btScalar btFabs(btScalar x)
btSimdScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
btTransform m_worldTransform