105#include <emmintrin.h>
108#define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))
109static 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);
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;
412 return gResolveSingleConstraintRowGeneric_sse2;
416 return gResolveSingleConstraintRowLowerLimit_sse2;
421 return gResolveSingleConstraintRowGeneric_sse4_1_fma3;
425 return gResolveSingleConstraintRowLowerLimit_sse4_1_fma3;
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;
543void 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;
640btSolverConstraint&
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;
727btSolverConstraint&
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 )
799 int solverBodyIdA = -1;
830 return solverBodyIdA;
838 int solverBodyIdA,
int solverBodyIdB,
858 relaxation = infoGlobal.
m_sor;
896#ifdef 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])
1347 for (
int i = 0; i < numBodies; i++)
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++)
@ BT_CONTACT_FLAG_LATERAL_FRICTION_INITIALIZED
@ BT_CONTACT_FLAG_HAS_CONTACT_ERP
@ BT_CONTACT_FLAG_HAS_CONTACT_CFM
@ BT_CONTACT_FLAG_CONTACT_STIFFNESS_DAMPING
@ BT_CONTACT_FLAG_FRICTION_ANCHOR
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
@ BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_BODY
@ BT_ENABLE_GYROSCOPIC_FORCE_EXPLICIT
BT_ENABLE_GYROPSCOPIC_FORCE flags is enabled by default in Bullet 2.83 and onwards.
@ BT_ENABLE_GYROSCOPIC_FORCE_IMPLICIT_WORLD
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btSqrt(btScalar y)
btScalar btFabs(btScalar x)
static btSimdScalar gResolveSplitPenetrationImpulse_sse2(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
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 gNumSplitImpulseRecoveries
static btSimdScalar gResolveSplitPenetrationImpulse_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
static btSimdScalar gResolveSingleConstraintRowLowerLimit_scalar_reference(btSolverBody &body1, btSolverBody &body2, const btSolverConstraint &c)
btSimdScalar(* btSingleConstraintRowSolver)(btSolverBody &, btSolverBody &, const btSolverConstraint &)
static T sum(const btAlignedObjectArray< T > &items)
#define btSimdScalar
Until we get other contributions, only use SIMD on Windows, when using Visual Studio 2008 or later,...
void btPlaneSpace1(const T &n, T &p, T &q)
void resizeNoInitialize(int newsize)
resize changes the number of elements in the array.
int size() const
return the number of elements in the array
T & expandNonInitializing()
btCollisionObject can be used to manage collision detection objects.
bool isStaticOrKinematicObject() const
btTransform & getWorldTransform()
const btVector3 & getAnisotropicFriction() const
int getWorldArrayIndex() const
bool hasAnisotropicFriction(int frictionMode=CF_ANISOTROPIC_FRICTION) const
void setCompanionId(int id)
bool isKinematicObject() const
@ CF_ANISOTROPIC_ROLLING_FRICTION
@ CF_ANISOTROPIC_FRICTION
int getCompanionId() const
static int getCpuFeatures()
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
ManifoldContactPoint collects and maintains persistent contactpoints.
btScalar m_combinedSpinningFriction
btScalar m_combinedRollingFriction
btScalar getDistance() const
btScalar m_combinedContactStiffness1
btScalar m_combinedRestitution
btVector3 m_lateralFrictionDir2
btScalar m_combinedContactDamping1
const btVector3 & getPositionWorldOnB() const
btScalar m_appliedImpulseLateral2
const btVector3 & getPositionWorldOnA() const
btScalar m_appliedImpulse
btScalar m_appliedImpulseLateral1
btVector3 m_normalWorldOnB
btScalar m_combinedFriction
btScalar m_contactMotion2
btVector3 m_lateralFrictionDir1
btScalar m_contactMotion1
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
const btManifoldPoint & getContactPoint(int index) const
const btCollisionObject * getBody0() const
const btCollisionObject * getBody1() const
int getNumContacts() const
btScalar getContactProcessingThreshold() const
The btRigidBody is the main class for rigid body objects.
btVector3 getVelocityInLocalPoint(const btVector3 &rel_pos) const
const btVector3 & getTotalTorque() const
btScalar getInvMass() const
const btVector3 & getLinearFactor() const
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const
perform implicit force computation in world space
btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const
perform implicit force computation in body space (inertial frame)
const btVector3 & getAngularVelocity() const
const btVector3 & getTotalForce() const
const btVector3 & getAngularFactor() const
btScalar computeImpulseDenominator(const btVector3 &pos, const btVector3 &normal) const
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don't store a rigidbody pointer but a rigidbody ...
const btMatrix3x3 & getInvInertiaTensorWorld() const
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const
explicit version is best avoided, it gains energy
const btVector3 & getLinearVelocity() const
btSimdScalar resolveSplitPenetrationImpulse(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btSingleConstraintRowSolver getScalarConstraintRowSolverLowerLimit()
Various implementations of solving a single constraint row using an inequality (lower limit) constrai...
void initSolverBody(btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep)
btSingleConstraintRowSolver getSSE2ConstraintRowSolverGeneric()
btConstraintArray m_tmpSolverContactConstraintPool
int m_maxOverrideNumSolverIterations
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.)
btSimdScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btConstraintArray m_tmpSolverContactFrictionConstraintPool
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
btAlignedObjectArray< int > m_orderFrictionConstraintPool
virtual ~btSequentialImpulseConstraintSolver()
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
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)
virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
unsigned long m_btSeed2
m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction
virtual void reset()
clear internal cached data and reset random seed
virtual void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
btSimdScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
void setupSolverFunctions(bool useSimd)
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
btSingleConstraintRowSolver getSSE2ConstraintRowSolverLowerLimit()
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.)
btScalar m_leastSquaresResidual
void convertContact(btPersistentManifold *manifold, const btContactSolverInfo &infoGlobal)
btAlignedObjectArray< btSolverBody > m_tmpSolverBodyPool
btSingleConstraintRowSolver m_resolveSingleConstraintRowLowerLimit
btSingleConstraintRowSolver getScalarConstraintRowSolverGeneric()
Various implementations of solving a single constraint row using a generic equality constraint,...
btSingleConstraintRowSolver m_resolveSplitPenetrationImpulse
btAlignedObjectArray< btTypedConstraint::btConstraintInfo1 > m_tmpConstraintSizesPool
btAlignedObjectArray< int > m_orderTmpConstraintPool
btSimdScalar resolveSingleConstraintRowLowerLimitSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btAlignedObjectArray< int > m_orderNonContactConstraintPool
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverGeneric()
btAlignedObjectArray< int > m_kinematicBodyUniqueIdToSolverBodyTable
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
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.)
btConstraintArray m_tmpSolverNonContactConstraintPool
btSingleConstraintRowSolver m_resolveSingleConstraintRowGeneric
btSimdScalar resolveSingleConstraintRowGenericSIMD(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btSequentialImpulseConstraintSolver()
btConstraintArray m_tmpSolverContactRollingFrictionConstraintPool
void setFrictionConstraintImpulse(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal)
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution, btScalar velocityThreshold)
btSingleConstraintRowSolver getSSE4_1ConstraintRowSolverLowerLimit()
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
void setupContactConstraint(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btScalar &relaxation, const btVector3 &rel_pos1, const btVector3 &rel_pos2)
TypedConstraint is the baseclass for Bullet constraints and vehicles.
virtual void solveConstraintObsolete(btSolverBody &, btSolverBody &, btScalar)
internal method used by the constraint solver, don't use them directly
void setEnabled(bool enabled)
int getOverrideNumSolverIterations() const
virtual void buildJacobian()
internal method used by the constraint solver, don't use them directly
virtual void getInfo2(btConstraintInfo2 *info)=0
internal method used by the constraint solver, don't use them directly
void internalSetAppliedImpulse(btScalar appliedImpulse)
internal method used by the constraint solver, don't use them directly
const btRigidBody & getRigidBodyA() const
btScalar getBreakingImpulseThreshold() const
const btRigidBody & getRigidBodyB() const
virtual void getInfo1(btConstraintInfo1 *info)=0
internal method used by the constraint solver, don't use them directly
const btJointFeedback * getJointFeedback() const
btVector3 can be used to represent 3D points and vectors.
btScalar length() const
Return the length of the vector.
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.
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
btScalar length2() const
Return the length of the vector squared.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
btVector3 m_appliedForceBodyA
btVector3 m_appliedTorqueBodyA
btVector3 m_appliedForceBodyB
btVector3 m_appliedTorqueBodyB
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...
btVector3 & internalGetDeltaAngularVelocity()
btVector3 m_angularVelocity
btRigidBody * m_originalBody
void internalApplyPushImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, btScalar impulseMagnitude)
btVector3 & internalGetTurnVelocity()
btVector3 m_linearVelocity
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const
btTransform m_worldTransform
btVector3 & internalGetPushVelocity()
btVector3 & internalGetDeltaLinearVelocity()
some internal methods, don't use them
void internalSetInvMass(const btVector3 &invMass)
btVector3 m_angularFactor
void internalApplyImpulse(const btVector3 &linearComponent, const btVector3 &angularComponent, const btScalar impulseMagnitude)
btVector3 m_externalTorqueImpulse
const btVector3 & internalGetInvMass() const
btVector3 m_externalForceImpulse
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
void * m_originalContactPoint
btVector3 m_contactNormal2
btVector3 m_relpos1CrossNormal
btVector3 m_angularComponentB
btSimdScalar m_appliedImpulse
int m_overrideNumSolverIterations
btScalar m_rhsPenetration
btVector3 m_angularComponentA
btSimdScalar m_appliedPushImpulse
btVector3 m_relpos2CrossNormal
btVector3 m_contactNormal1
btScalar * m_J2angularAxis
btScalar * m_J1linearAxis
btScalar * m_J2linearAxis
btScalar * m_J1angularAxis
btScalar * m_constraintError