51 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
52 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
62 for (i = 0; i < numConstraints; i++)
70 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
71 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
90 if (((cur) && (!(cur)->isStaticOrKinematicObject())) &&
91 ((prev) && (!(prev)->isStaticOrKinematicObject())))
110 if (tagA >= 0 && tagB >= 0)
121 BT_PROFILE(
"btMultiBodyDynamicsWorld::updateActivationState");
181 int rIslandId0, lIslandId0;
184 return lIslandId0 < rIslandId0;
194 islandId = islandTagA >= 0 ? islandTagA : islandTagB;
203 int rIslandId0, lIslandId0;
206 return lIslandId0 < rIslandId0;
272 m_solver->
solveMultiBodyGroup(bodies, numBodies, manifolds, numManifolds,
m_sortedConstraints,
m_numConstraints, &
m_multiBodySortedConstraints[0],
m_numConstraints, *
m_solverInfo,
m_debugDrawer,
m_dispatcher);
280 int numCurConstraints = 0;
281 int numCurMultiBodyConstraints = 0;
317 numCurMultiBodyConstraints++;
326 for (i = 0; i < numBodies; i++)
328 for (i = 0; i < numManifolds; i++)
330 for (i = 0; i < numCurConstraints; i++)
333 for (i = 0; i < numCurMultiBodyConstraints; i++)
356 m_solver->
solveMultiBodyGroup(bodies,
m_bodies.
size(), manifold,
m_manifolds.
size(), constraints,
m_constraints.
size(), multiBodyConstraints,
m_multiBodyConstraints.
size(), *
m_solverInfo,
m_debugDrawer,
m_dispatcher);
366 m_multiBodyConstraintSolver(constraintSolver)
432 #ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY 439 bool isSleeping =
false;
467 #endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY 475 bool isSleeping =
false;
493 bool doNotUpdatePos =
false;
494 bool isConstraintPass =
false;
509 scratch_r2.
resize(2 * numPosVars + 8 * numDofs);
532 btAssert((pMem - (2 * numPosVars + 8 * numDofs)) == &scratch_r2[0]);
544 for (
int link = 0; link < bod->
getNumLinks(); ++link)
550 for (
int dof = 0; dof < numDofs; ++dof)
561 scratch_qx[dof] = scratch_q0[dof];
563 } pResetQx = {bod, scratch_qx, scratch_q0};
569 for (
int i = 0; i <
size; ++i)
570 pVal[i] = pCurVal[i] + dt * pDer[i];
581 for (
int i = 0; i < pBody->
getNumDofs() + 6; ++i)
584 } pCopyToVelocityVector;
590 for (
int i = 0; i <
size; ++i)
591 pDst[i] = pSrc[start + i];
597 #define output &m_scratch_r[bod->getNumDofs()] 600 isConstraintPass,
getSolverInfo().m_jointFeedbackInWorldSpace,
602 pCopy(
output, scratch_qdd0, 0, numDofs);
607 pEulerIntegrate(
btScalar(.5) * h, scratch_qdd0, scratch_qd0, scratch_qd1, numDofs);
610 pCopyToVelocityVector(bod, scratch_qd1);
612 isConstraintPass,
getSolverInfo().m_jointFeedbackInWorldSpace,
614 pCopy(
output, scratch_qdd1, 0, numDofs);
619 pEulerIntegrate(
btScalar(.5) * h, scratch_qdd1, scratch_qd0, scratch_qd2, numDofs);
622 pCopyToVelocityVector(bod, scratch_qd2);
624 isConstraintPass,
getSolverInfo().m_jointFeedbackInWorldSpace,
626 pCopy(
output, scratch_qdd2, 0, numDofs);
631 pEulerIntegrate(h, scratch_qdd2, scratch_qd0, scratch_qd3, numDofs);
634 pCopyToVelocityVector(bod, scratch_qd3);
636 isConstraintPass,
getSolverInfo().m_jointFeedbackInWorldSpace,
638 pCopy(
output, scratch_qdd3, 0, numDofs);
647 for (
int i = 0; i < numDofs; ++i)
649 delta_q[i] = h /
btScalar(6.) * (scratch_qd0[i] + 2 * scratch_qd1[i] + 2 * scratch_qd2[i] + scratch_qd3[i]);
650 delta_qd[i] = h /
btScalar(6.) * (scratch_qdd0[i] + 2 * scratch_qdd1[i] + 2 * scratch_qdd2[i] + scratch_qdd3[i]);
655 pCopyToVelocityVector(bod, scratch_qd0);
663 for (
int i = 0; i < numDofs; ++i)
664 pRealBuf[i] = delta_q[i];
672 for (
int link = 0; link < bod->
getNumLinks(); ++link)
675 isConstraintPass,
getSolverInfo().m_jointFeedbackInWorldSpace,
681 #ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY 683 #endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY 701 bool isSleeping =
false;
723 bool isConstraintPass =
true;
751 bool isSleeping =
false;
811 BT_PROFILE(
"btMultiBodyDynamicsWorld debugDrawWorld");
815 bool drawConstraints =
false;
821 drawConstraints =
true;
888 #ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY 894 bool isSleeping =
false;
916 #endif //BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY 935 bool isSleeping =
false;
959 #ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY virtual void setConstraintSolver(btConstraintSolver *solver)
MultiBodyInplaceSolverIslandCallback & operator=(MultiBodyInplaceSolverIslandCallback &other)
virtual void finishSerialization()=0
const btScalar & x() const
Return the x value.
void setMultiBodyConstraintSolver(btMultiBodyConstraintSolver *solver)
void serializeDynamicsWorldInfo(btSerializer *serializer)
btAlignedObjectArray< btTypedConstraint * > m_constraints
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep...
void serializeCollisionObjects(btSerializer *serializer)
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
virtual void updateActivationState(btScalar timeStep)
virtual void debugDrawMultiBodyConstraint(btMultiBodyConstraint *constraint)
void clearConstraintForces()
void push_back(const T &_Val)
const btVector3 & getBasePos() const
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
void serializeContactManifolds(btSerializer *serializer)
virtual void serialize(btSerializer *serializer)
Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see B...
const btMultiBodyLinkCollider * getBaseCollider() const
btSimulationIslandManager * m_islandManager
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
#define BT_MULTIBODY_CODE
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep...
btAlignedObjectArray< btTypedConstraint * > m_sortedConstraints
void stepPositionsMultiDof(btScalar dt, btScalar *pq=0, btScalar *pqd=0)
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
eFeatherstoneJointType m_jointType
virtual void startSerialization()=0
#define BT_MB_LINKCOLLIDER_CODE
class btMultiBodyLinkCollider * m_collider
void updateCacheMultiDof(btScalar *pq=0)
btIDebugDraw * m_debugDrawer
btDiscreteDynamicsWorld provides discrete rigid body simulation those classes replace the obsolete Cc...
const btRigidBody & getRigidBodyA() const
virtual void addMultiBody(btMultiBody *body, int group=btBroadphaseProxy::DefaultFilter, int mask=btBroadphaseProxy::AllFilter)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
btAlignedObjectArray< btScalar > m_scratch_r
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size...
void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
virtual void debugDrawWorld()
const btQuaternion & getWorldToBaseRot() const
bool operator()(const btMultiBodyConstraint *lhs, const btMultiBodyConstraint *rhs) const
btSimulationIslandManager * getSimulationIslandManager()
#define SIMD_FORCE_INLINE
void addLinkForce(int i, const btVector3 &f)
bool isPosUpdated() const
bool isUsingRK4Integration() const
int getActivationState() const
btMultiBodyConstraintSolver * m_solver
virtual void integrateTransforms(btScalar timeStep)
int btGetMultiBodyConstraintIslandId(const btMultiBodyConstraint *lhs)
void updateCollisionObjectWorldTransforms(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
virtual void updateActivationState(btCollisionWorld *colWorld, btDispatcher *dispatcher)
btAlignedObjectArray< btVector3 > m_scratch_local_origin
const btRigidBody & getRigidBodyB() const
virtual void debugDraw(class btIDebugDraw *drawer)=0
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
bool isStaticOrKinematicObject() const
btMultiBodyConstraintSolver * m_multiBodyConstraintSolver
void clearForcesAndTorques()
int getNumCollisionObjects() const
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
btDispatcher * m_dispatcher
virtual int getIslandIdB() const =0
MultiBodyInplaceSolverIslandCallback * m_solverMultiBodyIslandCallback
btCollisionWorld * getCollisionWorld()
void forwardKinematics(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
virtual int calculateSerializeBufferSize() const
btContactSolverInfo * m_solverInfo
btAlignedObjectArray< btCollisionObject * > m_bodies
btAlignedObjectArray< btVector3 > m_scratch_v
virtual void clearMultiBodyConstraintForces()
virtual void processIsland(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifolds, int numManifolds, int islandId)
virtual void solveMultiBodyGroup(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifold, int numManifolds, btTypedConstraint **constraints, int numConstraints, btMultiBodyConstraint **multiBodyConstraints, int numMultiBodyConstraints, const btContactSolverInfo &info, btIDebugDraw *debugDrawer, btDispatcher *dispatcher)
btTransform getBaseWorldTransform() const
btIDebugDraw * m_debugDrawer
const btScalar & x() const
Return the x value.
virtual btIDebugDraw * getDebugDrawer()
virtual ~btMultiBodyDynamicsWorld()
btScalar getBaseMass() const
virtual void debugDrawWorld()
const btCollisionObject * getBody0() const
virtual void removeMultiBodyConstraint(btMultiBodyConstraint *constraint)
btSpatialMotionVector m_axes[6]
btAlignedObjectArray< btPersistentManifold * > m_manifolds
btCollisionObject can be used to manage collision detection objects.
const btScalar & y() const
Return the y value.
const btScalar & z() const
Return the z value.
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations...
void computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass, bool jointFeedbackInWorldSpace, bool jointFeedbackInJointFrame)
virtual const char * serialize(void *dataBuffer, class btSerializer *serializer) const
fills the dataBuffer and returns the struct name (and 0 on failure)
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
btAlignedObjectArray< btPersistentManifold * > m_predictiveManifolds
The btRigidBody is the main class for rigid body objects.
const btScalar & z() const
Return the z value.
virtual void applyGravity()
apply gravity, call this once per timestep
virtual int calculateSerializeBufferSize() const
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs...
void setDeactivationTime(btScalar time)
btDispatcher * getDispatcher()
virtual void solveConstraints(btContactSolverInfo &solverInfo)
MultiBodyInplaceSolverIslandCallback(btMultiBodyConstraintSolver *solver, btDispatcher *dispatcher)
virtual btConstraintSolverType getSolverType() const =0
void checkMotionAndSleepIfRequired(btScalar timestep)
virtual void applyGravity()
apply gravity, call this once per timestep
btAlignedObjectArray< btMultiBody * > m_multiBodies
virtual int getIslandIdA() const =0
int m_numMultiBodyConstraints
btVector3 can be used to represent 3D points and vectors.
const btMultibodyLink & getLink(int index) const
btMultiBodyConstraint ** m_multiBodySortedConstraints
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
btMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
int getNumPosVars() const
int size() const
return the number of elements in the array
virtual void serializeMultiBodies(btSerializer *serializer)
void addBaseForce(const btVector3 &f)
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
virtual void allSolved(const btContactSolverInfo &, class btIDebugDraw *)
btAlignedObjectArray< btMultiBodyConstraint * > m_sortedMultiBodyConstraints
virtual void prepareSolve(int, int)
#define WANTS_DEACTIVATION
void remove(const T &key)
virtual void drawTransform(const btTransform &transform, btScalar orthoLen)
TypedConstraint is the baseclass for Bullet constraints and vehicles.
void resize(int newsize, const T &fillData=T())
virtual void integrateTransforms(btScalar timeStep)
const btCollisionObject * getBody1() const
int getInternalType() const
reserved for Bullet internal usage
virtual void clearMultiBodyForces()
virtual int getDebugMode() const =0
btAlignedObjectArray< btCollisionObject * > m_collisionObjects
btAlignedObjectArray< btQuaternion > m_scratch_world_to_local1
void setPosUpdated(bool updated)
void setup(btContactSolverInfo *solverInfo, btTypedConstraint **sortedConstraints, int numConstraints, btMultiBodyConstraint **sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw *debugDrawer)
virtual void storeIslandActivationState(btCollisionWorld *world)
#define DISABLE_DEACTIVATION
virtual void removeMultiBody(btMultiBody *body)
btUnionFind & getUnionFind()
btTransform m_cachedWorldTransform
btAlignedObjectArray< btMatrix3x3 > m_scratch_m
const btScalar & y() const
Return the y value.
btConstraintSolver * m_constraintSolver
btScalar getLinkMass(int i) const
btAlignedObjectArray< btQuaternion > m_scratch_world_to_local
virtual int getNumConstraints() const
void serializeRigidBodies(btSerializer *serializer)
virtual void updateActivationState(btScalar timeStep)
void processConstraints()
btAlignedObjectArray< btVector3 > m_scratch_local_origin1
btTypedConstraint ** m_sortedConstraints
virtual void addMultiBodyConstraint(btMultiBodyConstraint *constraint)
bool operator()(const btTypedConstraint *lhs, const btTypedConstraint *rhs) const
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
const btScalar & w() const
Return the w value.
virtual void setMultiBodyConstraintSolver(btMultiBodyConstraintSolver *solver)
btContactSolverInfo & getSolverInfo()
const btScalar * getVelocityVector() const
void setActivationState(int newState) const
virtual btChunk * allocate(size_t size, int numElements)=0
void processDeltaVeeMultiDof2()
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
void quickSort(const L &CompareFunc)
int btGetConstraintIslandId2(const btTypedConstraint *lhs)
virtual void setConstraintSolver(btConstraintSolver *solver)
virtual void calculateSimulationIslands()
btAlignedObjectArray< btTypedConstraint * > m_constraints