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))
61 void 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");
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);
135 #ifdef VERBOSE_RESIDUAL_PRINTF
137 printf(
"split impulse residual = %f at iteration #%d\n", leastSquaresResidual, iteration);
void writeToSolverBody(btCollisionObject **bodies, int numBodies, const btContactSolverInfo &infoGlobal)
virtual void 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)
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...
btTypedConstraint(btTypedConstraintType type, btRigidBody &rbA)
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
const btVector3 & getAngularVelocity() const
btScalar getInvMass() const
static const btRigidBody * upcast(const btCollisionObject *colObj)
const btVector3 & getLinearVelocity() const
void setLinearVelocity(const btVector3 &lin_vel)
int m_numContactManifolds
double m_remainingLeastSquaresResidual