diff --git a/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp index 451ec1f54..a02b8ac6d 100644 --- a/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp @@ -77,7 +77,6 @@ void btContinuousDynamicsWorld::internalSingleStepSimulation( btScalar timeStep) solveConstraints(getSolverInfo()); ///CallbackTriggers(); - calculateTimeOfImpacts(timeStep); btScalar toi = dispatchInfo.m_timeOfImpact; @@ -96,6 +95,9 @@ void btContinuousDynamicsWorld::internalSingleStepSimulation( btScalar timeStep) updateActivationState( timeStep ); + if(0 != m_internalTickCallback) { + (*m_internalTickCallback)(this, timeStep); + } } void btContinuousDynamicsWorld::calculateTimeOfImpacts(btScalar timeStep) @@ -188,3 +190,4 @@ void btContinuousDynamicsWorld::updateTemporalAabbs(btScalar timeStep) } + diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index 04b2ea2cb..15a312fc1 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -375,6 +375,9 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep) updateActivationState( timeStep ); + if(0 != m_internalTickCallback) { + (*m_internalTickCallback)(this, timeStep); + } } void btDiscreteDynamicsWorld::setGravity(const btVector3& gravity) diff --git a/src/BulletDynamics/Dynamics/btDynamicsWorld.h b/src/BulletDynamics/Dynamics/btDynamicsWorld.h index 3ee68b2db..1a78eeb44 100644 --- a/src/BulletDynamics/Dynamics/btDynamicsWorld.h +++ b/src/BulletDynamics/Dynamics/btDynamicsWorld.h @@ -21,6 +21,9 @@ class btTypedConstraint; class btRaycastVehicle; class btConstraintSolver; +class btDynamicsWorld; +/// Type for the callback for each tick +typedef void (*btInternalTickCallback)(const btDynamicsWorld *world, btScalar timeStep); enum btDynamicsWorldType { @@ -36,7 +39,7 @@ class btDynamicsWorld : public btCollisionWorld btDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphase,btCollisionConfiguration* collisionConfiguration) - :btCollisionWorld(dispatcher,broadphase,collisionConfiguration) + :btCollisionWorld(dispatcher,broadphase,collisionConfiguration), m_internalTickCallback(0) { } @@ -61,7 +64,7 @@ class btDynamicsWorld : public btCollisionWorld //once a rigidbody is added to the dynamics world, it will get this gravity assigned //existing rigidbodies in the world get gravity assigned too, during this method virtual void setGravity(const btVector3& gravity) = 0; - virtual btVector3 getGravity () const = 0; + virtual btVector3 getGravity () const = 0; virtual void addRigidBody(btRigidBody* body) = 0; @@ -79,10 +82,16 @@ class btDynamicsWorld : public btCollisionWorld virtual btDynamicsWorldType getWorldType() const=0; - virtual void clearForces() = 0; + virtual void clearForces() = 0; + + /// Set the callback for when an internal tick (simulation substep) happens + void setInternalTickCallback(btInternalTickCallback cb) { m_internalTickCallback = cb; } + + btInternalTickCallback m_internalTickCallback; }; #endif //BT_DYNAMICS_WORLD_H +