109 setupContactConstraint( contactConstraint, solverBodyIdA, solverBodyIdB, cp, infoGlobal, relaxation, rel_pos1, rel_pos2 );
113 if (rollingFrictionIndex >= 0)
141 if (axis[1].length2() > axis[0].length2())
145 const btScalar kRollingFrictionThreshold = 0.001f;
146 for (
int i = 0; i < 2; ++i)
148 int iRollingFric = rollingFrictionIndex + 1 + i;
152 if ( dir.
length() > kRollingFrictionThreshold )
213 setupFrictionConstraint( *frictionConstraint1, cp.
m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
215 if ( frictionConstraint2 )
221 setupFrictionConstraint( *frictionConstraint2, cp.
m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
230 setupFrictionConstraint( *frictionConstraint1, cp.
m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
232 if ( frictionConstraint2 )
236 setupFrictionConstraint( *frictionConstraint2, cp.
m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal );
247 setupFrictionConstraint( *frictionConstraint1, cp.
m_lateralFrictionDir1, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.
m_contactMotion1, cp.
m_frictionCFM );
248 if ( frictionConstraint2 )
250 setupFrictionConstraint( *frictionConstraint2, cp.
m_lateralFrictionDir2, solverBodyIdA, solverBodyIdB, cp, rel_pos1, rel_pos2, colObj0, colObj1, relaxation, infoGlobal, cp.
m_contactMotion2, cp.
m_frictionCFM );
269 m_infoGlobal = &infoGlobal;
274 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
277 for (
int i = batch.
begin; i < batch.
end; ++i)
294 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
319 int solverBodyId = -1;
326 if ( solverBodyId < 0 )
331 if ( solverBodyId < 0 )
351 const int INVALID_SOLVER_BODY_ID = -1;
364 if ( INVALID_SOLVER_BODY_ID == solverBodyId )
371 if ( INVALID_SOLVER_BODY_ID == solverBodyId )
407 BT_PROFILE(
"internalCollectContactManifoldCachedInfo");
408 for (
int i = 0; i < numManifolds; ++i)
457 m_cachedInfoArray = cachedInfoArray;
458 m_manifoldPtr = manifoldPtr;
459 m_infoGlobal = &infoGlobal;
470 BT_PROFILE(
"internalAllocContactConstraints");
472 for (
int iManifold = 0; iManifold < numManifolds; ++iManifold )
499 for (
int i = 0; i < 3; i++ )
502 rollingFrictionIndex++;
524 m_cachedInfoArray = cachedInfoArray;
554 int numRollingFrictionConstraints = 0;
555 for (
int iManifold = 0; iManifold < numManifolds; ++iManifold )
565 numRollingFrictionConstraints += 3;
574 int extraReserve = numContacts / 16;
602 if (numManifolds > 0)
623 for (
int i = iBegin; i < iEnd; i++ )
658 m_constraints = constraints;
670 for (
int i = iBegin; i < iEnd; ++i )
672 const JointParams& jointParams = jointParamsArray[ i ];
674 if ( currentRow != -1 )
701 m_jointParamsArray(jointParamsArray),
702 m_infoGlobal(infoGlobal)
705 m_srcConstraints = srcConstraints;
722 bool parallelJointSetup =
true;
724 if (parallelJointSetup)
735 int totalNumRows = 0;
740 for (
int i=0;i<numConstraints;i++)
762 if ( parallelJointSetup )
779 for (
int i=iBegin; i < iEnd; i++)
822 m_infoGlobal(infoGlobal)
826 m_numBodies = numBodies;
848 bool parallelBodySetup =
true;
849 if (parallelBodySetup)
898 btScalar leastSquaresResidual = 0.f;
899 for (
int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
901 int iCons = consIndices[ iiCons ];
906 leastSquaresResidual += residual*residual;
908 return leastSquaresResidual;
924 BT_PROFILE(
"ContactSplitPenetrationImpulseSolverLoop" );
926 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
938 BT_PROFILE(
"solveGroupCacheFriendlySplitImpulseIterations");
941 for (
int iteration = 0; iteration < infoGlobal.
m_numIterations; iteration++ )
943 btScalar leastSquaresResidual = 0.f;
948 btScalar leastSquaresResidual = 0.f;
949 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
962 if ( leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration >= ( infoGlobal.
m_numIterations - 1 ) )
964 #ifdef VERBOSE_RESIDUAL_PRINTF 965 printf(
"residual = %f at iteration #%d\n", leastSquaresResidual, iteration );
981 btScalar leastSquaresResidual = 0.f;
1001 for (
int j = 0; j<numConstraints; j++ )
1003 if ( constraints[ j ]->isEnabled() )
1033 return leastSquaresResidual;
1039 btScalar leastSquaresResidual = 0.f;
1040 for (
int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
1042 int iCons = consIndices[ iiCons ];
1049 leastSquaresResidual += residual*residual;
1052 return leastSquaresResidual;
1058 btScalar leastSquaresResidual = 0.f;
1059 for (
int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
1061 int iCons = consIndices[ iiCons ];
1066 leastSquaresResidual += residual*residual;
1068 return leastSquaresResidual;
1074 btScalar leastSquaresResidual = 0.f;
1075 for (
int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
1077 int iContact = consIndices[ iiCons ];
1081 if ( totalImpulse > 0.0f )
1085 for (
int iFriction = iBegin; iFriction < iEnd; ++iFriction )
1096 leastSquaresResidual += residual*residual;
1100 return leastSquaresResidual;
1106 btScalar leastSquaresResidual = 0.f;
1107 for (
int iiCons = batchBegin; iiCons < batchEnd; ++iiCons )
1109 int iContact = consIndices[ iiCons ];
1111 if ( iFirstRollingFriction >= 0 )
1115 if ( totalImpulse > 0.0f )
1117 int iBegin = iFirstRollingFriction;
1118 int iEnd = iBegin + 3;
1119 for (
int iRollingFric = iBegin; iRollingFric < iEnd; ++iRollingFric )
1126 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1127 if ( rollingFrictionMagnitude > rollingFrictionConstraint.
m_friction )
1129 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1132 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1133 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1136 leastSquaresResidual += residual*residual;
1141 return leastSquaresResidual;
1150 btScalar leastSquaresResidual = 0.f;
1153 for (
int iiCons = batchBegin; iiCons < batchEnd; iiCons++ )
1156 int iContact = contactIndices[ iiCons ];
1161 leastSquaresResidual += residual*residual;
1166 if ( totalImpulse > 0.0f )
1170 for (
int iFriction = iBegin; iFriction < iEnd; ++iFriction )
1181 leastSquaresResidual += residual*residual;
1187 if ( totalImpulse > 0.0f && iFirstRollingFriction >= 0)
1189 int iBegin = iFirstRollingFriction;
1190 int iEnd = iBegin + 3;
1191 for (
int iRollingFric = iBegin; iRollingFric < iEnd; ++iRollingFric )
1198 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1199 if ( rollingFrictionMagnitude > rollingFrictionConstraint.
m_friction )
1201 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1204 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1205 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1208 leastSquaresResidual += residual*residual;
1212 return leastSquaresResidual;
1227 for (
int iBatch = 0; iBatch < bc.
m_batches.size(); ++iBatch )
1231 for (
int iiCons = batch.
begin; iiCons < batch.
end; ++iiCons )
1247 if ( iteration < numIterations )
1264 m_iteration = iteration;
1270 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
1285 btScalar leastSquaresResidual = 0.f;
1286 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
1293 return leastSquaresResidual;
1311 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
1323 BT_PROFILE(
"resolveAllContactConstraints" );
1326 btScalar leastSquaresResidual = 0.f;
1327 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
1334 return leastSquaresResidual;
1352 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
1364 BT_PROFILE(
"resolveAllContactFrictionConstraints" );
1367 btScalar leastSquaresResidual = 0.f;
1368 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
1375 return leastSquaresResidual;
1391 BT_PROFILE(
"InterleavedContactSolverLoop" );
1393 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
1405 BT_PROFILE(
"resolveAllContactConstraintsInterleaved" );
1408 btScalar leastSquaresResidual = 0.f;
1409 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
1416 return leastSquaresResidual;
1434 for (
int iBatch = iBegin; iBatch < iEnd; ++iBatch )
1446 BT_PROFILE(
"resolveAllRollingFrictionConstraints" );
1447 btScalar leastSquaresResidual = 0.f;
1470 btScalar leastSquaresResidual = 0.f;
1471 for (
int iiPhase = 0; iiPhase < batchedCons.
m_phases.size(); ++iiPhase )
1482 for (
int j = 0; j < numRollingFrictionPoolConstraints; j++ )
1488 if ( totalImpulse > 0.0f )
1490 btScalar rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction*totalImpulse;
1491 if ( rollingFrictionMagnitude > rollingFrictionConstraint.
m_friction )
1492 rollingFrictionMagnitude = rollingFrictionConstraint.
m_friction;
1494 rollingFrictionConstraint.
m_lowerLimit = -rollingFrictionMagnitude;
1495 rollingFrictionConstraint.
m_upperLimit = rollingFrictionMagnitude;
1498 leastSquaresResidual += residual*residual;
1503 return leastSquaresResidual;
1548 m_infoGlobal = &infoGlobal;
1565 m_infoGlobal = &infoGlobal;
1582 m_infoGlobal = &infoGlobal;
1598 int grainSize = 500;
1604 int grainSize = 400;
1609 int grainSize = 100;
btScalar getInvMass() const
static T sum(const btAlignedObjectArray< T > &items)
static const btRigidBody * upcast(const btCollisionObject *colObj)
to keep collision detection and dynamics separate we don't store a rigidbody pointer but a rigidbody ...
void internalAllocContactConstraints(const btContactManifoldCachedInfo *cachedInfoArray, int numManifolds)
btScalar resolveMultipleContactSplitPenetrationImpulseConstraints(const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd)
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
WriteJointsLoop(btSequentialImpulseConstraintSolverMt *solver, const btContactSolverInfo &infoGlobal)
virtual void convertContacts(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal) BT_OVERRIDE
btSpinMutex m_bodySolverArrayMutex
int m_overrideNumSolverIterations
btTypedConstraint ** m_srcConstraints
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
btVector3 m_lateralFrictionDir1
virtual btScalar resolveAllJointConstraints(int iteration)
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) BT_OVERRIDE
btScalar sumLoop(int iBegin, int iEnd) const BT_OVERRIDE
btScalar resolveMultipleContactRollingFrictionConstraints(const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd)
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
virtual ~btSequentialImpulseConstraintSolverMt()
virtual void convertBodies(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) BT_OVERRIDE
btVector3 computeGyroscopicImpulseImplicit_World(btScalar dt) const
perform implicit force computation in world space
virtual void setupBatchedContactConstraints()
void internalSetupContactConstraints(int iContactConstraint, const btContactSolverInfo &infoGlobal)
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)
virtual void randomizeConstraintOrdering(int iteration, int numIterations)
virtual btScalar resolveAllContactFrictionConstraints()
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btAlignedObjectArray< int > m_rollingFrictionIndexTable
ManifoldContactPoint collects and maintains persistent contactpoints.
btAlignedObjectArray< int > m_phaseOrder
const btCollisionObject * getBody0() const
btScalar m_contactMotion1
void getVelocityInLocalPointNoDelta(const btVector3 &rel_pos, btVector3 &velocity) const
const btContactSolverInfo * m_infoGlobal
btAlignedObjectArray< int > m_orderTmpConstraintPool
static btBatchedConstraints::BatchingMethod s_jointBatchingMethod
static btBatchedConstraints::BatchingMethod s_contactBatchingMethod
void initSolverBody(btSolverBody *solverBody, btCollisionObject *collisionObject, btScalar timeStep)
btSequentialImpulseConstraintSolverMt * m_solver
btScalar resolveSingleConstraintRowLowerLimit(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
void swap(int index0, int index1)
btScalar dot(const btVector3 &v) const
Return the dot product.
WriteBodiesLoop(btSequentialImpulseConstraintSolverMt *solver, const btContactSolverInfo &infoGlobal)
btVector3 m_externalTorqueImpulse
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
btVector3 m_appliedForceBodyB
btSequentialImpulseConstraintSolverMt * m_solver
void internalConvertMultipleJoints(const btAlignedObjectArray< JointParams > &jointParamsArray, btTypedConstraint **constraints, int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
const btJointFeedback * getJointFeedback() const
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
virtual btScalar resolveAllContactConstraints()
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
BT_ENABLE_GYROPSCOPIC_FORCE flags is enabled by default in Bullet 2.83 and onwards.
virtual btScalar resolveAllRollingFrictionConstraints()
const btAlignedObjectArray< btSequentialImpulseConstraintSolverMt::JointParams > & m_jointParamsArray
static int s_minimumContactManifoldsForBatching
btScalar m_combinedRollingFriction
btAlignedObjectArray< btSolverBody > m_tmpSolverBodyPool
const btContactSolverInfo & m_infoGlobal
btSpinMutex m_kinematicBodyUniqueIdToSolverBodyTableMutex
void setupTorsionalFrictionConstraint(btSolverConstraint &solverConstraint, const btVector3 &normalAxis, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, btScalar combinedTorsionalFriction, const btVector3 &rel_pos1, const btVector3 &rel_pos2, btCollisionObject *colObj0, btCollisionObject *colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.)
int getWorldArrayIndex() const
static bool s_allowNestedParallelForLoops
btVector3 computeGyroscopicForceExplicit(btScalar maxGyroscopicForce) const
explicit version is best avoided, it gains energy
btVector3 m_normalWorldOnB
int size() const
return the number of elements in the array
btVector3 m_appliedForceBodyA
bool btThreadsAreRunning()
void internalCollectContactManifoldCachedInfo(btContactManifoldCachedInfo *cachedInfoArray, btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
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)
const btContactSolverInfo * m_infoGlobal
void randomizeBatchedConstraintOrdering(btBatchedConstraints *batchedConstraints)
virtual btScalar resolveAllContactConstraintsInterleaved()
btSequentialImpulseConstraintSolverMt()
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
btConstraintArray m_tmpSolverContactConstraintPool
void internalConvertBodies(btCollisionObject **bodies, int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
bool isStaticOrKinematicObject() const
btCollisionObject can be used to manage collision detection objects.
virtual void setupBatchedJointConstraints()
btScalar getContactProcessingThreshold() const
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations...
void internalInitMultipleJoints(btTypedConstraint **constraints, int iBegin, int iEnd)
btAlignedObjectArray< Range > m_phases
The btRigidBody is the main class for rigid body objects.
btScalar length() const
Return the length of the vector.
btSequentialImpulseConstraintSolverMt
btAlignedObjectArray< int > m_constraintIndices
void writeBackContacts(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
const btManifoldPoint & getContactPoint(int index) const
ConvertJointsLoop(btSequentialImpulseConstraintSolverMt *solver, const btAlignedObjectArray< btSequentialImpulseConstraintSolverMt::JointParams > &jointParamsArray, btTypedConstraint **srcConstraints, const btContactSolverInfo &infoGlobal)
void setCompanionId(int id)
btScalar resolveMultipleContactConstraintsInterleaved(const btAlignedObjectArray< int > &contactIndices, int batchBegin, int batchEnd)
btSequentialImpulseConstraintSolverMt * m_solver
btScalar resolveMultipleContactFrictionConstraints(const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd)
btBatchedConstraints m_batchedContactConstraints
int capacity() const
return the pre-allocated (reserved) elements, this is at least as large as the total number of elemen...
const btVector3 & getPositionWorldOnB() const
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
btVector3 can be used to represent 3D points and vectors.
bool m_useObsoleteJointConstraints
int getCompanionId() const
btScalar length2() const
Return the length of the vector squared.
btScalar resolveSplitPenetrationImpulse(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
virtual void solveConstraintObsolete(btSolverBody &, btSolverBody &, btScalar)
internal method used by the constraint solver, don't use them directly
btAlignedObjectArray< char > m_phaseGrainSize
btScalar resolveMultipleContactConstraints(const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd)
btVector3 m_appliedTorqueBodyB
btAlignedObjectArray< char > m_scratchMemory
void setup(btConstraintArray *constraints, const btAlignedObjectArray< btSolverBody > &bodies, BatchingMethod batchingMethod, int minBatchSize, int maxBatchSize, btAlignedObjectArray< char > *scratchMemory)
const btBatchedConstraints * m_bc
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...
void * m_originalContactPoint
btAlignedObjectArray< btTypedConstraint::btConstraintInfo1 > m_tmpConstraintSizesPool
JointSolverLoop(btSequentialImpulseConstraintSolverMt *solver, const btBatchedConstraints *bc, int iteration)
int m_numFrictionDirections
TypedConstraint is the baseclass for Bullet constraints and vehicles.
void resize(int newsize, const T &fillData=T())
btRigidBody * m_originalBody
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) BT_OVERRIDE
int getNumContacts() const
const btRigidBody & getRigidBodyA() const
btTypedConstraint ** m_constraints
void setupAllContactConstraints(const btContactSolverInfo &infoGlobal)
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
int getOrInitSolverBodyThreadsafe(btCollisionObject &body, btScalar timeStep)
static int s_maxBatchSize
btScalar btParallelSum(int iBegin, int iEnd, int grainSize, const btIParallelSumBody &body)
btIDebugDraw * m_debugDrawer
btScalar m_contactMotion2
const btMatrix3x3 & getInvInertiaTensorWorld() const
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal) BT_OVERRIDE
void allocAllContactConstraints(btPersistentManifold **manifoldPtr, int numManifolds, const btContactSolverInfo &infoGlobal)
virtual void convertJoints(btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal)
T & expand(const T &fillValue=T())
btVector3 m_appliedTorqueBodyA
const btVector3 & getPositionWorldOnA() const
btSequentialImpulseConstraintSolverMt * m_solver
void writeBackBodies(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
const btContactSolverInfo & m_infoGlobal
void setupContactConstraint(btSolverConstraint &solverConstraint, int solverBodyIdA, int solverBodyIdB, btManifoldPoint &cp, const btContactSolverInfo &infoGlobal, btScalar &relaxation, const btVector3 &rel_pos1, const btVector3 &rel_pos2)
InitJointsLoop(btSequentialImpulseConstraintSolverMt *solver, btTypedConstraint **constraints)
const btTransform & getWorldTransform() const
void btParallelFor(int iBegin, int iEnd, int grainSize, const btIParallelForBody &body)
void forLoop(int iBegin, int iEnd) const BT_OVERRIDE
void internalWriteBackBodies(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
virtual void convertJoints(btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal) BT_OVERRIDE
void internalSetAppliedImpulse(btScalar appliedImpulse)
internal method used by the constraint solver, don't use them directly
btVector3 m_lateralFrictionDir2
btSimdScalar m_appliedImpulse
btScalar getDistance() const
btScalar resolveMultipleJointConstraints(const btAlignedObjectArray< int > &consIndices, int batchBegin, int batchEnd, int iteration)
btVector3 computeGyroscopicImpulseImplicit_Body(btScalar step) const
perform implicit force computation in body space (inertial frame)
btScalar resolveSingleConstraintRowGeneric(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btSequentialImpulseConstraintSolverMt * m_solver
const btRigidBody & getRigidBodyB() const
static void applyAnisotropicFriction(btCollisionObject *colObj, btVector3 &frictionDirection, int frictionMode)
btSequentialImpulseConstraintSolverMt * m_solver
const btCollisionObject * getBody1() const
void internalWriteBackJoints(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
virtual void buildJacobian()
internal method used by the constraint solver, don't use them directly
btAlignedObjectArray< Range > m_batches
btConstraintArray m_tmpSolverNonContactConstraintPool
void convertJoint(btSolverConstraint *currentConstraintRow, btTypedConstraint *constraint, const btTypedConstraint::btConstraintInfo1 &info1, int solverBodyIdA, int solverBodyIdB, const btContactSolverInfo &infoGlobal)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar m_combinedSpinningFriction
btCollisionObject ** m_bodies
ConvertBodiesLoop(btSequentialImpulseConstraintSolverMt *solver, btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
btBatchedConstraints m_batchedJointConstraints
virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer) BT_OVERRIDE
btAlignedObjectArray< int > m_kinematicBodyUniqueIdToSolverBodyTable
static int s_minBatchSize
void internalWriteBackContacts(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)
void writeBackJoints(int iBegin, int iEnd, const btContactSolverInfo &infoGlobal)