53 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
54 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
64 for (i=0;i< numConstraints ; i++ )
72 if (((colObj0) && (!(colObj0)->isStaticOrKinematicObject())) &&
73 ((colObj1) && (!(colObj1)->isStaticOrKinematicObject())))
92 if (((cur) && (!(cur)->isStaticOrKinematicObject())) &&
93 ((prev) && (!(prev)->isStaticOrKinematicObject())))
113 if (tagA>=0 && tagB>=0)
126 BT_PROFILE(
"btMultiBodyDynamicsWorld::updateActivationState");
192 int rIslandId0,lIslandId0;
195 return lIslandId0 < rIslandId0;
207 islandId= islandTagA>=0?islandTagA:islandTagB;
219 int rIslandId0,lIslandId0;
222 return lIslandId0 < rIslandId0;
286 m_solver->
solveMultiBodyGroup( bodies,numBodies,manifolds, numManifolds,
m_sortedConstraints,
m_numConstraints, &
m_multiBodySortedConstraints[0],
m_numConstraints,*
m_solverInfo,
m_debugDrawer,
m_dispatcher);
293 int numCurConstraints = 0;
294 int numCurMultiBodyConstraints = 0;
331 numCurMultiBodyConstraints++;
341 for (i=0;i<numBodies;i++)
343 for (i=0;i<numManifolds;i++)
345 for (i=0;i<numCurConstraints;i++)
348 for (i=0;i<numCurMultiBodyConstraints;i++)
371 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);
384 m_multiBodyConstraintSolver(constraintSolver)
439#ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
446 bool isSleeping =
false;
483 bool isSleeping =
false;
501 bool doNotUpdatePos =
false;
516 btScalar *scratch_q0 = pMem; pMem += numPosVars;
517 btScalar *scratch_qx = pMem; pMem += numPosVars;
518 btScalar *scratch_qd0 = pMem; pMem += numDofs;
519 btScalar *scratch_qd1 = pMem; pMem += numDofs;
520 btScalar *scratch_qd2 = pMem; pMem += numDofs;
521 btScalar *scratch_qd3 = pMem; pMem += numDofs;
522 btScalar *scratch_qdd0 = pMem; pMem += numDofs;
523 btScalar *scratch_qdd1 = pMem; pMem += numDofs;
524 btScalar *scratch_qdd2 = pMem; pMem += numDofs;
525 btScalar *scratch_qdd3 = pMem; pMem += numDofs;
526 btAssert((pMem - (2*numPosVars + 8*numDofs)) == &scratch_r2[0]);
538 for(
int link = 0; link < bod->
getNumLinks(); ++link)
540 for(
int dof = 0; dof < bod->
getLink(link).m_posVarCount; ++dof)
544 for(
int dof = 0; dof < numDofs; ++dof)
555 scratch_qx[dof] = scratch_q0[dof];
557 } pResetQx = {bod, scratch_qx, scratch_q0};
563 for(
int i = 0; i <
size; ++i)
564 pVal[i] = pCurVal[i] + dt * pDer[i];
575 for(
int i = 0; i < pBody->
getNumDofs() + 6; ++i)
579 } pCopyToVelocityVector;
585 for(
int i = 0; i <
size; ++i)
586 pDst[i] = pSrc[start + i];
592 #define output &m_scratch_r[bod->getNumDofs()]
595 pCopy(
output, scratch_qdd0, 0, numDofs);
600 pEulerIntegrate(
btScalar(.5)*h, scratch_qdd0, scratch_qd0, scratch_qd1, numDofs);
603 pCopyToVelocityVector(bod, scratch_qd1);
605 pCopy(
output, scratch_qdd1, 0, numDofs);
610 pEulerIntegrate(
btScalar(.5)*h, scratch_qdd1, scratch_qd0, scratch_qd2, numDofs);
613 pCopyToVelocityVector(bod, scratch_qd2);
615 pCopy(
output, scratch_qdd2, 0, numDofs);
620 pEulerIntegrate(h, scratch_qdd2, scratch_qd0, scratch_qd3, numDofs);
623 pCopyToVelocityVector(bod, scratch_qd3);
625 pCopy(
output, scratch_qdd3, 0, numDofs);
632 for(
int i = 0; i < numDofs; ++i)
634 delta_q[i] = h/
btScalar(6.)*(scratch_qd0[i] + 2*scratch_qd1[i] + 2*scratch_qd2[i] + scratch_qd3[i]);
635 delta_qd[i] = h/
btScalar(6.)*(scratch_qdd0[i] + 2*scratch_qdd1[i] + 2*scratch_qdd2[i] + scratch_qdd3[i]);
640 pCopyToVelocityVector(bod, scratch_qd0);
648 for(
int i = 0; i < numDofs; ++i)
649 pRealBuf[i] = delta_q[i];
657 for(
int link = 0; link < bod->
getNumLinks(); ++link)
665#ifndef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
684 bool isSleeping =
false;
707 bool isConstraintPass =
true;
734 bool isSleeping =
false;
799 BT_PROFILE(
"btMultiBodyDynamicsWorld debugDrawWorld");
803 bool drawConstraints =
false;
809 drawConstraints =
true;
880#ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
886 bool isSleeping =
false;
927 bool isSleeping =
false;
952#ifdef BT_USE_VIRTUAL_CLEARFORCES_AND_GRAVITY
#define DISABLE_DEACTIVATION
#define WANTS_DEACTIVATION
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
int btGetConstraintIslandId2(const btTypedConstraint *lhs)
int btGetMultiBodyConstraintIslandId(const btMultiBodyConstraint *lhs)
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define SIMD_FORCE_INLINE
#define BT_MULTIBODY_CODE
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
void push_back(const T &_Val)
The btBroadphaseInterface class provides an interface to detect aabb-overlapping object pairs.
btCollisionConfiguration allows to configure Bullet collision detection stack allocator size,...
btCollisionObject can be used to manage collision detection objects.
bool isStaticOrKinematicObject() const
void setActivationState(int newState) const
void setDeactivationTime(btScalar time)
int getActivationState() const
btDispatcher * getDispatcher()
virtual btIDebugDraw * getDebugDrawer()
int getNumCollisionObjects() const
btIDebugDraw * m_debugDrawer
void serializeCollisionObjects(btSerializer *serializer)
virtual void allSolved(const btContactSolverInfo &, class btIDebugDraw *)
virtual void prepareSolve(int, int)
btDiscreteDynamicsWorld provides discrete rigid body simulation those classes replace the obsolete Cc...
btAlignedObjectArray< btPersistentManifold * > m_predictiveManifolds
virtual void integrateTransforms(btScalar timeStep)
void serializeRigidBodies(btSerializer *serializer)
void serializeDynamicsWorldInfo(btSerializer *serializer)
btAlignedObjectArray< btTypedConstraint * > m_sortedConstraints
virtual void applyGravity()
apply gravity, call this once per timestep
btSimulationIslandManager * m_islandManager
btAlignedObjectArray< btTypedConstraint * > m_constraints
virtual int getNumConstraints() const
btSimulationIslandManager * getSimulationIslandManager()
virtual void updateActivationState(btScalar timeStep)
btConstraintSolver * m_constraintSolver
virtual void debugDrawWorld()
btCollisionWorld * getCollisionWorld()
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep.
The btDispatcher interface class can be used in combination with broadphase to dispatch calculations ...
btContactSolverInfo & getSolverInfo()
The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)=0
virtual void drawTransform(const btTransform &transform, btScalar orthoLen)
virtual int getDebugMode() const =0
@ DBG_DrawConstraintLimits
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)
virtual int getIslandIdA() const =0
virtual void debugDraw(class btIDebugDraw *drawer)=0
virtual int getIslandIdB() const =0
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
virtual void clearForces()
the forces on each rigidbody is accumulating together with gravity. clear this after each timestep.
virtual void updateActivationState(btScalar timeStep)
btAlignedObjectArray< btQuaternion > m_scratch_world_to_local
btAlignedObjectArray< btQuaternion > m_scratch_world_to_local1
btAlignedObjectArray< btMatrix3x3 > m_scratch_m
MultiBodyInplaceSolverIslandCallback * m_solverMultiBodyIslandCallback
virtual void serialize(btSerializer *serializer)
Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see B...
virtual ~btMultiBodyDynamicsWorld()
btAlignedObjectArray< btVector3 > m_scratch_local_origin1
virtual void serializeMultiBodies(btSerializer *serializer)
virtual void addMultiBodyConstraint(btMultiBodyConstraint *constraint)
btAlignedObjectArray< btVector3 > m_scratch_v
virtual void calculateSimulationIslands()
virtual void removeMultiBodyConstraint(btMultiBodyConstraint *constraint)
virtual void integrateTransforms(btScalar timeStep)
btAlignedObjectArray< btMultiBody * > m_multiBodies
virtual void solveConstraints(btContactSolverInfo &solverInfo)
virtual void debugDrawMultiBodyConstraint(btMultiBodyConstraint *constraint)
btAlignedObjectArray< btVector3 > m_scratch_local_origin
virtual void clearMultiBodyForces()
btAlignedObjectArray< btScalar > m_scratch_r
virtual void removeMultiBody(btMultiBody *body)
btAlignedObjectArray< btMultiBodyConstraint * > m_sortedMultiBodyConstraints
virtual void addMultiBody(btMultiBody *body, int group=btBroadphaseProxy::DefaultFilter, int mask=btBroadphaseProxy::AllFilter)
btMultiBodyDynamicsWorld(btDispatcher *dispatcher, btBroadphaseInterface *pairCache, btMultiBodyConstraintSolver *constraintSolver, btCollisionConfiguration *collisionConfiguration)
virtual void clearMultiBodyConstraintForces()
virtual void applyGravity()
apply gravity, call this once per timestep
virtual void debugDrawWorld()
void computeAccelerationsArticulatedBodyAlgorithmMultiDof(btScalar dt, btAlignedObjectArray< btScalar > &scratch_r, btAlignedObjectArray< btVector3 > &scratch_v, btAlignedObjectArray< btMatrix3x3 > &scratch_m, bool isConstraintPass=false)
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 updateCollisionObjectWorldTransforms(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
void stepPositionsMultiDof(btScalar dt, btScalar *pq=0, btScalar *pqd=0)
const btMultibodyLink & getLink(int index) const
void forwardKinematics(btAlignedObjectArray< btQuaternion > &scratch_q, btAlignedObjectArray< btVector3 > &scratch_m)
void checkMotionAndSleepIfRequired(btScalar timestep)
btScalar getLinkMass(int i) const
void addLinkForce(int i, const btVector3 &f)
void processDeltaVeeMultiDof2()
void clearConstraintForces()
void setPosUpdated(bool updated)
bool isUsingRK4Integration() const
const btMultiBodyLinkCollider * getBaseCollider() const
btTransform getBaseWorldTransform() const
btScalar getBaseMass() const
int getNumPosVars() const
virtual int calculateSerializeBufferSize() const
bool isPosUpdated() const
const btQuaternion & getWorldToBaseRot() const
void applyDeltaVeeMultiDof(const btScalar *delta_vee, btScalar multiplier)
void addBaseForce(const btVector3 &f)
const btScalar * getVelocityVector() const
void clearForcesAndTorques()
btPersistentManifold is a contact point cache, it stays persistent as long as objects are overlapping...
const btCollisionObject * getBody0() const
const btCollisionObject * getBody1() const
const btScalar & w() const
Return the w value.
const btScalar & z() const
Return the z value.
const btScalar & y() const
Return the y value.
const btScalar & x() const
Return the x value.
The btRigidBody is the main class for rigid body objects.
virtual btChunk * allocate(size_t size, int numElements)=0
virtual void finishSerialization()=0
virtual void startSerialization()=0
virtual void finalizeChunk(btChunk *chunk, const char *structType, int chunkCode, void *oldPtr)=0
virtual void storeIslandActivationState(btCollisionWorld *world)
virtual void updateActivationState(btCollisionWorld *colWorld, btDispatcher *dispatcher)
void buildAndProcessIslands(btDispatcher *dispatcher, btCollisionWorld *collisionWorld, IslandCallback *callback)
btUnionFind & getUnionFind()
bool operator()(const btTypedConstraint *lhs, const btTypedConstraint *rhs) const
bool operator()(const btMultiBodyConstraint *lhs, const btMultiBodyConstraint *rhs) const
TypedConstraint is the baseclass for Bullet constraints and vehicles.
const btRigidBody & getRigidBodyA() const
const btRigidBody & getRigidBodyB() const
btVector3 can be used to represent 3D points and vectors.
const btScalar & z() const
Return the z value.
const btScalar & x() const
Return the x value.
const btScalar & y() const
Return the y value.
MultiBodyInplaceSolverIslandCallback & operator=(MultiBodyInplaceSolverIslandCallback &other)
btAlignedObjectArray< btTypedConstraint * > m_constraints
btAlignedObjectArray< btMultiBodyConstraint * > m_multiBodyConstraints
void processConstraints()
virtual void processIsland(btCollisionObject **bodies, int numBodies, btPersistentManifold **manifolds, int numManifolds, int islandId)
btTypedConstraint ** m_sortedConstraints
btContactSolverInfo * m_solverInfo
btMultiBodyConstraint ** m_multiBodySortedConstraints
btAlignedObjectArray< btPersistentManifold * > m_manifolds
btDispatcher * m_dispatcher
void setup(btContactSolverInfo *solverInfo, btTypedConstraint **sortedConstraints, int numConstraints, btMultiBodyConstraint **sortedMultiBodyConstraints, int numMultiBodyConstraints, btIDebugDraw *debugDrawer)
btIDebugDraw * m_debugDrawer
btAlignedObjectArray< btCollisionObject * > m_bodies
int m_numMultiBodyConstraints
MultiBodyInplaceSolverIslandCallback(btMultiBodyConstraintSolver *solver, btDispatcher *dispatcher)
btMultiBodyConstraintSolver * m_solver
class btMultiBodyLinkCollider * m_collider
eFeatherstoneJointType m_jointType
btTransform m_cachedWorldTransform
void updateCacheMultiDof(btScalar *pq=0)
btSpatialMotionVector m_axes[6]