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
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
btScalar computeImpulseDenominator(const btVector3 &pos, const btVector3 &normal) const
virtual ~btSequentialImpulseConstraintSolver()
const btVector3 & getAngularVelocity() const
virtual void getInfo1(btConstraintInfo1 *info)=0
internal method used by the constraint solver, don't use them directly
btConstraintArray m_tmpSolverContactFrictionConstraintPool
btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool
const btVector3 & getPositionWorldOnA() const
btVector3 m_lateralFrictionDir1
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
const btVector3 & getTotalTorque() const
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const
explicit version is best avoided, it gains energy
btVector3 m_relpos1CrossNormal
void internalApplyImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, const btScalar impulseMagnitude)
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
btScalar length2() const
Return the length of the vector squared.
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
const btRigidBody & getRigidBodyA() const
int getNumContacts() const
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
bool isKinematicObject() const
btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit()
btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric
static btSimdScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
const btVector3 & getLinearFactor() const
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
const btVector3 & internalGetInvMass() const
btSimdScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
const btJointFeedback * getJointFeedback() const
ManifoldContactPoint collects and maintains persistent contactpoints.
btScalar * m_J1angularAxis
btScalar m_contactMotion1
btAlignedObjectArray< int > m_orderTmpConstraintPool
btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric()
Various implementations of solving a single constraint row using a generic equality constraint...
const btRigidBody & getRigidBodyB() const
btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit()
Various implementations of solving a single constraint row using an inequality (lower limit) constrai...
void initSolverBody(btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep)
btScalar getBreakingImpulseThreshold() const
bool isStaticOrKinematicObject() const
virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
const btVector3 & getAngularFactor() const
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution)
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.
btVector3 m_appliedForceBodyB
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
const btManifoldPoint & getContactPoint(int index) const
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)
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const
perform implicit force computation in world space
btTransform & getWorldTransform()
btVector3 m_normalWorldOnB
btScalar * m_J1linearAxis
btSimdScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btVector3 m_appliedForceBodyA
const btVector3 & getLinearVelocity() const
void setFrictionConstraintImpulse(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal)
const btVector3 & getAnisotropicFriction() const
const btVector3 & getPositionWorldOnB() const
virtual void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
const btCollisionObject * getBody0() const
btVector3 m_angularFactor
btScalar m_appliedImpulseLateral2
btScalar getInvMass() const
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
btConstraintArray m_tmpSolverContactConstraintPool
btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric()
int getOverrideNumSolverIterations() const
btCollisionObject can be used to manage collision detection objects.
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations...
The btRigidBody is the main class for rigid body objects.
btVector3 m_angularComponentB
btScalar getContactProcessingThreshold() const
int m_maxOverrideNumSolverIterations
void setCompanionId(int id)
btSimdScalar resolveSingleConstraintRowGenericSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btVector3 can be used to represent 3D points and vectors.
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const
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 size() const
return the number of elements in the array
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 getVelocityInLocalPoint(const btVector3 &rel_pos) const
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
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)
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them
const btCollisionObject * getBody1() 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
btScalar m_combinedFriction
bool m_lateralFrictionInitialized
T & expand(const T &fillValue=T())
btVector3 m_appliedTorqueBodyA
btVector3 & internalGetPushVelocity()
btVector3 m_contactNormal1
btAlignedObjectArray< int > m_orderFrictionConstraintPool
bool hasAnisotropicFriction(int frictionMode=CF_ANISOTROPIC_FRICTION) const
const btVector3 & getTotalForce() 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()
const btMatrix3x3 & getInvInertiaTensorWorld() const
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
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
T & expandNonInitializing()
btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
int getCompanionId() const
btScalar getDistance() const
btSequentialImpulseConstraintSolver()
btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const
perform implicit force computation in body space (inertial frame)
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 length() const
Return the length of the vector.
btScalar btFabs(btScalar x)
btSimdScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
btTransform m_worldTransform