- Timestamp:
- Apr 8, 2009, 12:58:47 AM (16 years ago)
- Location:
- code/branches/questsystem5
- Files:
-
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/questsystem5
- Property svn:mergeinfo changed
-
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
r2907 r2908 53 53 { 54 54 m_doubleDispatch[i][j] = m_collisionConfiguration->getCollisionAlgorithmCreateFunc(i,j); 55 btAssert(m_doubleDispatch[i][j]);55 assert(m_doubleDispatch[i][j]); 56 56 } 57 57 } … … 80 80 btCollisionObject* body1 = (btCollisionObject*)b1; 81 81 82 //test for Bullet 2.74: use a relative contact breaking threshold without clamping against 'gContactBreakingThreshold' 83 //btScalar contactBreakingThreshold = btMin(gContactBreakingThreshold,btMin(body0->getCollisionShape()->getContactBreakingThreshold(),body1->getCollisionShape()->getContactBreakingThreshold())); 84 btScalar contactBreakingThreshold = btMin(body0->getCollisionShape()->getContactBreakingThreshold(),body1->getCollisionShape()->getContactBreakingThreshold()); 85 86 btScalar contactProcessingThreshold = btMin(body0->getContactProcessingThreshold(),body1->getContactProcessingThreshold()); 87 82 btScalar contactBreakingThreshold = btMin(gContactBreakingThreshold,btMin(body0->getCollisionShape()->getContactBreakingThreshold(),body1->getCollisionShape()->getContactBreakingThreshold())); 83 88 84 void* mem = 0; 89 85 … … 96 92 97 93 } 98 btPersistentManifold* manifold = new(mem) btPersistentManifold (body0,body1,0,contactBreakingThreshold ,contactProcessingThreshold);94 btPersistentManifold* manifold = new(mem) btPersistentManifold (body0,body1,0,contactBreakingThreshold); 99 95 manifold->m_index1a = m_manifoldsPtr.size(); 100 96 m_manifoldsPtr.push_back(manifold); … … 147 143 return algo; 148 144 } 145 149 146 150 147 … … 164 161 bool btCollisionDispatcher::needsCollision(btCollisionObject* body0,btCollisionObject* body1) 165 162 { 166 btAssert(body0);167 btAssert(body1);163 assert(body0); 164 assert(body1); 168 165 169 166 bool needsCollision = true; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCollisionObject.cpp
r2907 r2908 18 18 19 19 btCollisionObject::btCollisionObject() 20 : m_anisotropicFriction(1.f,1.f,1.f), 21 m_hasAnisotropicFriction(false), 22 m_contactProcessingThreshold(1e30f), 23 m_broadphaseHandle(0), 20 : m_broadphaseHandle(0), 24 21 m_collisionShape(0), 25 22 m_rootCollisionShape(0), -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCollisionObject.h
r2907 r2908 53 53 btVector3 m_interpolationLinearVelocity; 54 54 btVector3 m_interpolationAngularVelocity; 55 56 btVector3 m_anisotropicFriction;57 bool m_hasAnisotropicFriction;58 btScalar m_contactProcessingThreshold;59 60 55 btBroadphaseProxy* m_broadphaseHandle; 61 56 btCollisionShape* m_collisionShape; … … 120 115 CO_COLLISION_OBJECT =1, 121 116 CO_RIGID_BODY, 117 CO_SOFT_BODY, 122 118 ///CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter 123 119 ///It is useful for collision sensors, explosion objects, character controller etc. 124 CO_GHOST_OBJECT, 125 CO_SOFT_BODY, 126 CO_HF_FLUID 120 CO_GHOST_OBJECT 127 121 }; 128 122 … … 133 127 } 134 128 135 const btVector3& getAnisotropicFriction() const136 {137 return m_anisotropicFriction;138 }139 void setAnisotropicFriction(const btVector3& anisotropicFriction)140 {141 m_anisotropicFriction = anisotropicFriction;142 m_hasAnisotropicFriction = (anisotropicFriction[0]!=1.f) || (anisotropicFriction[1]!=1.f) || (anisotropicFriction[2]!=1.f);143 }144 bool hasAnisotropicFriction() const145 {146 return m_hasAnisotropicFriction;147 }148 149 ///the constraint solver can discard solving contacts, if the distance is above this threshold. 0 by default.150 ///Note that using contacts with positive distance can improve stability. It increases, however, the chance of colliding with degerate contacts, such as 'interior' triangle edges151 void setContactProcessingThreshold( btScalar contactProcessingThreshold)152 {153 m_contactProcessingThreshold = contactProcessingThreshold;154 }155 btScalar getContactProcessingThreshold() const156 {157 return m_contactProcessingThreshold;158 }159 129 160 130 SIMD_FORCE_INLINE bool isStaticObject() const { -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
r2907 r2908 70 70 getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(bp,m_dispatcher1); 71 71 getBroadphase()->destroyProxy(bp,m_dispatcher1); 72 collisionObject->setBroadphaseHandle(0);73 72 } 74 73 } … … 120 119 121 120 122 void btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)123 {124 btVector3 minAabb,maxAabb;125 colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);126 //need to increase the aabb for contact thresholds127 btVector3 contactThreshold(gContactBreakingThreshold,gContactBreakingThreshold,gContactBreakingThreshold);128 minAabb -= contactThreshold;129 maxAabb += contactThreshold;130 131 btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache;132 133 //moving objects should be moderately sized, probably something wrong if not134 if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < btScalar(1e12)))135 {136 bp->setAabb(colObj->getBroadphaseHandle(),minAabb,maxAabb, m_dispatcher1);137 } else138 {139 //something went wrong, investigate140 //this assert is unwanted in 3D modelers (danger of loosing work)141 colObj->setActivationState(DISABLE_SIMULATION);142 143 static bool reportMe = true;144 if (reportMe && m_debugDrawer)145 {146 reportMe = false;147 m_debugDrawer->reportErrorWarning("Overflow in AABB, object removed from simulation");148 m_debugDrawer->reportErrorWarning("If you can reproduce this, please email bugs@continuousphysics.com\n");149 m_debugDrawer->reportErrorWarning("Please include above information, your Platform, version of OS.\n");150 m_debugDrawer->reportErrorWarning("Thanks.\n");151 }152 }153 }154 155 121 void btCollisionWorld::updateAabbs() 156 122 { … … 165 131 if (colObj->isActive()) 166 132 { 167 updateSingleAabb(colObj); 168 } 169 } 133 btVector3 minAabb,maxAabb; 134 colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb); 135 //need to increase the aabb for contact thresholds 136 btVector3 contactThreshold(gContactBreakingThreshold,gContactBreakingThreshold,gContactBreakingThreshold); 137 minAabb -= contactThreshold; 138 maxAabb += contactThreshold; 139 140 btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache; 141 142 //moving objects should be moderately sized, probably something wrong if not 143 if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < btScalar(1e12))) 144 { 145 bp->setAabb(colObj->getBroadphaseHandle(),minAabb,maxAabb, m_dispatcher1); 146 } else 147 { 148 //something went wrong, investigate 149 //this assert is unwanted in 3D modelers (danger of loosing work) 150 colObj->setActivationState(DISABLE_SIMULATION); 151 152 static bool reportMe = true; 153 if (reportMe && m_debugDrawer) 154 { 155 reportMe = false; 156 m_debugDrawer->reportErrorWarning("Overflow in AABB, object removed from simulation"); 157 m_debugDrawer->reportErrorWarning("If you can reproduce this, please email bugs@continuousphysics.com\n"); 158 m_debugDrawer->reportErrorWarning("Please include above information, your Platform, version of OS.\n"); 159 m_debugDrawer->reportErrorWarning("Thanks.\n"); 160 } 161 } 162 } 163 } 164 170 165 } 171 166 … … 299 294 BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, 300 295 btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh): 301 //@BP Mod 302 btTriangleRaycastCallback(from,to, resultCallback->m_flags), 296 btTriangleRaycastCallback(from,to), 303 297 m_resultCallback(resultCallback), 304 298 m_collisionObject(collisionObject), … … 349 343 BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, 350 344 btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh): 351 //@BP Mod 352 btTriangleRaycastCallback(from,to, resultCallback->m_flags), 345 btTriangleRaycastCallback(from,to), 353 346 m_resultCallback(resultCallback), 354 347 m_collisionObject(collisionObject), … … 671 664 //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject(); 672 665 //btVector3 collisionObjectAabbMin,collisionObjectAabbMax; 673 #if 0 666 674 667 #ifdef RECALCULATE_AABB 675 668 btVector3 collisionObjectAabbMin,collisionObjectAabbMax; … … 679 672 const btVector3& collisionObjectAabbMin = collisionObject->getBroadphaseHandle()->m_aabbMin; 680 673 const btVector3& collisionObjectAabbMax = collisionObject->getBroadphaseHandle()->m_aabbMax; 681 #endif682 674 #endif 683 675 //btScalar hitLambda = m_resultCallback.m_closestHitFraction; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h
r2907 r2908 59 59 * 60 60 */ 61 62 63 61 64 62 … … 82 80 { 83 81 84 85 82 86 83 protected: 87 84 88 85 btAlignedObjectArray<btCollisionObject*> m_collisionObjects; 89 90 86 91 87 btDispatcher* m_dispatcher1; … … 99 95 btIDebugDraw* m_debugDrawer; 100 96 101 102 97 103 98 public: … … 138 133 return m_dispatcher1; 139 134 } 140 141 void updateSingleAabb(btCollisionObject* colObj);142 135 143 136 virtual void updateAabbs(); … … 161 154 int m_shapePart; 162 155 int m_triangleIndex; 163 164 156 165 157 //const btCollisionShape* m_shapeTemp; … … 194 186 short int m_collisionFilterGroup; 195 187 short int m_collisionFilterMask; 196 //@BP Mod - Custom flags, currently used to enable backface culling on tri-meshes, see btRaycastCallback197 unsigned int m_flags;198 188 199 189 virtual ~RayResultCallback() … … 209 199 m_collisionObject(0), 210 200 m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter), 211 m_collisionFilterMask(btBroadphaseProxy::AllFilter), 212 //@BP Mod 213 m_flags(0) 201 m_collisionFilterMask(btBroadphaseProxy::AllFilter) 214 202 { 215 203 } … … 239 227 btVector3 m_hitNormalWorld; 240 228 btVector3 m_hitPointWorld; 241 242 229 243 230 virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace) … … 245 232 //caller already does the filter on the m_closestHitFraction 246 233 btAssert(rayResult.m_hitFraction <= m_closestHitFraction); 247 248 234 249 235 m_closestHitFraction = rayResult.m_hitFraction; … … 292 278 short int m_collisionFilterGroup; 293 279 short int m_collisionFilterMask; 294 295 280 296 281 ConvexResultCallback() … … 304 289 { 305 290 } 306 307 291 308 292 bool hasHit() const … … 310 294 return (m_closestHitFraction < btScalar(1.)); 311 295 } 312 313 296 314 297 … … 339 322 btVector3 m_hitPointWorld; 340 323 btCollisionObject* m_hitCollisionObject; 341 342 324 343 325 virtual btScalar addSingleResult(LocalConvexResult& convexResult,bool normalInWorldSpace) … … 345 327 //caller already does the filter on the m_closestHitFraction 346 328 btAssert(convexResult.m_hitFraction <= m_closestHitFraction); 347 348 329 349 330 m_closestHitFraction = convexResult.m_hitFraction; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
r2907 r2908 20 20 #include "LinearMath/btIDebugDraw.h" 21 21 #include "LinearMath/btAabbUtil2.h" 22 #include "btManifoldResult.h"23 22 24 23 btCompoundCollisionAlgorithm::btCompoundCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped) … … 30 29 31 30 btCollisionObject* colObj = m_isSwapped? body1 : body0; 32 btAssert (colObj->getCollisionShape()->isCompound()); 31 btCollisionObject* otherObj = m_isSwapped? body0 : body1; 32 assert (colObj->getCollisionShape()->isCompound()); 33 33 34 34 btCompoundShape* compoundShape = static_cast<btCompoundShape*>(colObj->getCollisionShape()); 35 m_compoundShapeRevision = compoundShape->getUpdateRevision();36 37 preallocateChildAlgorithms(body0,body1);38 }39 40 void btCompoundCollisionAlgorithm::preallocateChildAlgorithms(btCollisionObject* body0,btCollisionObject* body1)41 {42 btCollisionObject* colObj = m_isSwapped? body1 : body0;43 btCollisionObject* otherObj = m_isSwapped? body0 : body1;44 btAssert (colObj->getCollisionShape()->isCompound());45 46 btCompoundShape* compoundShape = static_cast<btCompoundShape*>(colObj->getCollisionShape());47 48 35 int numChildren = compoundShape->getNumChildShapes(); 49 36 int i; … … 60 47 btCollisionShape* childShape = compoundShape->getChildShape(i); 61 48 colObj->internalSetTemporaryCollisionShape( childShape ); 62 m_childCollisionAlgorithms[i] = m_dispatcher->findAlgorithm(colObj,otherObj,m_sharedManifold);49 m_childCollisionAlgorithms[i] = ci.m_dispatcher1->findAlgorithm(colObj,otherObj,m_sharedManifold); 63 50 colObj->internalSetTemporaryCollisionShape( tmpShape ); 64 51 } … … 66 53 } 67 54 68 void btCompoundCollisionAlgorithm::removeChildAlgorithms() 55 56 btCompoundCollisionAlgorithm::~btCompoundCollisionAlgorithm() 69 57 { 70 58 int numChildren = m_childCollisionAlgorithms.size(); … … 78 66 } 79 67 } 80 }81 82 btCompoundCollisionAlgorithm::~btCompoundCollisionAlgorithm()83 {84 removeChildAlgorithms();85 68 } 86 69 … … 185 168 btCollisionObject* otherObj = m_isSwapped? body0 : body1; 186 169 187 188 189 btAssert (colObj->getCollisionShape()->isCompound()); 170 assert (colObj->getCollisionShape()->isCompound()); 190 171 btCompoundShape* compoundShape = static_cast<btCompoundShape*>(colObj->getCollisionShape()); 191 192 ///btCompoundShape might have changed:193 ////make sure the internal child collision algorithm caches are still valid194 if (compoundShape->getUpdateRevision() != m_compoundShapeRevision)195 {196 ///clear and update all197 removeChildAlgorithms();198 199 preallocateChildAlgorithms(body0,body1);200 }201 202 172 203 173 btDbvt* tree = compoundShape->getDynamicAabbTree(); … … 205 175 btCompoundLeafCallback callback(colObj,otherObj,m_dispatcher,dispatchInfo,resultOut,&m_childCollisionAlgorithms[0],m_sharedManifold); 206 176 207 ///we need to refresh all contact manifolds208 ///note that we should actually recursively traverse all children, btCompoundShape can nested more then 1 level deep209 ///so we should add a 'refreshManifolds' in the btCollisionAlgorithm210 {211 int i;212 btManifoldArray manifoldArray;213 for (i=0;i<m_childCollisionAlgorithms.size();i++)214 {215 if (m_childCollisionAlgorithms[i])216 {217 m_childCollisionAlgorithms[i]->getAllContactManifolds(manifoldArray);218 for (int m=0;m<manifoldArray.size();m++)219 {220 if (manifoldArray[m]->getNumContacts())221 {222 resultOut->setPersistentManifold(manifoldArray[m]);223 resultOut->refreshContactPoints();224 resultOut->setPersistentManifold(0);//??necessary?225 }226 }227 manifoldArray.clear();228 }229 }230 }231 177 232 178 if (tree) … … 297 243 btCollisionObject* otherObj = m_isSwapped? body0 : body1; 298 244 299 btAssert (colObj->getCollisionShape()->isCompound());245 assert (colObj->getCollisionShape()->isCompound()); 300 246 301 247 btCompoundShape* compoundShape = static_cast<btCompoundShape*>(colObj->getCollisionShape()); … … 340 286 341 287 342 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
r2907 r2908 27 27 #include "LinearMath/btAlignedObjectArray.h" 28 28 class btDispatcher; 29 class btCollisionObject;30 29 31 30 /// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes … … 37 36 class btPersistentManifold* m_sharedManifold; 38 37 bool m_ownsManifold; 39 40 int m_compoundShapeRevision;//to keep track of changes, so that childAlgorithm array can be updated41 38 42 void removeChildAlgorithms();43 44 void preallocateChildAlgorithms(btCollisionObject* body0,btCollisionObject* body1);45 46 39 public: 47 40 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
r2907 r2908 52 52 btConvexConvexAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) 53 53 { 54 m_numPerturbationIterations = 0;55 m_minimumPointsPerturbationThreshold = 3;56 54 m_simplexSolver = simplexSolver; 57 55 m_pdSolver = pdSolver; … … 62 60 } 63 61 64 btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver ,int numPerturbationIterations, int minimumPointsPerturbationThreshold)62 btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) 65 63 : btActivatingCollisionAlgorithm(ci,body0,body1), 66 64 m_simplexSolver(simplexSolver), … … 68 66 m_ownManifold (false), 69 67 m_manifoldPtr(mf), 70 m_lowLevelOfDetail(false) ,68 m_lowLevelOfDetail(false) 71 69 #ifdef USE_SEPDISTANCE_UTIL2 72 70 ,m_sepDistance((static_cast<btConvexShape*>(body0->getCollisionShape()))->getAngularMotionDisc(), 73 (static_cast<btConvexShape*>(body1->getCollisionShape()))->getAngularMotionDisc()) ,71 (static_cast<btConvexShape*>(body1->getCollisionShape()))->getAngularMotionDisc()) 74 72 #endif 75 m_numPerturbationIterations(numPerturbationIterations),76 m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)77 73 { 78 74 (void)body0; … … 98 94 99 95 100 struct btPerturbedContactResult : public btManifoldResult 101 { 102 btManifoldResult* m_originalManifoldResult; 103 btTransform m_transformA; 104 btTransform m_transformB; 105 btTransform m_unPerturbedTransform; 106 bool m_perturbA; 107 btIDebugDraw* m_debugDrawer; 108 109 110 btPerturbedContactResult(btManifoldResult* originalResult,const btTransform& transformA,const btTransform& transformB,const btTransform& unPerturbedTransform,bool perturbA,btIDebugDraw* debugDrawer) 111 :m_originalManifoldResult(originalResult), 112 m_transformA(transformA), 113 m_transformB(transformB), 114 m_perturbA(perturbA), 115 m_unPerturbedTransform(unPerturbedTransform), 116 m_debugDrawer(debugDrawer) 117 { 118 } 119 virtual ~ btPerturbedContactResult() 120 { 121 } 122 123 virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar orgDepth) 124 { 125 btVector3 endPt,startPt; 126 btScalar newDepth; 127 btVector3 newNormal; 128 129 if (m_perturbA) 130 { 131 btVector3 endPtOrg = pointInWorld + normalOnBInWorld*orgDepth; 132 endPt = (m_unPerturbedTransform*m_transformA.inverse())(endPtOrg); 133 newDepth = (endPt - pointInWorld).dot(normalOnBInWorld); 134 startPt = endPt+normalOnBInWorld*newDepth; 135 } else 136 { 137 endPt = pointInWorld + normalOnBInWorld*orgDepth; 138 startPt = (m_unPerturbedTransform*m_transformB.inverse())(pointInWorld); 139 newDepth = (endPt - startPt).dot(normalOnBInWorld); 140 141 } 142 143 //#define DEBUG_CONTACTS 1 144 #ifdef DEBUG_CONTACTS 145 m_debugDrawer->drawLine(startPt,endPt,btVector3(1,0,0)); 146 m_debugDrawer->drawSphere(startPt,0.05,btVector3(0,1,0)); 147 m_debugDrawer->drawSphere(endPt,0.05,btVector3(0,0,1)); 148 #endif //DEBUG_CONTACTS 149 150 151 m_originalManifoldResult->addContactPoint(normalOnBInWorld,startPt,newDepth); 152 } 153 154 }; 155 156 extern btScalar gContactBreakingThreshold; 96 97 157 98 158 99 // … … 170 111 resultOut->setPersistentManifold(m_manifoldPtr); 171 112 172 //comment-out next line to test multi-contact generation173 //resultOut->getPersistentManifold()->clearManifold();174 113 175 114 … … 208 147 209 148 gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw); 149 210 150 btScalar sepDist = gjkPairDetector.getCachedSeparatingDistance()+dispatchInfo.m_convexConservativeDistanceThreshold; 211 212 //now perturbe directions to get multiple contact points213 btVector3 v0,v1;214 btVector3 sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis().normalized();215 btPlaneSpace1(sepNormalWorldSpace,v0,v1);216 //now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects217 218 //perform perturbation when more then 'm_minimumPointsPerturbationThreshold' points219 if (resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)220 {221 222 int i;223 224 bool perturbeA = true;225 const btScalar angleLimit = 0.125f * SIMD_PI;226 btScalar perturbeAngle;227 btScalar radiusA = min0->getAngularMotionDisc();228 btScalar radiusB = min1->getAngularMotionDisc();229 if (radiusA < radiusB)230 {231 perturbeAngle = gContactBreakingThreshold /radiusA;232 perturbeA = true;233 } else234 {235 perturbeAngle = gContactBreakingThreshold / radiusB;236 perturbeA = false;237 }238 if ( perturbeAngle > angleLimit )239 perturbeAngle = angleLimit;240 241 btTransform unPerturbedTransform;242 if (perturbeA)243 {244 unPerturbedTransform = input.m_transformA;245 } else246 {247 unPerturbedTransform = input.m_transformB;248 }249 250 for ( i=0;i<m_numPerturbationIterations;i++)251 {252 btQuaternion perturbeRot(v0,perturbeAngle);253 btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));254 btQuaternion rotq(sepNormalWorldSpace,iterationAngle);255 256 257 if (perturbeA)258 {259 input.m_transformA.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body0->getWorldTransform().getBasis());260 input.m_transformB = body1->getWorldTransform();261 #ifdef DEBUG_CONTACTS262 dispatchInfo.m_debugDraw->drawTransform(input.m_transformA,10.0);263 #endif //DEBUG_CONTACTS264 } else265 {266 input.m_transformA = body0->getWorldTransform();267 input.m_transformB.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body1->getWorldTransform().getBasis());268 #ifdef DEBUG_CONTACTS269 dispatchInfo.m_debugDraw->drawTransform(input.m_transformB,10.0);270 #endif271 }272 273 btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB,unPerturbedTransform,perturbeA,dispatchInfo.m_debugDraw);274 gjkPairDetector.getClosestPoints(input,perturbedResultOut,dispatchInfo.m_debugDraw);275 276 277 }278 }279 280 281 151 282 152 #ifdef USE_SEPDISTANCE_UTIL2 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
r2907 r2908 34 34 ///#define USE_SEPDISTANCE_UTIL2 1 35 35 36 ///The convexConvexAlgorithm collision algorithm implements time of impact, convex closest points and penetration depth calculations between two convex objects. 37 ///Multiple contact points are calculated by perturbing the orientation of the smallest object orthogonal to the separating normal. 38 ///This idea was described by Gino van den Bergen in this forum topic http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=4&t=288&p=888#p888 36 ///ConvexConvexAlgorithm collision algorithm implements time of impact, convex closest points and penetration depth calculations. 39 37 class btConvexConvexAlgorithm : public btActivatingCollisionAlgorithm 40 38 { … … 50 48 bool m_lowLevelOfDetail; 51 49 52 int m_numPerturbationIterations;53 int m_minimumPointsPerturbationThreshold;54 55 56 50 ///cache separating vector to speedup collision detection 57 51 … … 59 53 public: 60 54 61 btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold); 62 55 btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); 63 56 64 57 virtual ~btConvexConvexAlgorithm(); … … 86 79 struct CreateFunc :public btCollisionAlgorithmCreateFunc 87 80 { 88 89 81 btConvexPenetrationDepthSolver* m_pdSolver; 90 82 btSimplexSolverInterface* m_simplexSolver; 91 int m_numPerturbationIterations; 92 int m_minimumPointsPerturbationThreshold; 93 83 94 84 CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); 95 85 … … 99 89 { 100 90 void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvexConvexAlgorithm)); 101 return new(mem) btConvexConvexAlgorithm(ci.m_manifold,ci,body0,body1,m_simplexSolver,m_pdSolver ,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold);91 return new(mem) btConvexConvexAlgorithm(ci.m_manifold,ci,body0,body1,m_simplexSolver,m_pdSolver); 102 92 } 103 93 }; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
r2907 r2908 5 5 This software is provided 'as-is', without any express or implied warranty. 6 6 In no event will the authors be held liable for any damages arising from the use of this software. 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 9 9 subject to the following restrictions: 10 10 … … 23 23 //#include <stdio.h> 24 24 25 btConvexPlaneCollisionAlgorithm::btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped , int numPerturbationIterations,int minimumPointsPerturbationThreshold)25 btConvexPlaneCollisionAlgorithm::btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped) 26 26 : btCollisionAlgorithm(ci), 27 27 m_ownManifold(false), 28 28 m_manifoldPtr(mf), 29 m_isSwapped(isSwapped), 30 m_numPerturbationIterations(numPerturbationIterations), 31 m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold) 29 m_isSwapped(isSwapped) 32 30 { 33 31 btCollisionObject* convexObj = m_isSwapped? col1 : col0; 34 32 btCollisionObject* planeObj = m_isSwapped? col0 : col1; 35 33 36 34 if (!m_manifoldPtr && m_dispatcher->needsCollision(convexObj,planeObj)) 37 35 { … … 51 49 } 52 50 53 void btConvexPlaneCollisionAlgorithm::collideSingleContact (const btQuaternion& perturbeRot, btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) 51 52 53 void btConvexPlaneCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) 54 54 { 55 btCollisionObject* convexObj = m_isSwapped? body1 : body0; 55 (void)dispatchInfo; 56 (void)resultOut; 57 if (!m_manifoldPtr) 58 return; 59 60 btCollisionObject* convexObj = m_isSwapped? body1 : body0; 56 61 btCollisionObject* planeObj = m_isSwapped? body0: body1; 57 62 … … 59 64 btStaticPlaneShape* planeShape = (btStaticPlaneShape*) planeObj->getCollisionShape(); 60 65 61 66 bool hasCollision = false; 62 67 const btVector3& planeNormal = planeShape->getPlaneNormal(); 63 68 const btScalar& planeConstant = planeShape->getPlaneConstant(); 64 65 btTransform convexWorldTransform = convexObj->getWorldTransform();69 btTransform planeInConvex; 70 planeInConvex= convexObj->getWorldTransform().inverse() * planeObj->getWorldTransform(); 66 71 btTransform convexInPlaneTrans; 67 convexInPlaneTrans= planeObj->getWorldTransform().inverse() * convexWorldTransform; 68 //now perturbe the convex-world transform 69 convexWorldTransform.getBasis()*=btMatrix3x3(perturbeRot); 70 btTransform planeInConvex; 71 planeInConvex= convexWorldTransform.inverse() * planeObj->getWorldTransform(); 72 72 convexInPlaneTrans= planeObj->getWorldTransform().inverse() * convexObj->getWorldTransform(); 73 73 74 btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis()*-planeNormal); 74 75 75 btVector3 vtxInPlane = convexInPlaneTrans(vtx); 76 76 btScalar distance = (planeNormal.dot(vtxInPlane) - planeConstant); … … 88 88 resultOut->addContactPoint(normalOnSurfaceB,pOnB,distance); 89 89 } 90 }91 92 93 void btConvexPlaneCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)94 {95 (void)dispatchInfo;96 if (!m_manifoldPtr)97 return;98 99 btCollisionObject* convexObj = m_isSwapped? body1 : body0;100 btCollisionObject* planeObj = m_isSwapped? body0: body1;101 102 btConvexShape* convexShape = (btConvexShape*) convexObj->getCollisionShape();103 btStaticPlaneShape* planeShape = (btStaticPlaneShape*) planeObj->getCollisionShape();104 105 bool hasCollision = false;106 const btVector3& planeNormal = planeShape->getPlaneNormal();107 const btScalar& planeConstant = planeShape->getPlaneConstant();108 109 //first perform a collision query with the non-perturbated collision objects110 {111 btQuaternion rotq(0,0,0,1);112 collideSingleContact(rotq,body0,body1,dispatchInfo,resultOut);113 }114 115 if (resultOut->getPersistentManifold()->getNumContacts()<m_minimumPointsPerturbationThreshold)116 {117 btVector3 v0,v1;118 btPlaneSpace1(planeNormal,v0,v1);119 //now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects120 121 const btScalar angleLimit = 0.125f * SIMD_PI;122 btScalar perturbeAngle;123 btScalar radius = convexShape->getAngularMotionDisc();124 perturbeAngle = gContactBreakingThreshold / radius;125 if ( perturbeAngle > angleLimit )126 perturbeAngle = angleLimit;127 128 btQuaternion perturbeRot(v0,perturbeAngle);129 for (int i=0;i<m_numPerturbationIterations;i++)130 {131 btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));132 btQuaternion rotq(planeNormal,iterationAngle);133 collideSingleContact(rotq.inverse()*perturbeRot*rotq,body0,body1,dispatchInfo,resultOut);134 }135 }136 137 90 if (m_ownManifold) 138 91 { -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
r2907 r2908 5 5 This software is provided 'as-is', without any express or implied warranty. 6 6 In no event will the authors be held liable for any damages arising from the use of this software. 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 7 Permission is granted to anyone to use this software for any purpose, 8 including commercial applications, and to alter it and redistribute it freely, 9 9 subject to the following restrictions: 10 10 … … 29 29 class btConvexPlaneCollisionAlgorithm : public btCollisionAlgorithm 30 30 { 31 bool 31 bool m_ownManifold; 32 32 btPersistentManifold* m_manifoldPtr; 33 bool m_isSwapped; 34 int m_numPerturbationIterations; 35 int m_minimumPointsPerturbationThreshold; 36 33 bool m_isSwapped; 34 37 35 public: 38 36 39 btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped , int numPerturbationIterations,int minimumPointsPerturbationThreshold);37 btConvexPlaneCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped); 40 38 41 39 virtual ~btConvexPlaneCollisionAlgorithm(); 42 40 43 41 virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); 44 45 void collideSingleContact (const btQuaternion& perturbeRot, btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);46 42 47 43 virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); … … 57 53 struct CreateFunc :public btCollisionAlgorithmCreateFunc 58 54 { 59 int m_numPerturbationIterations;60 int m_minimumPointsPerturbationThreshold;61 62 CreateFunc()63 : m_numPerturbationIterations(3),64 m_minimumPointsPerturbationThreshold(3)65 {66 }67 68 55 virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) 69 56 { … … 71 58 if (!m_swapped) 72 59 { 73 return new(mem) btConvexPlaneCollisionAlgorithm(0,ci,body0,body1,false ,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold);60 return new(mem) btConvexPlaneCollisionAlgorithm(0,ci,body0,body1,false); 74 61 } else 75 62 { 76 return new(mem) btConvexPlaneCollisionAlgorithm(0,ci,body0,body1,true ,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold);63 return new(mem) btConvexPlaneCollisionAlgorithm(0,ci,body0,body1,true); 77 64 } 78 65 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
r2907 r2908 289 289 return m_emptyCreateFunc; 290 290 } 291 292 void btDefaultCollisionConfiguration::setConvexConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)293 {294 btConvexConvexAlgorithm::CreateFunc* convexConvex = (btConvexConvexAlgorithm::CreateFunc*) m_convexConvexCreateFunc;295 convexConvex->m_numPerturbationIterations = numPerturbationIterations;296 convexConvex->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;297 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
r2907 r2908 112 112 virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1); 113 113 114 ///Use this method to allow to generate multiple contact points between at once, between two objects using the generic convex-convex algorithm.115 ///By default, this feature is disabled for best performance.116 ///@param numPerturbationIterations controls the number of collision queries. Set it to zero to disable the feature.117 ///@param minimumPointsPerturbationThreshold is the minimum number of points in the contact cache, above which the feature is disabled118 ///3 is a good value for both params, if you want to enable the feature. This is because the default contact cache contains a maximum of 4 points, and one collision query at the unperturbed orientation is performed first.119 ///See Bullet/Demos/CollisionDemo for an example how this feature gathers multiple points.120 ///@todo we could add a per-object setting of those parameters, for level-of-detail collision detection.121 void setConvexConvexMultipointIterations(int numPerturbationIterations=3, int minimumPointsPerturbationThreshold = 3);122 114 123 115 }; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btGhostObject.cpp
r2907 r2908 64 64 btPairCachingGhostObject::~btPairCachingGhostObject() 65 65 { 66 m_hashPairCache->~btHashedOverlappingPairCache();67 66 btAlignedFree( m_hashPairCache ); 68 67 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btManifoldResult.cpp
r2907 r2908 56 56 void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth) 57 57 { 58 btAssert(m_manifoldPtr);58 assert(m_manifoldPtr); 59 59 //order in manifold needs to match 60 60 … … 93 93 newPt.m_index0 = m_index0; 94 94 newPt.m_index1 = m_index1; 95 //printf("depth=%f\n",depth);95 96 96 ///@todo, check this for any side effects 97 97 if (insertIndex >= 0) -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btManifoldResult.h
r2907 r2908 46 46 int m_index0; 47 47 int m_index1; 48 49 50 48 public: 51 49 … … 80 78 } 81 79 82 83 80 virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth); 84 81 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
r2907 r2908 25 25 #include "LinearMath/btQuickprof.h" 26 26 27 btSimulationIslandManager::btSimulationIslandManager(): 28 m_splitIslands(true) 27 btSimulationIslandManager::btSimulationIslandManager() 29 28 { 30 29 } … … 45 44 46 45 { 47 46 btBroadphasePair* pairPtr = colWorld->getPairCache()->getOverlappingPairArrayPtr(); 47 48 48 for (int i=0;i<colWorld->getPairCache()->getNumOverlappingPairs();i++) 49 49 { 50 btBroadphasePair* pairPtr = colWorld->getPairCache()->getOverlappingPairArrayPtr();51 50 const btBroadphasePair& collisionPair = pairPtr[i]; 52 51 btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject; … … 187 186 } 188 187 189 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));188 assert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1)); 190 189 if (colObj0->getIslandTag() == islandId) 191 190 { … … 214 213 } 215 214 216 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));215 assert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1)); 217 216 218 217 if (colObj0->getIslandTag() == islandId) … … 235 234 } 236 235 237 btAssert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1));236 assert((colObj0->getIslandTag() == islandId) || (colObj0->getIslandTag() == -1)); 238 237 239 238 if (colObj0->getIslandTag() == islandId) … … 253 252 int maxNumManifolds = dispatcher->getNumManifolds(); 254 253 255 //#define SPLIT_ISLANDS 1256 //#ifdef SPLIT_ISLANDS257 258 259 //#endif //SPLIT_ISLANDS254 #define SPLIT_ISLANDS 1 255 #ifdef SPLIT_ISLANDS 256 257 258 #endif //SPLIT_ISLANDS 260 259 261 260 … … 281 280 colObj0->activate(); 282 281 } 283 if(m_splitIslands) 284 { 285 //filtering for response 286 if (dispatcher->needsResponse(colObj0,colObj1)) 287 m_islandmanifold.push_back(manifold); 288 } 282 #ifdef SPLIT_ISLANDS 283 // //filtering for response 284 if (dispatcher->needsResponse(colObj0,colObj1)) 285 m_islandmanifold.push_back(manifold); 286 #endif //SPLIT_ISLANDS 289 287 } 290 288 } … … 306 304 BT_PROFILE("processIslands"); 307 305 308 if(!m_splitIslands) 309 { 310 btPersistentManifold** manifold = dispatcher->getInternalManifoldPointer(); 311 int maxNumManifolds = dispatcher->getNumManifolds(); 312 callback->ProcessIsland(&collisionObjects[0],collisionObjects.size(),manifold,maxNumManifolds, -1); 313 } 314 else 315 { 316 // Sort manifolds, based on islands 317 // Sort the vector using predicate and std::sort 318 //std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate); 319 320 int numManifolds = int (m_islandmanifold.size()); 321 322 //we should do radix sort, it it much faster (O(n) instead of O (n log2(n)) 323 m_islandmanifold.quickSort(btPersistentManifoldSortPredicate()); 324 325 //now process all active islands (sets of manifolds for now) 326 327 int startManifoldIndex = 0; 328 int endManifoldIndex = 1; 329 330 //int islandId; 331 332 333 334 // printf("Start Islands\n"); 335 336 //traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated 337 for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex) 338 { 339 int islandId = getUnionFind().getElement(startIslandIndex).m_id; 340 341 342 bool islandSleeping = false; 343 344 for (endIslandIndex = startIslandIndex;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++) 345 { 346 int i = getUnionFind().getElement(endIslandIndex).m_sz; 347 btCollisionObject* colObj0 = collisionObjects[i]; 348 m_islandBodies.push_back(colObj0); 349 if (!colObj0->isActive()) 350 islandSleeping = true; 351 } 352 353 354 //find the accompanying contact manifold for this islandId 355 int numIslandManifolds = 0; 356 btPersistentManifold** startManifold = 0; 357 358 if (startManifoldIndex<numManifolds) 359 { 360 int curIslandId = getIslandId(m_islandmanifold[startManifoldIndex]); 361 if (curIslandId == islandId) 362 { 363 startManifold = &m_islandmanifold[startManifoldIndex]; 364 365 for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(m_islandmanifold[endManifoldIndex]));endManifoldIndex++) 366 { 367 368 } 369 /// Process the actual simulation, only if not sleeping/deactivated 370 numIslandManifolds = endManifoldIndex-startManifoldIndex; 371 } 372 373 } 374 375 if (!islandSleeping) 376 { 377 callback->ProcessIsland(&m_islandBodies[0],m_islandBodies.size(),startManifold,numIslandManifolds, islandId); 378 // printf("Island callback of size:%d bodies, %d manifolds\n",islandBodies.size(),numIslandManifolds); 379 } 306 #ifndef SPLIT_ISLANDS 307 btPersistentManifold** manifold = dispatcher->getInternalManifoldPointer(); 308 309 callback->ProcessIsland(&collisionObjects[0],collisionObjects.size(),manifold,maxNumManifolds, -1); 310 #else 311 // Sort manifolds, based on islands 312 // Sort the vector using predicate and std::sort 313 //std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate); 314 315 int numManifolds = int (m_islandmanifold.size()); 316 317 //we should do radix sort, it it much faster (O(n) instead of O (n log2(n)) 318 m_islandmanifold.quickSort(btPersistentManifoldSortPredicate()); 319 320 //now process all active islands (sets of manifolds for now) 321 322 int startManifoldIndex = 0; 323 int endManifoldIndex = 1; 324 325 //int islandId; 326 327 328 329 // printf("Start Islands\n"); 330 331 //traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated 332 for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex) 333 { 334 int islandId = getUnionFind().getElement(startIslandIndex).m_id; 335 336 337 bool islandSleeping = false; 338 339 for (endIslandIndex = startIslandIndex;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++) 340 { 341 int i = getUnionFind().getElement(endIslandIndex).m_sz; 342 btCollisionObject* colObj0 = collisionObjects[i]; 343 m_islandBodies.push_back(colObj0); 344 if (!colObj0->isActive()) 345 islandSleeping = true; 346 } 347 348 349 //find the accompanying contact manifold for this islandId 350 int numIslandManifolds = 0; 351 btPersistentManifold** startManifold = 0; 352 353 if (startManifoldIndex<numManifolds) 354 { 355 int curIslandId = getIslandId(m_islandmanifold[startManifoldIndex]); 356 if (curIslandId == islandId) 357 { 358 startManifold = &m_islandmanifold[startManifoldIndex]; 380 359 381 if (numIslandManifolds) 382 { 383 startManifoldIndex = endManifoldIndex; 384 } 385 386 m_islandBodies.resize(0); 387 } 388 } // else if(!splitIslands) 389 390 } 360 for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(m_islandmanifold[endManifoldIndex]));endManifoldIndex++) 361 { 362 363 } 364 /// Process the actual simulation, only if not sleeping/deactivated 365 numIslandManifolds = endManifoldIndex-startManifoldIndex; 366 } 367 368 } 369 370 if (!islandSleeping) 371 { 372 callback->ProcessIsland(&m_islandBodies[0],m_islandBodies.size(),startManifold,numIslandManifolds, islandId); 373 // printf("Island callback of size:%d bodies, %d manifolds\n",islandBodies.size(),numIslandManifolds); 374 } 375 376 if (numIslandManifolds) 377 { 378 startManifoldIndex = endManifoldIndex; 379 } 380 381 m_islandBodies.resize(0); 382 } 383 #endif //SPLIT_ISLANDS 384 385 386 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
r2907 r2908 36 36 btAlignedObjectArray<btCollisionObject* > m_islandBodies; 37 37 38 bool m_splitIslands;39 38 40 39 public: … … 67 66 void buildIslands(btDispatcher* dispatcher,btCollisionWorld* colWorld); 68 67 69 bool getSplitIslands()70 {71 return m_splitIslands;72 }73 void setSplitIslands(bool doSplitIslands)74 {75 m_splitIslands = doSplitIslands;76 }77 78 68 }; 79 69 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
r2907 r2908 79 79 80 80 ///point on A (worldspace) 81 ///btVector3 pos0 = col0->getWorldTransform().getOrigin() - radius0 * normalOnSurfaceB;81 btVector3 pos0 = col0->getWorldTransform().getOrigin() - radius0 * normalOnSurfaceB; 82 82 ///point on B (worldspace) 83 83 btVector3 pos1 = col1->getWorldTransform().getOrigin() + radius1* normalOnSurfaceB; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btUnionFind.cpp
r2907 r2908 15 15 16 16 #include "btUnionFind.h" 17 #include <assert.h> 18 17 19 18 20 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionDispatch/btUnionFind.h
r2907 r2908 99 99 int find(int x) 100 100 { 101 // btAssert(x < m_N);102 // btAssert(x >= 0);101 //assert(x < m_N); 102 //assert(x >= 0); 103 103 104 104 while (x != m_elements[x].m_id) … … 111 111 #endif // 112 112 x = m_elements[x].m_id; 113 // btAssert(x < m_N);114 // btAssert(x >= 0);113 //assert(x < m_N); 114 //assert(x >= 0); 115 115 116 116 }
Note: See TracChangeset
for help on using the changeset viewer.