26 for (
int iteration = 0; iteration < maxIterations; iteration++)
34 btScalar deformableResidual = m_deformableSolver->solveContactConstraints(deformableBodies, numDeformableBodies,
infoGlobal);
42#ifdef VERBOSE_RESIDUAL_PRINTF
43 if (iteration >= (maxIterations - 1))
61void btDeformableMultiBodyConstraintSolver::solveDeformableBodyGroup(btCollisionObject** bodies,
int numBodies, btCollisionObject** deformableBodies,
int numDeformableBodies,
btPersistentManifold** manifold,
int numManifolds, btTypedConstraint**
constraints,
int numConstraints, btMultiBodyConstraint** multiBodyConstraints,
int numMultiBodyConstraints,
const btContactSolverInfo& info,
btIDebugDraw* debugDrawer,
btDispatcher* dispatcher)
89 solverBody.m_linearVelocity = body->
getLinearVelocity() - solverBody.m_deltaLinearVelocity;
90 solverBody.m_angularVelocity = body->
getAngularVelocity() - solverBody.m_deltaAngularVelocity;
97 for (
int i = 0; i < m_tmpSolverBodyPool.size(); i++)
99 btRigidBody* body = m_tmpSolverBodyPool[i].m_originalBody;
110 BT_PROFILE(
"solveGroupCacheFriendlySplitImpulseIterations");
115 for (iteration = 0; iteration <
infoGlobal.m_numIterations; iteration++)
117 btScalar leastSquaresResidual = 0.f;
121 for (j = 0; j < numPoolConstraints; j++)
126 leastSquaresResidual =
btMax(leastSquaresResidual, residual * residual);
130 btScalar residual = m_deformableSolver->m_objective->m_projection.solveSplitImpulse(deformableBodies, numDeformableBodies,
infoGlobal);
131 leastSquaresResidual =
btMax(leastSquaresResidual, residual * residual);
133 if (leastSquaresResidual <= infoGlobal.m_leastSquaresResidualThreshold || iteration >= (
infoGlobal.m_numIterations - 1))
135#ifdef VERBOSE_RESIDUAL_PRINTF
136 if (iteration >= (
infoGlobal.m_numIterations - 1))
137 printf(
"split impulse residual = %f at iteration #%d\n", leastSquaresResidual, iteration);
void writeToSolverBody(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
virtual btScalar solveDeformableGroupIterations(btCollisionObject **bodies, int numBodies, btCollisionObject **deformableBodies, int numDeformableBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
void solverBodyWriteBack(const btContactSolverInfo &infoGlobal)
SIMD_FORCE_INLINE const T & btMax(const T &a, const T &b)
int m_tmpNumMultiBodyConstraints
btMultiBodyConstraint ** m_tmpMultiBodyConstraints
virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
virtual btScalar solveSingleIteration(int iteration, btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint ** constraints
btSequentialImpulseConstraintSolverMt int btPersistentManifold ** manifoldPtr
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint int numConstraints
btSequentialImpulseConstraintSolverMt int numBodies
btSequentialImpulseConstraintSolverMt int btPersistentManifold int btTypedConstraint int const btContactSolverInfo & infoGlobal
btSequentialImpulseConstraintSolverMt int btPersistentManifold int numManifolds
btAlignedObjectArray< int > m_orderTmpConstraintPool
int m_maxOverrideNumSolverIterations
virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifoldPtr, int numManifolds, btTypedConstraint **constraints, int numConstraints, const btContactSolverInfo &infoGlobal, btIDebugDraw *debugDrawer)
btSolverAnalyticsData m_analyticsData
btScalar m_leastSquaresResidual
btScalar resolveSplitPenetrationImpulse(btSolverBody &bodyA, btSolverBody &bodyB, const btSolverConstraint &contactConstraint)
btConstraintArray m_tmpSolverContactConstraintPool
int getOrInitSolverBody(btCollisionObject &body, btScalar timeStep)
btSolverBody
The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packe...
btVector3 m_deltaLinearVelocity
btVector3 m_angularVelocity
btVector3 m_deltaAngularVelocity
btVector3 m_linearVelocity
btSolverConstraint
1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and fr...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
btScalar getInvMass() const
const btVector3 & getAngularVelocity() const
void setLinearVelocity(const btVector3 &lin_vel)
static const btRigidBody * upcast(const btCollisionObject *colObj)
const btVector3 & getLinearVelocity() const
int m_numContactManifolds
double m_remainingLeastSquaresResidual