diff --git a/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp new file mode 100644 index 000000000..1e26130f6 --- /dev/null +++ b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp @@ -0,0 +1,110 @@ + +#include "btSimpleDynamicsWorld.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" +#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h" + + +btSimpleDynamicsWorld::btSimpleDynamicsWorld() +:CollisionWorld(new CollisionDispatcher(),new SimpleBroadphase()), +m_constraintSolver(new SequentialImpulseConstraintSolver) +{ + +} + +btSimpleDynamicsWorld::~btSimpleDynamicsWorld() +{ + delete m_constraintSolver; + + //delete the dispatcher and paircache + delete m_dispatcher1; + m_dispatcher1 = 0; + delete m_pairCache; + m_pairCache = 0; +} + +void btSimpleDynamicsWorld::stepSimulation(float timeStep) +{ + ///apply gravity, predict motion + predictUnconstraintMotion(timeStep); + + ///perform collision detection + PerformDiscreteCollisionDetection(); + + ///solve contact constraints + PersistentManifold** manifoldPtr = ((CollisionDispatcher*)m_dispatcher1)->getInternalManifoldPointer(); + int numManifolds = m_dispatcher1->GetNumManifolds(); + ContactSolverInfo infoGlobal; + infoGlobal.m_timeStep = timeStep; + IDebugDraw* debugDrawer=0; + m_constraintSolver->SolveGroup(manifoldPtr, numManifolds,infoGlobal,debugDrawer); + + ///integrate transforms + integrateTransforms(timeStep); + + updateAabbs(); + +} + +void btSimpleDynamicsWorld::updateAabbs() +{ + SimdTransform predictedTrans; + for (int i=0;im_internalOwner) + { + RigidBody* body = (RigidBody*)colObj->m_internalOwner; + if (body->IsActive() && (!body->IsStatic())) + { + SimdPoint3 minAabb,maxAabb; + colObj->m_collisionShape->GetAabb(colObj->m_worldTransform, minAabb,maxAabb); + SimpleBroadphase* bp = (SimpleBroadphase*)m_pairCache; + bp->SetAabb(body->m_broadphaseHandle,minAabb,maxAabb); + } + } + } +} + +void btSimpleDynamicsWorld::integrateTransforms(float timeStep) +{ + SimdTransform predictedTrans; + for (int i=0;im_internalOwner) + { + RigidBody* body = (RigidBody*)colObj->m_internalOwner; + if (body->IsActive() && (!body->IsStatic())) + { + body->predictIntegratedTransform(timeStep, predictedTrans); + body->proceedToTransform( predictedTrans); + } + } + } +} + + + +void btSimpleDynamicsWorld::predictUnconstraintMotion(float timeStep) +{ + for (int i=0;im_internalOwner) + { + RigidBody* body = (RigidBody*)colObj->m_internalOwner; + body->m_cachedInvertedWorldTransform = body->m_worldTransform.inverse(); + if (body->IsActive() && (!body->IsStatic())) + { + body->applyForces( timeStep); + body->integrateVelocities( timeStep); + body->predictIntegratedTransform(timeStep,body->m_interpolationWorldTransform); + + } + } + } +} \ No newline at end of file diff --git a/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h new file mode 100644 index 000000000..72590c153 --- /dev/null +++ b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h @@ -0,0 +1,49 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +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. +*/ + +#ifndef BT_SIMPLE_DYNAMICS_WORLD_H +#define BT_SIMPLE_DYNAMICS_WORLD_H + +#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" +class SequentialImpulseConstraintSolver; + +///btSimpleDynamicsWorld demonstrates very basic usage of Bullet rigid body dynamics +///It can be used for basic simulations, and as a starting point for porting Bullet +///btSimpleDynamicsWorld lacks object deactivation, island management and other concepts. +///For more complicated simulations, btDiscreteDynamicsWorld and btContinuousDynamicsWorld are recommended +///those classes replace the obsolete CcdPhysicsEnvironment/CcdPhysicsController +class btSimpleDynamicsWorld : public CollisionWorld +{ +protected: + + SequentialImpulseConstraintSolver* m_constraintSolver; + + void predictUnconstraintMotion(float timeStep); + + void integrateTransforms(float timeStep); + + void updateAabbs(); + +public: + + btSimpleDynamicsWorld(); + + virtual ~btSimpleDynamicsWorld(); + + virtual void stepSimulation( float timeStep); + +}; + +#endif //BT_SIMPLE_DYNAMICS_WORLD_H \ No newline at end of file