diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-11-29 08:24:52 +0300 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-11-29 08:24:52 +0300 |
commit | e720f86a836b9343388beafb56be5be9956a3629 (patch) | |
tree | a703505b43d0936b433dd0fc177644ebdbc2b64b /extern/bullet2/src/BulletCollision/CollisionDispatch | |
parent | c5db2965fad723982857c9099114360330f90146 (diff) |
updated to latest Bullet 2.x
Diffstat (limited to 'extern/bullet2/src/BulletCollision/CollisionDispatch')
7 files changed, 53 insertions, 76 deletions
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp index c9d21f2d9a3..e8865a2c45a 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp @@ -101,7 +101,7 @@ btPersistentManifold* btCollisionDispatcher::getNewManifold(void* b0,void* b1) { gNumManifold++; - //ASSERT(gNumManifold < 65535); + //btAssert(gNumManifold < 65535); btCollisionObject* body0 = (btCollisionObject*)b0; @@ -145,7 +145,7 @@ void btCollisionDispatcher::releaseManifold(btPersistentManifold* manifold) btCollisionAlgorithm* btCollisionDispatcher::findAlgorithm(btCollisionObject* body0,btCollisionObject* body1,btPersistentManifold* sharedManifold) { -#define USE_DISPATCH_REGISTRY_ARRAY 1 + #ifdef USE_DISPATCH_REGISTRY_ARRAY btCollisionAlgorithmConstructionInfo ci; @@ -194,6 +194,7 @@ btCollisionAlgorithmCreateFunc* btCollisionDispatcher::internalFindCreateFunc(in } +#ifndef USE_DISPATCH_REGISTRY_ARRAY btCollisionAlgorithm* btCollisionDispatcher::internalFindAlgorithm(btCollisionObject* body0,btCollisionObject* body1,btPersistentManifold* sharedManifold) { @@ -232,6 +233,7 @@ btCollisionAlgorithm* btCollisionDispatcher::internalFindAlgorithm(btCollisionOb return new btEmptyAlgorithm(ci); } +#endif //USE_DISPATCH_REGISTRY_ARRAY bool btCollisionDispatcher::needsResponse(btCollisionObject* body0,btCollisionObject* body1) { diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h index 4e97bce9d65..41bc98e1dca 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h @@ -30,7 +30,7 @@ class btOverlappingPairCache; #include "btCollisionCreateFunc.h" - +#define USE_DISPATCH_REGISTRY_ARRAY 1 ///btCollisionDispatcher supports algorithms that handle ConvexConvex and ConvexConcave collision pairs. @@ -56,7 +56,9 @@ class btCollisionDispatcher : public btDispatcher btCollisionAlgorithmCreateFunc* m_swappedCompoundCreateFunc; btCollisionAlgorithmCreateFunc* m_emptyCreateFunc; +#ifndef USE_DISPATCH_REGISTRY_ARRAY btCollisionAlgorithm* internalFindAlgorithm(btCollisionObject* body0,btCollisionObject* body1,btPersistentManifold* sharedManifold = 0); +#endif //USE_DISPATCH_REGISTRY_ARRAY public: diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index 775ed3e13d8..9df6d7186ec 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -25,6 +25,7 @@ subject to the following restrictions: #include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" #include "LinearMath/btAabbUtil2.h" #include "LinearMath/btQuickprof.h" +#include "LinearMath/btStackAlloc.h" //When the user doesn't provide dispatcher or broadphase, create basic versions (and delete them in destructor) #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" @@ -32,26 +33,22 @@ subject to the following restrictions: #include <algorithm> -btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache) +btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache, int stackSize) :m_dispatcher1(dispatcher), m_broadphasePairCache(pairCache), m_ownsDispatcher(false), m_ownsBroadphasePairCache(false) { -} - - -btCollisionWorld::btCollisionWorld() -: m_dispatcher1(new btCollisionDispatcher()), -m_broadphasePairCache(new btSimpleBroadphase()), -m_ownsDispatcher(true), -m_ownsBroadphasePairCache(true) -{ + m_stackAlloc = new btStackAlloc(stackSize); + m_dispatchInfo.m_stackAllocator = m_stackAlloc; } btCollisionWorld::~btCollisionWorld() { + m_stackAlloc->destroy(); + delete m_stackAlloc; + //clean up remaining objects std::vector<btCollisionObject*>::iterator i; diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h index e212e520bda..9c548784829 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h @@ -64,7 +64,7 @@ subject to the following restrictions: #ifndef COLLISION_WORLD_H #define COLLISION_WORLD_H - +class btStackAlloc; class btCollisionShape; class btBroadphaseInterface; #include "LinearMath/btVector3.h" @@ -88,6 +88,10 @@ protected: btDispatcher* m_dispatcher1; + btDispatcherInfo m_dispatchInfo; + + btStackAlloc* m_stackAlloc; + btOverlappingPairCache* m_broadphasePairCache; bool m_ownsDispatcher; @@ -95,11 +99,8 @@ protected: public: - //this constructor will create and own a dispatcher and paircache and delete it at destruction - btCollisionWorld(); - //this constructor doesn't own the dispatcher and paircache/broadphase - btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache); + btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache, int stackSize = 2*1024*1024); virtual ~btCollisionWorld(); @@ -237,7 +238,12 @@ public: void removeCollisionObject(btCollisionObject* collisionObject); virtual void performDiscreteCollisionDetection( btDispatcherInfo& dispatchInfo); - + + btDispatcherInfo& getDispatchInfo() + { + return m_dispatchInfo; + } + }; diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp index 8ad3967bac2..06adb3a04c8 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp @@ -172,7 +172,7 @@ void btConvexConcaveCollisionAlgorithm::processCollision (btCollisionObject* bod btCollisionObject* triOb = triBody; - ConcaveShape* concaveShape = static_cast<ConcaveShape*>( triOb->getCollisionShape()); + btConcaveShape* concaveShape = static_cast<btConcaveShape*>( triOb->getCollisionShape()); if (convexBody->getCollisionShape()->isConvex()) { @@ -288,7 +288,7 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject btCollisionObject* concavebody = triBody; - ConcaveShape* triangleMesh = (ConcaveShape*) concavebody->getCollisionShape(); + btConcaveShape* triangleMesh = (btConcaveShape*) concavebody->getCollisionShape(); if (triangleMesh) { diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp index e896508bdb9..09457aea3e9 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp @@ -61,37 +61,28 @@ subject to the following restrictions: #endif //USE_HULL -bool gUseEpa = true; - - -#ifdef WIN32 -void DrawRasterizerLine(const float* from,const float* to,int color); -#endif - - - - -//#define PROCESS_SINGLE_CONTACT -#ifdef WIN32 -bool gForceBoxBox = false;//false;//true; - -#else -bool gForceBoxBox = false;//false;//true; -#endif -bool gBoxBoxUseGjk = true;//true;//false; -bool gDisableConvexCollision = false; +btConvexConvexAlgorithm::CreateFunc::CreateFunc() +{ + m_ownsSolvers = true; + m_simplexSolver = new btVoronoiSimplexSolver(); + m_pdSolver = new btGjkEpaPenetrationDepthSolver; +} +btConvexConvexAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) +{ + m_ownsSolvers = false; + m_simplexSolver = simplexSolver; + m_pdSolver = pdSolver; +} -btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1) +btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) : btCollisionAlgorithm(ci), -m_gjkPairDetector(0,0,&m_simplexSolver,0), -m_useEpa(!gUseEpa), +m_gjkPairDetector(0,0,simplexSolver,pdSolver), m_ownManifold (false), m_manifoldPtr(mf), m_lowLevelOfDetail(false) { - checkPenetrationDepthSolver(); } @@ -115,27 +106,6 @@ void btConvexConvexAlgorithm ::setLowLevelOfDetail(bool useLowLevel) -static btGjkEpaPenetrationDepthSolver gEpaPenetrationDepthSolver; -static btMinkowskiPenetrationDepthSolver gPenetrationDepthSolver; - - - -void btConvexConvexAlgorithm::checkPenetrationDepthSolver() -{ - if (m_useEpa != gUseEpa) - { - m_useEpa = gUseEpa; - if (m_useEpa) - { - m_gjkPairDetector.setPenetrationDepthSolver(&gEpaPenetrationDepthSolver); - } else - { - m_gjkPairDetector.setPenetrationDepthSolver(&gPenetrationDepthSolver); - } - } - -} - // // Convex-Convex collision algorithm @@ -164,7 +134,6 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl resultOut->addContactPoint(results.normal,results.witnesses[1],-results.depth); } #else - checkPenetrationDepthSolver(); btConvexShape* min0 = static_cast<btConvexShape*>(body0->getCollisionShape()); btConvexShape* min1 = static_cast<btConvexShape*>(body1->getCollisionShape()); @@ -176,7 +145,8 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl m_gjkPairDetector.setMinkowskiB(min1); input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold(); input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared; - + input.m_stackAlloc = dispatchInfo.m_stackAllocator; + // input.m_maximumDistanceSquared = 1e30f; input.m_transformA = body0->getWorldTransform(); @@ -209,7 +179,6 @@ float btConvexConvexAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btC if (disableCcd) return 1.f; - checkPenetrationDepthSolver(); //An adhoc way of testing the Continuous Collision Detection algorithms //One object is approximated as a sphere, to simplify things diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h index 1cd94408f1f..ccfe6d5b8cb 100644 --- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h +++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h @@ -28,23 +28,17 @@ class btConvexPenetrationDepthSolver; ///ConvexConvexAlgorithm collision algorithm implements time of impact, convex closest points and penetration depth calculations. class btConvexConvexAlgorithm : public btCollisionAlgorithm { - //ConvexPenetrationDepthSolver* m_penetrationDepthSolver; - btVoronoiSimplexSolver m_simplexSolver; btGjkPairDetector m_gjkPairDetector; - bool m_useEpa; public: bool m_ownManifold; btPersistentManifold* m_manifoldPtr; bool m_lowLevelOfDetail; - - void checkPenetrationDepthSolver(); - public: - btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1); + btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); virtual ~btConvexConvexAlgorithm(); @@ -62,9 +56,16 @@ public: struct CreateFunc :public btCollisionAlgorithmCreateFunc { + btConvexPenetrationDepthSolver* m_pdSolver; + btSimplexSolverInterface* m_simplexSolver; + bool m_ownsSolvers; + + CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); + CreateFunc(); + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) { - return new btConvexConvexAlgorithm(ci.m_manifold,ci,body0,body1); + return new btConvexConvexAlgorithm(ci.m_manifold,ci,body0,body1,m_simplexSolver,m_pdSolver); } }; |