From 0117233ed4482d2b6592a9a7319319844be985c6 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 12 Nov 2014 15:19:33 -0800 Subject: [PATCH] add ThreadSafeDynamicsWorld pure virtual interface --- .../physics/src/ThreadSafeDynamicsWorld.cpp | 83 +++++++++++++++++++ .../physics/src/ThreadSafeDynamicsWorld.h | 44 ++++++++++ 2 files changed, 127 insertions(+) create mode 100644 libraries/physics/src/ThreadSafeDynamicsWorld.cpp create mode 100644 libraries/physics/src/ThreadSafeDynamicsWorld.h diff --git a/libraries/physics/src/ThreadSafeDynamicsWorld.cpp b/libraries/physics/src/ThreadSafeDynamicsWorld.cpp new file mode 100644 index 0000000000..54bea0fff5 --- /dev/null +++ b/libraries/physics/src/ThreadSafeDynamicsWorld.cpp @@ -0,0 +1,83 @@ +/* + * Bullet Continuous Collision Detection and Physics Library + * Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it freely, + * subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + * Copied and modified from btDiscreteDynamicsWorld.cpp by AndrewMeadows on 2014.11.12. + * */ + +#include "ThreadSafeDynamicsWorld.h" + +ThreadSafeDynamicsWorld::ThreadSafeDynamicsWorld( + btDispatcher* dispatcher, + btBroadphaseInterface* pairCache, + btConstraintSolver* constraintSolver, + btCollisionConfiguration* collisionConfiguration) + : btDiscreteDynamicsWorld(dispatcher, pairCache, constraintSolver, collisionConfiguration) { +} + +void ThreadSafeDynamicsWorld::synchronizeMotionStates() { + if (tryLock()) { + btDiscreteDynamicsWorld::synchronizeMotionStates(); + unlock(); + } +} + +int ThreadSafeDynamicsWorld::stepSimulation( btScalar timeStep, int maxSubSteps, btScalar fixedTimeStep) { + int subSteps = 0; + if (maxSubSteps) { + //fixed timestep with interpolation + m_fixedTimeStep = fixedTimeStep; + m_localTime += timeStep; + if (m_localTime >= fixedTimeStep) + { + subSteps = int( m_localTime / fixedTimeStep); + m_localTime -= subSteps * fixedTimeStep; + } + } else { + //variable timestep + fixedTimeStep = timeStep; + m_localTime = m_latencyMotionStateInterpolation ? 0 : timeStep; + m_fixedTimeStep = 0; + if (btFuzzyZero(timeStep)) + { + subSteps = 0; + maxSubSteps = 0; + } else + { + subSteps = 1; + maxSubSteps = 1; + } + } + + /*//process some debugging flags + if (getDebugDrawer()) { + btIDebugDraw* debugDrawer = getDebugDrawer (); + gDisableDeactivation = (debugDrawer->getDebugMode() & btIDebugDraw::DBG_NoDeactivation) != 0; + }*/ + if (subSteps) { + //clamp the number of substeps, to prevent simulation grinding spiralling down to a halt + int clampedSimulationSteps = (subSteps > maxSubSteps)? maxSubSteps : subSteps; + + saveKinematicState(fixedTimeStep*clampedSimulationSteps); + + applyGravity(); + + for (int i=0;i + +ATTRIBUTE_ALIGNED16(class) ThreadSafeDynamicsWorld : public btDiscreteDynamicsWorld +{ +public: + BT_DECLARE_ALIGNED_ALLOCATOR(); + + ThreadSafeDynamicsWorld( + btDispatcher* dispatcher, + btBroadphaseInterface* pairCache, + btConstraintSolver* constraintSolver, + btCollisionConfiguration* collisionConfiguration); + + // virtual overrides of btDiscreteDynamicsWorld + int stepSimulation( btScalar timeStep, int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.)); + void synchronizeMotionStates(); + + /// \return true if lock succeeds + virtual bool tryLock() = 0; + + virtual void unlock() = 0; +}; + +#endif // hifi_ThreadSafeDynamicsWorld_h