From ce0bdd891d7f96112a6388a9f97557dff8442ec9 Mon Sep 17 00:00:00 2001 From: "erwin.coumans" Date: Sat, 8 Nov 2008 19:34:05 +0000 Subject: [PATCH] added synchronizeSingleMotionState, thanks Chunky. --- .../Dynamics/btDiscreteDynamicsWorld.cpp | 34 ++++++++++++------- .../Dynamics/btDiscreteDynamicsWorld.h | 3 ++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index cd2fdedb6..f67a8228a 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -250,6 +250,25 @@ void btDiscreteDynamicsWorld::applyGravity() } +void btDiscreteDynamicsWorld::synchronizeSingleMotionState(btRigidBody* body) +{ + btAssert(body); + + if (body->getMotionState() && !body->isStaticOrKinematicObject()) + { + //we need to call the update at least once, even for sleeping objects + //otherwise the 'graphics' transform never updates properly + ///@todo: add 'dirty' flag + //if (body->getActivationState() != ISLAND_SLEEPING) + { + btTransform interpolatedTransform; + btTransformUtil::integrateTransform(body->getInterpolationWorldTransform(), + body->getInterpolationLinearVelocity(),body->getInterpolationAngularVelocity(),m_localTime*body->getHitFraction(),interpolatedTransform); + body->getMotionState()->setWorldTransform(interpolatedTransform); + } + } +} + void btDiscreteDynamicsWorld::synchronizeMotionStates() { @@ -261,19 +280,8 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates() btCollisionObject* colObj = m_activeObjects[i]; btRigidBody* body = btRigidBody::upcast(colObj); - if (body && body->getMotionState() && !body->isStaticOrKinematicObject()) - { - //we need to call the update at least once, even for sleeping objects - //otherwise the 'graphics' transform never updates properly - ///@todo: add 'dirty' flag - //if (body->getActivationState() != ISLAND_SLEEPING) - { - btTransform interpolatedTransform; - btTransformUtil::integrateTransform(body->getInterpolationWorldTransform(), - body->getInterpolationLinearVelocity(),body->getInterpolationAngularVelocity(),m_localTime*body->getHitFraction(),interpolatedTransform); - body->getMotionState()->setWorldTransform(interpolatedTransform); - } - } + if (body) + synchronizeSingleMotionState(body); } } diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h index 646b3f4e3..724f19a49 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h @@ -92,6 +92,9 @@ public: virtual void synchronizeMotionStates(); + ///this can be useful to synchronize a single rigid body -> graphics object + void synchronizeSingleMotionState(btRigidBody* body); + void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies=false); void removeConstraint(btTypedConstraint* constraint);