diff options
Diffstat (limited to 'extern/bullet/Extras/PhysicsInterface/CcdPhysics/ParallelPhysicsEnvironment.cpp')
-rw-r--r-- | extern/bullet/Extras/PhysicsInterface/CcdPhysics/ParallelPhysicsEnvironment.cpp | 194 |
1 files changed, 0 insertions, 194 deletions
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/ParallelPhysicsEnvironment.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/ParallelPhysicsEnvironment.cpp deleted file mode 100644 index 452fa10a3f0..00000000000 --- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/ParallelPhysicsEnvironment.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/* -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. -*/ - - - -#include "ParallelPhysicsEnvironment.h" -#include "CcdPhysicsController.h" -#include "ParallelIslandDispatcher.h" -#include "CollisionDispatch/CollisionWorld.h" -#include "ConstraintSolver/TypedConstraint.h" -#include "CollisionDispatch/SimulationIslandManager.h" -#include "SimulationIsland.h" - - -ParallelPhysicsEnvironment::ParallelPhysicsEnvironment(ParallelIslandDispatcher* dispatcher, OverlappingPairCache* pairCache): -CcdPhysicsEnvironment(dispatcher,pairCache) -{ - -} - -ParallelPhysicsEnvironment::~ParallelPhysicsEnvironment() -{ - -} - - - -/// Perform an integration step of duration 'timeStep'. -bool ParallelPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) -{ - // Make sure the broadphase / overlapping AABB paircache is up-to-date - OverlappingPairCache* scene = m_collisionWorld->GetPairCache(); - scene->RefreshOverlappingPairs(); - - // Find the connected sets that can be simulated in parallel - // Using union find - -#ifdef USE_QUICKPROF - Profiler::beginBlock("IslandUnionFind"); -#endif //USE_QUICKPROF - - GetSimulationIslandManager()->UpdateActivationState(GetCollisionWorld(),GetCollisionWorld()->GetDispatcher()); - - { - int i; - int numConstraints = m_constraints.size(); - for (i=0;i< numConstraints ; i++ ) - { - TypedConstraint* constraint = m_constraints[i]; - - const RigidBody* colObj0 = &constraint->GetRigidBodyA(); - const RigidBody* colObj1 = &constraint->GetRigidBodyB(); - - if (((colObj0) && ((colObj0)->mergesSimulationIslands())) && - ((colObj1) && ((colObj1)->mergesSimulationIslands()))) - { - if (colObj0->IsActive() || colObj1->IsActive()) - { - - GetSimulationIslandManager()->GetUnionFind().unite((colObj0)->m_islandTag1, - (colObj1)->m_islandTag1); - } - } - } - } - - //Store the island id in each body - GetSimulationIslandManager()->StoreIslandActivationState(GetCollisionWorld()); - -#ifdef USE_QUICKPROF - Profiler::endBlock("IslandUnionFind"); -#endif //USE_QUICKPROF - - - - ///build simulation islands - -#ifdef USE_QUICKPROF - Profiler::beginBlock("BuildIslands"); -#endif //USE_QUICKPROF - - std::vector<SimulationIsland> simulationIslands; - simulationIslands.resize(GetNumControllers()); - - int k; - for (k=0;k<GetNumControllers();k++) - { - CcdPhysicsController* ctrl = m_controllers[k]; - int tag = ctrl->GetRigidBody()->m_islandTag1; - if (tag>=0) - { - simulationIslands[tag].m_controllers.push_back(ctrl); - } - } - - Dispatcher* dispatcher = GetCollisionWorld()->GetDispatcher(); - - - //this is a brute force approach, will rethink later about more subtle ways - int i; - for (i=0;i< scene->GetNumOverlappingPairs();i++) - { - BroadphasePair* pair = &scene->GetOverlappingPair(i); - - CollisionObject* col0 = static_cast<CollisionObject*>(pair->m_pProxy0->m_clientObject); - CollisionObject* col1 = static_cast<CollisionObject*>(pair->m_pProxy1->m_clientObject); - - if (col0->m_islandTag1 > col1->m_islandTag1) - { - simulationIslands[col0->m_islandTag1].m_overlappingPairIndices.push_back(i); - } else - { - simulationIslands[col1->m_islandTag1].m_overlappingPairIndices.push_back(i); - } - } - - //store constraint indices for each island - for (i=0;i<m_constraints.size();i++) - { - TypedConstraint& constraint = *m_constraints[i]; - if (constraint.GetRigidBodyA().m_islandTag1 > constraint.GetRigidBodyB().m_islandTag1) - { - simulationIslands[constraint.GetRigidBodyA().m_islandTag1].m_constraintIndices.push_back(i); - } else - { - simulationIslands[constraint.GetRigidBodyB().m_islandTag1].m_constraintIndices.push_back(i); - } - - } - - //add all overlapping pairs for each island - - for (i=0;i<dispatcher->GetNumManifolds();i++) - { - PersistentManifold* manifold = dispatcher->GetManifoldByIndexInternal(i); - - //filtering for response - - CollisionObject* colObj0 = static_cast<CollisionObject*>(manifold->GetBody0()); - CollisionObject* colObj1 = static_cast<CollisionObject*>(manifold->GetBody1()); - { - int islandTag = colObj0->m_islandTag1; - if (colObj1->m_islandTag1 > islandTag) - islandTag = colObj1->m_islandTag1; - - if (dispatcher->NeedsResponse(*colObj0,*colObj1)) - simulationIslands[islandTag].m_manifolds.push_back(manifold); - - } - } - - #ifdef USE_QUICKPROF - Profiler::endBlock("BuildIslands"); - #endif //USE_QUICKPROF - - -#ifdef USE_QUICKPROF - Profiler::beginBlock("SimulateIsland"); -#endif //USE_QUICKPROF - - TypedConstraint** constraintBase = 0; - if (m_constraints.size()) - constraintBase = &m_constraints[0]; - - - - //Each simulation island can be processed in parallel (will be put on a job queue) - for (k=0;k<simulationIslands.size();k++) - { - if (simulationIslands[k].m_controllers.size()) - { - simulationIslands[k].Simulate(m_debugDrawer,m_numIterations, constraintBase ,&scene->GetOverlappingPair(0),dispatcher,GetBroadphase(),m_solver,timeStep); - } - } - -#ifdef USE_QUICKPROF - Profiler::endBlock("SimulateIsland"); -#endif //USE_QUICKPROF - - return true; - -}
\ No newline at end of file |