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 339 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
340 deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.
m_jacDiagABInv)));
343 resultLowerLess = _mm_cmplt_ps(
sum,lowerLimit1);
344 resultUpperLess = _mm_cmplt_ps(
sum,upperLimit1);
345 __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
346 deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
347 c.
m_appliedPushImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess,
sum) );
350 __m128 impulseMagnitude = deltaImpulse;
389 #endif//BT_ALLOW_SSE4 412 return gResolveSingleConstraintRowGeneric_sse2;
416 return gResolveSingleConstraintRowLowerLimit_sse2;
421 return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
425 return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
427 #endif //BT_ALLOW_SSE4 442 const unsigned long un =
static_cast<unsigned long>(n);
447 if (un <= 0x00010000UL) {
449 if (un <= 0x00000100UL) {
451 if (un <= 0x00000010UL) {
453 if (un <= 0x00000004UL) {
455 if (un <= 0x00000002UL) {
463 return (
int) (r % un);
514 if (
btFabs(rel_vel)<velocityThreshold)
517 btScalar rest = restitution * -rel_vel;
533 loc_lateral *= friction_scaling;
543 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)
602 btScalar denom = relaxation/(denom0+denom1);
615 rel_vel = vel1Dotn+vel2Dotn;
619 btScalar velocityError = desiredVelocity - rel_vel;
628 penetrationImpulse = positionalError*solverConstraint.
m_jacDiagABInv;
631 solverConstraint.
m_rhs = penetrationImpulse + velocityImpulse;
633 solverConstraint.
m_cfm = cfmSlip;
640 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)
645 colObj0, colObj1, relaxation, infoGlobal, desiredVelocity, cfmSlip);
646 return solverConstraint;
670 solverConstraint.
m_friction = combinedTorsionalFriction;
706 rel_vel = vel1Dotn+vel2Dotn;
712 solverConstraint.
m_rhs = velocityImpulse;
713 solverConstraint.
m_cfm = cfmSlip;
727 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)
732 colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
733 return solverConstraint;
740 int solverBodyId = -1;
746 if ( solverBodyId < 0 )
767 const int INVALID_SOLVER_BODY_ID = -1;
774 if ( solverBodyId == INVALID_SOLVER_BODY_ID )
797 #else // BT_THREADSAFE 799 int solverBodyIdA = -1;
830 return solverBodyIdA;
831 #endif // BT_THREADSAFE 838 int solverBodyIdA,
int solverBodyIdB,
858 relaxation = infoGlobal.
m_sor;
896 #ifdef COMPUTE_IMPULSE_DENOM 913 #endif //COMPUTE_IMPULSE_DENOM 915 btScalar denom = relaxation/(denom0+denom1+cfm);
991 btScalar rel_vel = vel1Dotn+vel2Dotn;
994 btScalar velocityError = restitution - rel_vel;
1000 positionalError = 0;
1002 velocityError -= penetration *invTimeStep;
1005 positionalError = -penetration * erp*invTimeStep;
1015 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1021 solverConstraint.
m_rhs = velocityImpulse;
1037 int solverBodyIdA,
int solverBodyIdB,
1104 int rollingFriction=1;
1128 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
1139 setupContactConstraint(solverConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2);
1152 addTorsionalFrictionConstraint(cp.
m_normalWorldOnB,solverBodyIdA,solverBodyIdB,frictionIndex,cp,cp.
m_combinedSpinningFriction, rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
1162 if (axis0.
length()>0.001)
1165 if (axis1.
length()>0.001)
1197 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,infoGlobal);
1205 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
1214 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
1220 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal);
1232 addFrictionConstraint(cp.
m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal, cp.
m_contactMotion1, cp.
m_frictionCFM);
1235 addFrictionConstraint(cp.
m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, infoGlobal, cp.
m_contactMotion2, cp.
m_frictionCFM);
1254 for (i=0;i<numManifolds;i++)
1256 manifold = manifoldPtr[i];
1277 #ifdef BT_ADDITIONAL_DEBUG 1279 for (
int i=0;i<numConstraints;i++)
1287 for (
int b=0;b<numBodies;b++)
1301 for (
int b=0;b<numBodies;b++)
1314 for (
int i=0;i<numManifolds;i++)
1316 if (!manifoldPtr[i]->getBody0()->isStaticOrKinematicObject())
1319 for (
int b=0;b<numBodies;b++)
1322 if (manifoldPtr[i]->getBody0()==bodies[b])
1330 if (!manifoldPtr[i]->getBody1()->isStaticOrKinematicObject())
1333 for (
int b=0;b<numBodies;b++)
1335 if (manifoldPtr[i]->getBody1()==bodies[b])
1344 #endif //BT_ADDITIONAL_DEBUG 1347 for (
int i = 0; i < numBodies; i++)
1353 #endif // BT_THREADSAFE 1364 for (
int i=0;i<numBodies;i++)
1397 for (j=0;j<numConstraints;j++)
1411 int totalNumRows = 0;
1416 for (i=0;i<numConstraints;i++)
1428 if (constraints[i]->isEnabled())
1431 if (constraints[i]->isEnabled())
1447 for (i=0;i<numConstraints;i++)
1510 info2.
cfm = ¤tConstraintRow->
m_cfm;
1574 rel_vel = vel1Dotn+vel2Dotn;
1580 solverConstraint.
m_rhs = penetrationImpulse+velocityImpulse;
1612 for (i=0;i<numNonContactPool;i++)
1616 for (i=0;i<numConstraintPool;i++)
1620 for (i=0;i<numFrictionPool;i++)
1633 btScalar leastSquaresResidual = 0.f;
1644 for (
int j=0; j<numNonContactPool; ++j) {
1654 for (
int j=0; j<numConstraintPool; ++j) {
1661 for (
int j=0; j<numFrictionPool; ++j) {
1678 leastSquaresResidual += residual*residual;
1684 for (
int j=0;j<numConstraints;j++)
1686 if (constraints[j]->isEnabled())
1702 for (
int c=0;c<numPoolConstraints;c++)
1709 leastSquaresResidual += residual*residual;
1713 bool applyFriction =
true;
1726 leastSquaresResidual += residual*residual;
1741 leastSquaresResidual += residual*residual;
1754 for (j=0;j<numPoolConstraints;j++)
1758 leastSquaresResidual += residual*residual;
1766 for (j=0;j<numFrictionPoolConstraints;j++)
1777 leastSquaresResidual += residual*residual;
1784 for (
int j=0;j<numRollingFrictionPoolConstraints;j++)
1791 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1792 if (rollingFrictionMagnitude>rollingFrictionConstraint.
m_friction)
1793 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1795 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1796 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1799 leastSquaresResidual += residual*residual;
1805 return leastSquaresResidual;
1817 btScalar leastSquaresResidual =0.f;
1821 for (j=0;j<numPoolConstraints;j++)
1826 leastSquaresResidual += residual*residual;
1829 if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration>=(infoGlobal.
m_numIterations-1))
1831 #ifdef VERBOSE_RESIDUAL_PRINTF 1832 printf(
"residual = %f at iteration #%d\n",leastSquaresResidual,iteration);
1843 BT_PROFILE(
"solveGroupCacheFriendlyIterations");
1851 for (
int iteration = 0 ; iteration<
maxIterations ; iteration++)
1858 #ifdef VERBOSE_RESIDUAL_PRINTF 1876 for (j=0;j<numPoolConstraints;j++)
1895 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
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
btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool
const btVector3 & getPositionWorldOnA() const
btScalar m_combinedContactStiffness1
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
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
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.)
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
void setupSolverFunctions(bool useSimd)
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)
int getWorldArrayIndex() const
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
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
btSimdScalar resolveSplitPenetrationImpulse(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
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
btScalar * m_J2linearAxis
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)
static btSimdScalar gResolveSplitPenetrationImpulse_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them
const btCollisionObject * getBody1() const
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold)
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)
btScalar m_contactMotion2
btScalar m_combinedFriction
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)
static btSimdScalar gResolveSplitPenetrationImpulse_sse2(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
btVector3 & internalGetPushVelocity()
btVector3 m_contactNormal1
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
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...
btScalar m_combinedSpinningFriction
btVector3 m_contactNormal2
btScalar length() const
Return the length of the vector.
btAlignedObjectArray< int > m_kinematicBodyUniqueIdToSolverBodyTable
btScalar btFabs(btScalar x)
btSimdScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
btTransform m_worldTransform
btSingleConstraintRowSolver m_resolveSplitPenetrationImpulse
btScalar m_leastSquaresResidual