296 btTypedConstraint** constraintsPtr =
getNumConstraints() ? &m_sortedConstraints[0] : 0;
310#ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
317 bool isSleeping =
false;
319 if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() ==
ISLAND_SLEEPING)
323 for (
int b = 0;
b < bod->getNumLinks();
b++)
325 if (bod->getLink(
b).m_collider && bod->getLink(
b).m_collider->getActivationState() ==
ISLAND_SLEEPING)
336 bod->addBaseForce(
m_gravity * bod->getBaseMass());
338 for (
int j = 0; j < bod->getNumLinks(); ++j)
340 bod->addLinkForce(j,
m_gravity * bod->getLinkMass(j));
353 bool isSleeping =
false;
355 if (bod->getBaseCollider() && bod->getBaseCollider()->getActivationState() ==
ISLAND_SLEEPING)
359 for (
int b = 0;
b < bod->getNumLinks();
b++)
361 if (bod->getLink(
b).m_collider && bod->getLink(
b).m_collider->getActivationState() ==
ISLAND_SLEEPING)
371 bool doNotUpdatePos =
false;
372 bool isConstraintPass =
false;
374 if (!bod->isUsingRK4Integration())
376 bod->computeAccelerationsArticulatedBodyAlgorithmMultiDof(solverInfo.
m_timeStep,
378 getSolverInfo().m_jointFeedbackInWorldSpace,
379 getSolverInfo().m_jointFeedbackInJointFrame);
384 int numDofs = bod->getNumDofs() + 6;
385 int numPosVars = bod->getNumPosVars() + 7;
387 scratch_r2.
resize(2 * numPosVars + 8 * numDofs);
410 btAssert((pMem - (2 * numPosVars + 8 * numDofs)) == &scratch_r2[0]);
414 scratch_q0[0] = bod->getWorldToBaseRot().x();
415 scratch_q0[1] = bod->getWorldToBaseRot().y();
416 scratch_q0[2] = bod->getWorldToBaseRot().z();
417 scratch_q0[3] = bod->getWorldToBaseRot().w();
418 scratch_q0[4] = bod->getBasePos().x();
419 scratch_q0[5] = bod->getBasePos().y();
420 scratch_q0[6] = bod->getBasePos().z();
422 for (
int link = 0; link < bod->getNumLinks(); ++link)
424 for (
int dof = 0; dof < bod->getLink(link).m_posVarCount; ++dof)
425 scratch_q0[7 + bod->getLink(link).m_cfgOffset + dof] = bod->getLink(link).m_jointPos[dof];
428 for (
int dof = 0; dof < numDofs; ++dof)
429 scratch_qd0[dof] = bod->getVelocityVector()[dof];
438 for (
int dof = 0; dof < bod->getNumPosVars() + 7; ++dof)
439 scratch_qx[dof] = scratch_q0[dof];
441 } pResetQx = {bod, scratch_qx, scratch_q0};
447 for (
int i = 0; i <
size; ++i)
448 pVal[i] = pCurVal[i] + dt * pDer[i];
459 for (
int i = 0; i < pBody->getNumDofs() + 6; ++i)
462 } pCopyToVelocityVector;
468 for (
int i = 0; i <
size; ++i)
469 pDst[i] = pSrc[start + i];
475#define output &m_scratch_r[bod->getNumDofs()]
478 isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
479 getSolverInfo().m_jointFeedbackInJointFrame);
480 pCopy(output, scratch_qdd0, 0, numDofs);
483 bod->stepPositionsMultiDof(
btScalar(.5) * h, scratch_qx, scratch_qd0);
485 pEulerIntegrate(
btScalar(.5) * h, scratch_qdd0, scratch_qd0, scratch_qd1, numDofs);
488 pCopyToVelocityVector(bod, scratch_qd1);
490 isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
491 getSolverInfo().m_jointFeedbackInJointFrame);
492 pCopy(output, scratch_qdd1, 0, numDofs);
495 bod->stepPositionsMultiDof(
btScalar(.5) * h, scratch_qx, scratch_qd1);
497 pEulerIntegrate(
btScalar(.5) * h, scratch_qdd1, scratch_qd0, scratch_qd2, numDofs);
500 pCopyToVelocityVector(bod, scratch_qd2);
502 isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
503 getSolverInfo().m_jointFeedbackInJointFrame);
504 pCopy(output, scratch_qdd2, 0, numDofs);
507 bod->stepPositionsMultiDof(h, scratch_qx, scratch_qd2);
509 pEulerIntegrate(h, scratch_qdd2, scratch_qd0, scratch_qd3, numDofs);
512 pCopyToVelocityVector(bod, scratch_qd3);
514 isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
515 getSolverInfo().m_jointFeedbackInJointFrame);
516 pCopy(output, scratch_qdd3, 0, numDofs);
525 for (
int i = 0; i < numDofs; ++i)
527 delta_q[i] = h /
btScalar(6.) * (scratch_qd0[i] + 2 * scratch_qd1[i] + 2 * scratch_qd2[i] + scratch_qd3[i]);
528 delta_qd[i] = h /
btScalar(6.) * (scratch_qdd0[i] + 2 * scratch_qdd1[i] + 2 * scratch_qdd2[i] + scratch_qdd3[i]);
533 pCopyToVelocityVector(bod, scratch_qd0);
534 bod->applyDeltaVeeMultiDof(&delta_qd[0], 1);
539 pRealBuf += 6 + bod->getNumDofs() + bod->getNumDofs() * bod->getNumDofs();
541 for (
int i = 0; i < numDofs; ++i)
542 pRealBuf[i] = delta_q[i];
545 bod->setPosUpdated(
true);
550 for (
int link = 0; link < bod->getNumLinks(); ++link)
551 bod->getLink(link).updateCacheMultiDof();
553 isConstraintPass,getSolverInfo().m_jointFeedbackInWorldSpace,
554 getSolverInfo().m_jointFeedbackInJointFrame);
559#ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
560 bod->clearForcesAndTorques();
674 BT_PROFILE(
"btMultiBodyDynamicsWorld debugDrawWorld");
676 btDiscreteDynamicsWorld::debugDrawWorld();
678 bool drawConstraints =
false;
679 if (getDebugDrawer())
681 int mode = getDebugDrawer()->getDebugMode();
684 drawConstraints =
true;
704 getDebugDrawer()->drawTransform(bod->getBaseWorldTransform(), 0.1);
707 for (
int m = 0; m < bod->getNumLinks(); m++)
709 const btTransform& tr = bod->getLink(m).m_cachedWorldTransform;
712 getDebugDrawer()->drawTransform(tr, 0.1);
717 btVector3 vec =
quatRotate(tr.getRotation(), bod->getLink(m).m_axes[0].m_topVec) * 0.1;
720 btVector3 from = vec + tr.getOrigin() -
quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
721 btVector3 to = tr.getOrigin() -
quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
722 getDebugDrawer()->drawLine(from, to, color);
726 btVector3 vec =
quatRotate(tr.getRotation(), bod->getLink(m).m_axes[0].m_bottomVec) * 0.1;
729 btVector3 from = vec + tr.getOrigin() -
quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
730 btVector3 to = tr.getOrigin() -
quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
731 getDebugDrawer()->drawLine(from, to, color);
735 btVector3 vec =
quatRotate(tr.getRotation(), bod->getLink(m).m_axes[0].m_bottomVec) * 0.1;
738 btVector3 from = vec + tr.getOrigin() -
quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
739 btVector3 to = tr.getOrigin() -
quatRotate(tr.getRotation(), bod->getLink(m).m_dVector);
740 getDebugDrawer()->drawLine(from, to, color);
virtual void addMultiBody(btMultiBody *body, int group=btBroadphaseProxy::DefaultFilter, int mask=btBroadphaseProxy::AllFilter)
btMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
virtual SIMD_FORCE_INLINE void setup(btContactSolverInfo *solverInfo, btTypedConstraint **sortedConstraints, int numConstraints, btMultiBodyConstraint **sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw *debugDrawer)