18 #ifndef hifi_ThreadSafeDynamicsWorld_h
19 #define hifi_ThreadSafeDynamicsWorld_h
21 #include <BulletDynamics/Dynamics/btRigidBody.h>
22 #include <BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h>
24 #include "ObjectMotionState.h"
28 using SubStepCallback = std::function<void()>;
30 ATTRIBUTE_ALIGNED16(
class) ThreadSafeDynamicsWorld : public btDiscreteDynamicsWorld {
32 BT_DECLARE_ALIGNED_ALLOCATOR();
34 ThreadSafeDynamicsWorld(
35 btDispatcher* dispatcher,
36 btBroadphaseInterface* pairCache,
37 btConstraintSolver* constraintSolver,
38 btCollisionConfiguration* collisionConfiguration);
40 int getNumSubsteps()
const {
return _numSubsteps; }
41 int stepSimulationWithSubstepCallback(btScalar timeStep,
int maxSubSteps = 1,
42 btScalar fixedTimeStep = btScalar(1.)/btScalar(60.),
43 SubStepCallback onSubStep = []() { });
44 virtual void synchronizeMotionStates()
override;
45 virtual void saveKinematicState(btScalar timeStep)
override;
50 float getLocalTimeAccumulation()
const {
return m_localTime; }
52 const VectorOfMotionStates& getChangedMotionStates()
const {
return _changedMotionStates; }
53 const VectorOfMotionStates& getDeactivatedMotionStates()
const {
return _deactivatedStates; }
55 void addChangedMotionState(ObjectMotionState* motionState) { _changedMotionStates.push_back(motionState); }
56 virtual void debugDrawObject(
const btTransform& worldTransform,
const btCollisionShape* shape,
const btVector3& color)
override;
60 void synchronizeMotionState(btRigidBody* body);
61 void drawConnectedSpheres(btIDebugDraw* drawer, btScalar radius1, btScalar radius2,
const btVector3& position1,
62 const btVector3& position2,
const btVector3& color);
64 VectorOfMotionStates _changedMotionStates;
65 VectorOfMotionStates _deactivatedStates;
66 SetOfMotionStates _activeStates;
67 SetOfMotionStates _lastActiveStates;
68 int _numSubsteps { 0 };