Changeset 2908 for code/branches/questsystem5/src/bullet/BulletCollision
- Timestamp:
- Apr 8, 2009, 12:58:47 AM (16 years ago)
- Location:
- code/branches/questsystem5
- Files:
-
- 69 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/questsystem5
- Property svn:mergeinfo changed
-
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
r2907 r2908 20 20 #include "btAxisSweep3.h" 21 21 22 #include <assert.h> 22 23 23 24 btAxisSweep3::btAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned short int maxHandles, btOverlappingPairCache* pairCache, bool disableRaycastAccelerator) -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h
r2907 r2908 43 43 public: 44 44 45 BT_DECLARE_ALIGNED_ALLOCATOR();46 45 47 46 class Edge … … 140 139 SIMD_FORCE_INLINE Handle* getHandle(BP_FP_INT_TYPE index) const {return m_pHandles + index;} 141 140 142 v irtual void resetPool(btDispatcher* dispatcher);141 void resetPool(); 143 142 144 143 void processAllOverlappingPairs(btOverlapCallback* callback); … … 222 221 223 222 if (checkCardinality) 224 btAssert(numEdges == m_numHandles*2+1);223 assert(numEdges == m_numHandles*2+1); 225 224 } 226 225 #endif //DEBUG_BROADPHASE … … 348 347 } 349 348 350 // btAssert(bounds.HasVolume());349 //assert(bounds.HasVolume()); 351 350 352 351 // init bounds … … 454 453 BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::allocHandle() 455 454 { 456 btAssert(m_firstFreeHandle);455 assert(m_firstFreeHandle); 457 456 458 457 BP_FP_INT_TYPE handle = m_firstFreeHandle; … … 466 465 void btAxisSweep3Internal<BP_FP_INT_TYPE>::freeHandle(BP_FP_INT_TYPE handle) 467 466 { 468 btAssert(handle > 0 && handle < m_maxHandles);467 assert(handle > 0 && handle < m_maxHandles); 469 468 470 469 getHandle(handle)->SetNextFree(m_firstFreeHandle); … … 589 588 590 589 template <typename BP_FP_INT_TYPE> 591 void btAxisSweep3Internal<BP_FP_INT_TYPE>::resetPool( btDispatcher* dispatcher)590 void btAxisSweep3Internal<BP_FP_INT_TYPE>::resetPool() 592 591 { 593 592 if (m_numHandles == 0) … … 643 642 if (!isDuplicate) 644 643 { 645 ///important to use an AABB test that is consistent with the broadphase646 644 bool hasOverlap = testAabbOverlap(pair.m_pProxy0,pair.m_pProxy1); 647 645 … … 689 687 } 690 688 689 690 691 692 691 693 } 692 694 … … 729 731 void btAxisSweep3Internal<BP_FP_INT_TYPE>::updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher) 730 732 { 731 // btAssert(bounds.IsFinite());732 // btAssert(bounds.HasVolume());733 // assert(bounds.IsFinite()); 734 //assert(bounds.HasVolume()); 733 735 734 736 Handle* pHandle = getHandle(handle); -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
r2907 r2908 65 65 virtual void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const =0; 66 66 67 ///reset broadphase internal structures, to ensure determinism/reproducability68 virtual void resetPool(btDispatcher* dispatcher) {};69 70 67 virtual void printStats() = 0; 71 68 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
r2907 r2908 70 70 71 71 SOFTBODY_SHAPE_PROXYTYPE, 72 HFFLUID_SHAPE_PROXYTYPE, 73 HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE, 72 74 73 INVALID_SHAPE_PROXYTYPE, 75 74 … … 189 188 190 189 //keep them sorted, so the std::set operations work 191 if ( proxy0.m_uniqueId < proxy1.m_uniqueId)190 if (&proxy0 < &proxy1) 192 191 { 193 192 m_pProxy0 = &proxy0; … … 230 229 bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b ) 231 230 { 232 const int uidA0 = a.m_pProxy0 ? a.m_pProxy0->m_uniqueId : -1; 233 const int uidB0 = b.m_pProxy0 ? b.m_pProxy0->m_uniqueId : -1; 234 const int uidA1 = a.m_pProxy1 ? a.m_pProxy1->m_uniqueId : -1; 235 const int uidB1 = b.m_pProxy1 ? b.m_pProxy1->m_uniqueId : -1; 236 237 return uidA0 > uidB0 || 238 (a.m_pProxy0 == b.m_pProxy0 && uidA1 > uidB1) || 231 return a.m_pProxy0 > b.m_pProxy0 || 232 (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 > b.m_pProxy1) || 239 233 (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm > b.m_algorithm); 240 234 } -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btDbvt.cpp
r2907 r2908 394 394 } 395 395 396 #if 0 396 // 397 397 static DBVT_INLINE btDbvtNode* walkup(btDbvtNode* n,int count) 398 398 { … … 400 400 return(n); 401 401 } 402 #endif403 402 404 403 // … … 425 424 void btDbvt::clear() 426 425 { 427 if(m_root) 428 recursedeletenode(this,m_root); 426 if(m_root) recursedeletenode(this,m_root); 429 427 btAlignedFree(m_free); 430 428 m_free=0; 431 m_lkhd = -1;432 m_stkStack.clear();433 m_opath = 0;434 435 429 } 436 430 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btDbvt.h
r2907 r2908 58 58 59 59 //SSE gives errors on a MSVC 7.1 60 #if def BT_USE_SSE60 #if (defined (WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && (!defined (BT_USE_DOUBLE_PRECISION)) 61 61 #define DBVT_SELECT_IMPL DBVT_IMPL_SSE 62 62 #define DBVT_MERGE_IMPL DBVT_IMPL_SSE … … 83 83 #define DBVT_PREFIX template <typename T> 84 84 #define DBVT_IPOLICY T& policy 85 #define DBVT_CHECKTYPE static const ICollide& typechecker=*(T*) 1;(void)typechecker;85 #define DBVT_CHECKTYPE static const ICollide& typechecker=*(T*)0; 86 86 #else 87 87 #define DBVT_VIRTUAL_DTOR(a) virtual ~a() {} … … 147 147 DBVT_INLINE friend bool Intersect( const btDbvtAabbMm& a, 148 148 const btDbvtAabbMm& b); 149 149 DBVT_INLINE friend bool Intersect( const btDbvtAabbMm& a, 150 const btDbvtAabbMm& b, 151 const btTransform& xform); 150 152 DBVT_INLINE friend bool Intersect( const btDbvtAabbMm& a, 151 153 const btVector3& b); … … 303 305 const btDbvtNode* root1, 304 306 DBVT_IPOLICY); 305 #if 0 307 306 308 DBVT_PREFIX 307 309 void collideTT( const btDbvtNode* root0, … … 315 317 const btTransform& xform1, 316 318 DBVT_IPOLICY); 317 #endif318 319 319 DBVT_PREFIX 320 320 void collideTV( const btDbvtNode* root, … … 531 531 } 532 532 533 533 // 534 DBVT_INLINE bool Intersect( const btDbvtAabbMm& a, 535 const btDbvtAabbMm& b, 536 const btTransform& xform) 537 { 538 const btVector3 d0=xform*b.Center()-a.Center(); 539 const btVector3 d1=d0*xform.getBasis(); 540 btScalar s0[2]={0,0}; 541 btScalar s1[2]={dot(xform.getOrigin(),d0),s1[0]}; 542 a.AddSpan(d0,s0[0],s0[1]); 543 b.AddSpan(d1,s1[0],s1[1]); 544 if(s0[0]>(s1[1])) return(false); 545 if(s0[1]<(s1[0])) return(false); 546 return(true); 547 } 534 548 535 549 // … … 835 849 } 836 850 837 #if 0 851 838 852 // 839 853 DBVT_PREFIX … … 891 905 } 892 906 } 907 893 908 // 894 909 DBVT_PREFIX … … 902 917 collideTT(root0,root1,xform,policy); 903 918 } 904 #endif905 919 906 920 // -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
r2907 r2908 101 101 btDbvtProxy* pb=(btDbvtProxy*)nb->data; 102 102 #if DBVT_BP_SORTPAIRS 103 if(pa->m_uniqueId>pb->m_uniqueId) 104 btSwap(pa,pb); 103 if(pa>pb) btSwap(pa,pb); 105 104 #endif 106 105 pbp->m_paircache->addOverlappingPair(pa,pb); … … 134 133 m_updates_done = 0; 135 134 m_updates_ratio = 0; 136 m_paircache = paircache? paircache : new(btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache(); 135 m_paircache = paircache? 136 paircache : 137 new(btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache(); 137 138 m_gid = 0; 138 139 m_pid = 0; … … 210 211 } 211 212 212 struct BroadphaseRayTester : btDbvt::ICollide213 {214 btBroadphaseRayCallback& m_rayCallback;215 BroadphaseRayTester(btBroadphaseRayCallback& orgCallback)216 :m_rayCallback(orgCallback)217 {218 }219 void Process(const btDbvtNode* leaf)220 {221 btDbvtProxy* proxy=(btDbvtProxy*)leaf->data;222 m_rayCallback.process(proxy);223 }224 };225 226 213 void btDbvtBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback,const btVector3& aabbMin,const btVector3& aabbMax) 227 214 { 215 216 struct BroadphaseRayTester : btDbvt::ICollide 217 { 218 btBroadphaseRayCallback& m_rayCallback; 219 BroadphaseRayTester(btBroadphaseRayCallback& orgCallback) 220 :m_rayCallback(orgCallback) 221 { 222 } 223 void Process(const btDbvtNode* leaf) 224 { 225 btDbvtProxy* proxy=(btDbvtProxy*)leaf->data; 226 m_rayCallback.process(proxy); 227 } 228 }; 229 228 230 BroadphaseRayTester callback(rayCallback); 229 231 … … 340 342 } 341 343 #endif 342 343 performDeferredRemoval(dispatcher);344 345 }346 347 void btDbvtBroadphase::performDeferredRemoval(btDispatcher* dispatcher)348 {349 350 if (m_paircache->hasDeferredRemoval())351 {352 353 btBroadphasePairArray& overlappingPairArray = m_paircache->getOverlappingPairArray();354 355 //perform a sort, to find duplicates and to sort 'invalid' pairs to the end356 overlappingPairArray.quickSort(btBroadphasePairSortPredicate());357 358 int invalidPair = 0;359 360 361 int i;362 363 btBroadphasePair previousPair;364 previousPair.m_pProxy0 = 0;365 previousPair.m_pProxy1 = 0;366 previousPair.m_algorithm = 0;367 368 369 for (i=0;i<overlappingPairArray.size();i++)370 {371 372 btBroadphasePair& pair = overlappingPairArray[i];373 374 bool isDuplicate = (pair == previousPair);375 376 previousPair = pair;377 378 bool needsRemoval = false;379 380 if (!isDuplicate)381 {382 //important to perform AABB check that is consistent with the broadphase383 btDbvtProxy* pa=(btDbvtProxy*)pair.m_pProxy0;384 btDbvtProxy* pb=(btDbvtProxy*)pair.m_pProxy1;385 bool hasOverlap = Intersect(pa->leaf->volume,pb->leaf->volume);386 387 if (hasOverlap)388 {389 needsRemoval = false;390 } else391 {392 needsRemoval = true;393 }394 } else395 {396 //remove duplicate397 needsRemoval = true;398 //should have no algorithm399 btAssert(!pair.m_algorithm);400 }401 402 if (needsRemoval)403 {404 m_paircache->cleanOverlappingPair(pair,dispatcher);405 406 pair.m_pProxy0 = 0;407 pair.m_pProxy1 = 0;408 invalidPair++;409 }410 411 }412 413 //perform a sort, to sort 'invalid' pairs to the end414 overlappingPairArray.quickSort(btBroadphasePairSortPredicate());415 overlappingPairArray.resize(overlappingPairArray.size() - invalidPair);416 }417 344 } 418 345 … … 420 347 void btDbvtBroadphase::collide(btDispatcher* dispatcher) 421 348 { 422 /*printf("---------------------------------------------------------\n");423 printf("m_sets[0].m_leaves=%d\n",m_sets[0].m_leaves);424 printf("m_sets[1].m_leaves=%d\n",m_sets[1].m_leaves);425 printf("numPairs = %d\n",getOverlappingPairCache()->getNumOverlappingPairs());426 {427 int i;428 for (i=0;i<getOverlappingPairCache()->getNumOverlappingPairs();i++)429 {430 printf("pair[%d]=(%d,%d),",i,getOverlappingPairCache()->getOverlappingPairArray()[i].m_pProxy0->getUid(),431 getOverlappingPairCache()->getOverlappingPairArray()[i].m_pProxy1->getUid());432 }433 printf("\n");434 }435 */436 437 438 439 349 SPC(m_profiling.m_total); 440 350 /* optimize */ … … 492 402 if(pairs.size()>0) 493 403 { 494 495 int ni=btMin( pairs.size(),btMax<int>(m_newpairs,(pairs.size()*m_cupdates)/100));404 const int ci=pairs.size(); 405 int ni=btMin(ci,btMax<int>(m_newpairs,(ci*m_cupdates)/100)); 496 406 for(int i=0;i<ni;++i) 497 407 { 498 btBroadphasePair& p=pairs[(m_cid+i)% pairs.size()];408 btBroadphasePair& p=pairs[(m_cid+i)%ci]; 499 409 btDbvtProxy* pa=(btDbvtProxy*)p.m_pProxy0; 500 410 btDbvtProxy* pb=(btDbvtProxy*)p.m_pProxy1; … … 502 412 { 503 413 #if DBVT_BP_SORTPAIRS 504 if(pa->m_uniqueId>pb->m_uniqueId) 505 btSwap(pa,pb); 414 if(pa>pb) btSwap(pa,pb); 506 415 #endif 507 416 m_paircache->removeOverlappingPair(pa,pb,dispatcher); … … 558 467 aabbMin=bounds.Mins(); 559 468 aabbMax=bounds.Maxs(); 560 }561 562 void btDbvtBroadphase::resetPool(btDispatcher* dispatcher)563 {564 565 int totalObjects = m_sets[0].m_leaves + m_sets[1].m_leaves;566 if (!totalObjects)567 {568 //reset internal dynamic tree data structures569 m_sets[0].clear();570 m_sets[1].clear();571 572 m_deferedcollide = false;573 m_needcleanup = true;574 m_prediction = 1/(btScalar)2;575 m_stageCurrent = 0;576 m_fixedleft = 0;577 m_fupdates = 1;578 m_dupdates = 0;579 m_cupdates = 10;580 m_newpairs = 1;581 m_updates_call = 0;582 m_updates_done = 0;583 m_updates_ratio = 0;584 585 m_gid = 0;586 m_pid = 0;587 m_cid = 0;588 for(int i=0;i<=STAGECOUNT;++i)589 {590 m_stageRoots[i]=0;591 }592 }593 469 } 594 470 … … 725 601 #undef SPC 726 602 #endif 727 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
r2907 r2908 25 25 26 26 #define DBVT_BP_PROFILE 0 27 //#define DBVT_BP_SORTPAIRS 127 #define DBVT_BP_SORTPAIRS 1 28 28 #define DBVT_BP_PREVENTFALSEUPDATE 0 29 29 #define DBVT_BP_ACCURATESLEEPING 0 … … 115 115 void printStats(); 116 116 static void benchmark(btBroadphaseInterface*); 117 118 119 void performDeferredRemoval(btDispatcher* dispatcher);120 121 ///reset broadphase internal structures, to ensure determinism/reproducability122 virtual void resetPool(btDispatcher* dispatcher);123 124 117 }; 125 118 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.cpp
r2907 r2908 483 483 484 484 } 485 486 void btMultiSapBroadphase::resetPool(btDispatcher* dispatcher)487 {488 // not yet489 } -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h
r2907 r2908 144 144 void quicksort (btBroadphasePairArray& a, int lo, int hi); 145 145 146 ///reset broadphase internal structures, to ensure determinism/reproducability147 virtual void resetPool(btDispatcher* dispatcher);148 149 146 }; 150 147 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
r2907 r2908 20 20 #include "btDispatcher.h" 21 21 #include "btCollisionAlgorithm.h" 22 #include "LinearMath/btAabbUtil2.h"23 22 24 23 #include <stdio.h> … … 137 136 { 138 137 gFindPairs++; 139 if(proxy0->m_uniqueId>proxy1->m_uniqueId) 140 btSwap(proxy0,proxy1); 138 if(proxy0>proxy1) btSwap(proxy0,proxy1); 141 139 int proxyId1 = proxy0->getUid(); 142 140 int proxyId2 = proxy1->getUid(); … … 214 212 btBroadphasePair* btHashedOverlappingPairCache::internalAddPair(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) 215 213 { 216 if(proxy0->m_uniqueId>proxy1->m_uniqueId) 217 btSwap(proxy0,proxy1); 214 if(proxy0>proxy1) btSwap(proxy0,proxy1); 218 215 int proxyId1 = proxy0->getUid(); 219 216 int proxyId2 = proxy1->getUid(); … … 274 271 { 275 272 gRemovePairs++; 276 if(proxy0->m_uniqueId>proxy1->m_uniqueId) 277 btSwap(proxy0,proxy1); 273 if(proxy0>proxy1) btSwap(proxy0,proxy1); 278 274 int proxyId1 = proxy0->getUid(); 279 275 int proxyId2 = proxy1->getUid(); … … 397 393 } 398 394 399 void btHashedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)400 {401 ///need to keep hashmap in sync with pair address, so rebuild all402 btBroadphasePairArray tmpPairs;403 int i;404 for (i=0;i<m_overlappingPairArray.size();i++)405 {406 tmpPairs.push_back(m_overlappingPairArray[i]);407 }408 409 for (i=0;i<tmpPairs.size();i++)410 {411 removeOverlappingPair(tmpPairs[i].m_pProxy0,tmpPairs[i].m_pProxy1,dispatcher);412 }413 414 for (i = 0; i < m_next.size(); i++)415 {416 m_next[i] = BT_NULL_PAIR;417 }418 419 tmpPairs.quickSort(btBroadphasePairSortPredicate());420 421 for (i=0;i<tmpPairs.size();i++)422 {423 addOverlappingPair(tmpPairs[i].m_pProxy0,tmpPairs[i].m_pProxy1);424 }425 426 427 }428 395 429 396 … … 463 430 { 464 431 //don't add overlap with own 465 btAssert(proxy0 != proxy1);432 assert(proxy0 != proxy1); 466 433 467 434 if (!needsBroadphaseCollision(proxy0,proxy1)) … … 494 461 if (findIndex < m_overlappingPairArray.size()) 495 462 { 496 // btAssert(it != m_overlappingPairSet.end());463 //assert(it != m_overlappingPairSet.end()); 497 464 btBroadphasePair* pair = &m_overlappingPairArray[findIndex]; 498 465 return pair; … … 524 491 { 525 492 cleanOverlappingPair(*pair,dispatcher); 526 pair->m_pProxy0 = 0; 527 pair->m_pProxy1 = 0; 528 m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1); 493 494 m_overlappingPairArray.swap(i,m_overlappingPairArray.capacity()-1); 529 495 m_overlappingPairArray.pop_back(); 530 496 gOverlappingPairs--; … … 626 592 processAllOverlappingPairs(&removeCallback,dispatcher); 627 593 } 628 629 void btSortedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)630 {631 //should already be sorted632 }633 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
r2907 r2908 84 84 85 85 virtual void setInternalGhostPairCallback(btOverlappingPairCallback* ghostPairCallback)=0; 86 87 virtual void sortOverlappingPairs(btDispatcher* dispatcher) = 0;88 89 86 90 87 }; … … 263 260 } 264 261 265 virtual void sortOverlappingPairs(btDispatcher* dispatcher); 266 267 268 protected: 262 public: 269 263 270 264 btAlignedObjectArray<int> m_hashTable; … … 376 370 } 377 371 378 virtual void sortOverlappingPairs(btDispatcher* dispatcher);379 380 372 381 373 }; … … 456 448 } 457 449 458 virtual void sortOverlappingPairs(btDispatcher* dispatcher)459 {460 }461 450 462 451 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
r2907 r2908 470 470 471 471 #ifdef RAYAABB2 472 btVector3 rayFrom = raySource; 472 473 btVector3 rayDir = (rayTarget-raySource); 473 474 rayDir.normalize (); … … 558 559 559 560 #ifdef RAYAABB2 561 btVector3 rayFrom = raySource; 560 562 btVector3 rayDirection = (rayTarget-raySource); 561 563 rayDirection.normalize (); … … 816 818 #include <new> 817 819 818 #if 0819 820 //PCK: consts 820 821 static const unsigned BVH_ALIGNMENT = 16; … … 822 823 823 824 static const unsigned BVH_ALIGNMENT_BLOCKS = 2; 824 #endif 825 825 826 826 827 … … 1146 1147 1147 1148 1148 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
r2907 r2908 325 325 } 326 326 327 void btSimpleBroadphase::resetPool(btDispatcher* dispatcher) 328 { 329 //not yet 330 } 327 328 -
code/branches/questsystem5/src/bullet/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
r2907 r2908 109 109 } 110 110 111 ///reset broadphase internal structures, to ensure determinism/reproducability112 virtual void resetPool(btDispatcher* dispatcher);113 114 111 115 112 void validate(); -
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 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btBoxShape.h
r2907 r2908 162 162 { 163 163 case 0: 164 plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.),-halfExtents.x()); 164 plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.)); 165 plane[3] = -halfExtents.x(); 165 166 break; 166 167 case 1: 167 plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.),-halfExtents.x()); 168 plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.)); 169 plane[3] = -halfExtents.x(); 168 170 break; 169 171 case 2: 170 plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.),-halfExtents.y()); 172 plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.)); 173 plane[3] = -halfExtents.y(); 171 174 break; 172 175 case 3: 173 plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.),-halfExtents.y()); 176 plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.)); 177 plane[3] = -halfExtents.y(); 174 178 break; 175 179 case 4: 176 plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.),-halfExtents.z()); 180 plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.)); 181 plane[3] = -halfExtents.z(); 177 182 break; 178 183 case 5: 179 plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.),-halfExtents.z()); 184 plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.)); 185 plane[3] = -halfExtents.z(); 180 186 break; 181 187 default: 182 btAssert(0);188 assert(0); 183 189 } 184 190 } … … 307 313 break; 308 314 default: 309 btAssert(0);315 assert(0); 310 316 } 311 317 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btCollisionShape.cpp
r2907 r2908 15 15 16 16 #include "BulletCollision/CollisionShapes/btCollisionShape.h" 17 18 19 btScalar gContactThresholdFactor=btScalar(0.02);20 17 21 18 … … 48 45 btScalar btCollisionShape::getContactBreakingThreshold() const 49 46 { 50 return getAngularMotionDisc() * gContactThresholdFactor; 47 ///@todo make this 0.1 configurable 48 return getAngularMotionDisc() * btScalar(0.1); 51 49 } 52 50 btScalar btCollisionShape::getAngularMotionDisc() const -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btCompoundShape.cpp
r2907 r2908 23 23 m_collisionMargin(btScalar(0.)), 24 24 m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)), 25 m_dynamicAabbTree(0), 26 m_updateRevision(1) 25 m_dynamicAabbTree(0) 27 26 { 28 27 m_shapeType = COMPOUND_SHAPE_PROXYTYPE; … … 48 47 void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisionShape* shape) 49 48 { 50 m_updateRevision++;51 49 //m_childTransforms.push_back(localTransform); 52 50 //m_childShapes.push_back(shape); … … 57 55 child.m_childMargin = shape->getMargin(); 58 56 59 57 m_children.push_back(child); 58 60 59 //extend the local aabbMin/aabbMax 61 60 btVector3 localAabbMin,localAabbMax; … … 76 75 { 77 76 const btDbvtVolume bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax); 78 int index = m_children.size() ;77 int index = m_children.size()-1; 79 78 child.m_node = m_dynamicAabbTree->insert(bounds,(void*)index); 80 79 } 81 82 m_children.push_back(child);83 80 84 81 } … … 103 100 void btCompoundShape::removeChildShapeByIndex(int childShapeIndex) 104 101 { 105 m_updateRevision++;106 102 btAssert(childShapeIndex >=0 && childShapeIndex < m_children.size()); 107 103 if (m_dynamicAabbTree) … … 118 114 void btCompoundShape::removeChildShape(btCollisionShape* shape) 119 115 { 120 m_updateRevision++;121 116 // Find the children containing the shape specified, and remove those children. 122 117 //note: there might be multiple children using the same shape! … … 145 140 // Recalculate the local aabb 146 141 // Brute force, it iterates over all the shapes left. 147 148 142 m_localAabbMin = btVector3(btScalar(1e30),btScalar(1e30),btScalar(1e30)); 149 143 m_localAabbMax = btVector3(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30)); … … 168 162 { 169 163 btVector3 localHalfExtents = btScalar(0.5)*(m_localAabbMax-m_localAabbMin); 164 localHalfExtents += btVector3(getMargin(),getMargin(),getMargin()); 170 165 btVector3 localCenter = btScalar(0.5)*(m_localAabbMax+m_localAabbMin); 171 172 //avoid an illegal AABB when there are no children173 if (!m_children.size())174 {175 localHalfExtents.setValue(0,0,0);176 localCenter.setValue(0,0,0);177 }178 localHalfExtents += btVector3(getMargin(),getMargin(),getMargin());179 180 166 181 167 btMatrix3x3 abs_b = trans.getBasis().absolute(); … … 188 174 aabbMin = center-extent; 189 175 aabbMax = center+extent; 190 176 191 177 } 192 178 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btCompoundShape.h
r2907 r2908 59 59 60 60 btDbvt* m_dynamicAabbTree; 61 62 ///increment m_updateRevision when adding/removing/replacing child shapes, so that some caches can be updated63 int m_updateRevision;64 61 65 62 public: … … 156 153 void calculatePrincipalAxisTransform(btScalar* masses, btTransform& principal, btVector3& inertia) const; 157 154 158 int getUpdateRevision() const159 {160 return m_updateRevision;161 }162 155 163 156 private: -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btConeShape.cpp
r2907 r2908 61 61 break; 62 62 default: 63 btAssert(0);63 assert(0); 64 64 }; 65 65 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btConvexHullShape.cpp
r2907 r2908 182 182 bool btConvexHullShape::isInside(const btVector3& ,btScalar ) const 183 183 { 184 btAssert(0);184 assert(0); 185 185 return false; 186 186 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
r2907 r2908 151 151 bool btConvexPointCloudShape::isInside(const btVector3& ,btScalar ) const 152 152 { 153 btAssert(0);153 assert(0); 154 154 return false; 155 155 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btConvexShape.cpp
r2907 r2908 155 155 156 156 btCapsuleShape* capsuleShape = (btCapsuleShape*)this; 157 btVector3 halfExtents = capsuleShape->getImplicitShapeDimensions(); 157 158 btScalar halfHeight = capsuleShape->getHalfHeight(); 158 159 int capsuleUpAxis = capsuleShape->getUpAxis(); … … 301 302 { 302 303 btSphereShape* sphereShape = (btSphereShape*)this; 303 btScalarradius = sphereShape->getImplicitShapeDimensions().getX();// * convexShape->getLocalScaling().getX();304 btScalarmargin = radius + sphereShape->getMarginNonVirtual();304 float radius = sphereShape->getImplicitShapeDimensions().getX();// * convexShape->getLocalScaling().getX(); 305 float margin = radius + sphereShape->getMarginNonVirtual(); 305 306 const btVector3& center = t.getOrigin(); 306 307 btVector3 extent(margin,margin,margin); … … 314 315 { 315 316 btBoxShape* convexShape = (btBoxShape*)this; 316 btScalarmargin=convexShape->getMarginNonVirtual();317 float margin=convexShape->getMarginNonVirtual(); 317 318 btVector3 halfExtents = convexShape->getImplicitShapeDimensions(); 318 319 halfExtents += btVector3(margin,margin,margin); -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
r2907 r2908 145 145 } 146 146 147 148 /// This returns the "raw" (user's initial) height, not the actual height. 149 /// The actual height needs to be adjusted to be relative to the center 150 /// of the heightfield's AABB. 151 btScalar 152 btHeightfieldTerrainShape::getRawHeightFieldValue(int x,int y) const 147 btScalar btHeightfieldTerrainShape::getHeightFieldValue(int x,int y) const 153 148 { 154 149 btScalar val = 0.f; … … 187 182 188 183 189 /// this returns the vertex in bullet-local coordinates 184 190 185 void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const 191 186 { 187 192 188 btAssert(x>=0); 193 189 btAssert(y>=0); … … 195 191 btAssert(y<m_heightStickLength); 196 192 197 btScalar height = getRawHeightFieldValue(x,y); 193 194 btScalar height = getHeightFieldValue(x,y); 198 195 199 196 switch (m_upAxis) … … 202 199 { 203 200 vertex.setValue( 204 height - m_localOrigin.getX(),201 height, 205 202 (-m_width/btScalar(2.0)) + x, 206 203 (-m_length/btScalar(2.0) ) + y … … 212 209 vertex.setValue( 213 210 (-m_width/btScalar(2.0)) + x, 214 height - m_localOrigin.getY(),211 height, 215 212 (-m_length/btScalar(2.0)) + y 216 213 ); … … 222 219 (-m_width/btScalar(2.0)) + x, 223 220 (-m_length/btScalar(2.0)) + y, 224 height - m_localOrigin.getZ()221 height 225 222 ); 226 223 break; … … 234 231 235 232 vertex*=m_localScaling; 233 236 234 } 237 235 … … 241 239 getQuantized 242 240 ( 243 btScalarx241 float x 244 242 ) 245 243 { -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
r2907 r2908 30 30 center (as determined by width and length and height, with each 31 31 axis multiplied by the localScaling). 32 33 \b NOTE: be careful with coordinates. If you have a heightfield with a local34 min height of -100m, and a max height of +500m, you may be tempted to place it35 at the origin (0,0) and expect the heights in world coordinates to be36 -100 to +500 meters.37 Actually, the heights will be -300 to +300m, because bullet will re-center38 the heightfield based on its AABB (which is determined by the min/max39 heights). So keep in mind that once you create a btHeightfieldTerrainShape40 object, the heights will be adjusted relative to the center of the AABB. This41 is different to the behavior of many rendering engines, but is useful for42 physics engines.43 32 44 33 Most (but not all) rendering and heightfield libraries assume upAxis = 1 … … 100 89 btVector3 m_localScaling; 101 90 102 virtual btScalar get RawHeightFieldValue(int x,int y) const;91 virtual btScalar getHeightFieldValue(int x,int y) const; 103 92 void quantizeWithClamp(int* out, const btVector3& point,int isMax) const; 104 93 void getVertex(int x,int y,btVector3& vertex) const; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
r2907 r2908 29 29 btVector3 btMinkowskiSumShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const 30 30 { 31 btVector3 supVertexA = m_transA(m_shapeA->localGetSupportingVertexWithoutMargin( vec*m_transA.getBasis()));32 btVector3 supVertexB = m_transB(m_shapeB->localGetSupportingVertexWithoutMargin( -vec*m_transB.getBasis()));31 btVector3 supVertexA = m_transA(m_shapeA->localGetSupportingVertexWithoutMargin(-vec*m_transA.getBasis())); 32 btVector3 supVertexB = m_transB(m_shapeB->localGetSupportingVertexWithoutMargin(vec*m_transB.getBasis())); 33 33 return supVertexA - supVertexB; 34 34 } -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
r2907 r2908 32 32 BT_DECLARE_ALIGNED_ALLOCATOR(); 33 33 34 btMultimaterialTriangleMeshShape(): btBvhTriangleMeshShape() { m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE;}34 btMultimaterialTriangleMeshShape(): btBvhTriangleMeshShape() {} 35 35 btMultimaterialTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true): 36 36 btBvhTriangleMeshShape(meshInterface, useQuantizedAabbCompression, buildBvh) 37 37 { 38 m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE;39 40 38 btVector3 m_triangle[3]; 41 39 const unsigned char *vertexbase; … … 70 68 btBvhTriangleMeshShape(meshInterface, useQuantizedAabbCompression, bvhAabbMin, bvhAabbMax, buildBvh) 71 69 { 72 m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE;73 74 70 btVector3 m_triangle[3]; 75 71 const unsigned char *vertexbase; … … 112 108 */ 113 109 } 110 virtual int getShapeType() const 111 { 112 return MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE; 113 } 114 114 115 //debugging 115 116 virtual const char* getName()const {return "MULTIMATERIALTRIANGLEMESH";} -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btSphereShape.h
r2907 r2908 48 48 btScalar getRadius() const { return m_implicitShapeDimensions.getX() * m_localScaling.getX();} 49 49 50 void setUnscaledRadius(btScalar radius)51 {52 m_implicitShapeDimensions.setX(radius);53 btConvexInternalShape::setMargin(radius);54 }55 56 50 //debugging 57 51 virtual const char* getName()const {return "SPHERE";} -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
r2907 r2908 83 83 } 84 84 85 86 void btTriangleIndexVertexArray::setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ) const 85 void btTriangleIndexVertexArray::setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ) 87 86 { 88 87 m_aabbMin = aabbMin; … … 97 96 } 98 97 99 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
r2907 r2908 53 53 IndexedMeshArray m_indexedMeshes; 54 54 int m_pad[2]; 55 mutableint m_hasAabb; // using int instead of bool to maintain alignment56 mutablebtVector3 m_aabbMin;57 mutablebtVector3 m_aabbMax;55 int m_hasAabb; // using int instead of bool to maintain alignment 56 btVector3 m_aabbMin; 57 btVector3 m_aabbMax; 58 58 59 59 public: … … 107 107 108 108 virtual bool hasPremadeAabb() const; 109 virtual void setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ) const;109 virtual void setPremadeAabb(const btVector3& aabbMin, const btVector3& aabbMax ); 110 110 virtual void getPremadeAabb(btVector3* aabbMin, btVector3* aabbMax ) const; 111 111 -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
r2907 r2908 1 2 1 /* 3 2 Bullet Continuous Collision Detection and Physics Library -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btTriangleMesh.cpp
r2907 r2908 36 36 { 37 37 m_indexedMeshes[0].m_numTriangles = m_32bitIndices.size()/3; 38 m_indexedMeshes[0].m_triangleIndexBase = 0;38 m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_32bitIndices[0]; 39 39 m_indexedMeshes[0].m_indexType = PHY_INTEGER; 40 40 m_indexedMeshes[0].m_triangleIndexStride = 3*sizeof(int); … … 42 42 { 43 43 m_indexedMeshes[0].m_numTriangles = m_16bitIndices.size()/3; 44 m_indexedMeshes[0].m_triangleIndexBase = 0;44 m_indexedMeshes[0].m_triangleIndexBase = (unsigned char*) &m_16bitIndices[0]; 45 45 m_indexedMeshes[0].m_indexType = PHY_SHORT; 46 46 m_indexedMeshes[0].m_triangleIndexStride = 3*sizeof(short int); … … 50 50 { 51 51 m_indexedMeshes[0].m_numVertices = m_4componentVertices.size(); 52 m_indexedMeshes[0].m_vertexBase = 0;52 m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_4componentVertices[0]; 53 53 m_indexedMeshes[0].m_vertexStride = sizeof(btVector3); 54 54 } else 55 55 { 56 56 m_indexedMeshes[0].m_numVertices = m_3componentVertices.size()/3; 57 m_indexedMeshes[0].m_vertexBase = 0;57 m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0]; 58 58 m_indexedMeshes[0].m_vertexStride = 3*sizeof(btScalar); 59 59 } … … 112 112 } 113 113 } 114 m_3componentVertices.push_back( (float)vertex.getX());115 m_3componentVertices.push_back( (float)vertex.getY());116 m_3componentVertices.push_back( (float)vertex.getZ());114 m_3componentVertices.push_back(vertex.getX()); 115 m_3componentVertices.push_back(vertex.getY()); 116 m_3componentVertices.push_back(vertex.getZ()); 117 117 m_indexedMeshes[0].m_numVertices++; 118 118 m_indexedMeshes[0].m_vertexBase = (unsigned char*)&m_3componentVertices[0]; -
code/branches/questsystem5/src/bullet/BulletCollision/CollisionShapes/btTriangleMeshShape.h
r2907 r2908 41 41 virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const 42 42 { 43 btAssert(0);43 assert(0); 44 44 return localGetSupportingVertex(vec); 45 45 } -
code/branches/questsystem5/src/bullet/BulletCollision/Gimpact/btGImpactBvh.cpp
r2907 r2908 151 151 } 152 152 153 btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex)))); 153 bool unbal = (splitIndex==startIndex) || (splitIndex == (endIndex)); 154 btAssert(!unbal); 154 155 155 156 return splitIndex; -
code/branches/questsystem5/src/bullet/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
r2907 r2908 172 172 } 173 173 174 btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex)))); 174 bool unbal = (splitIndex==startIndex) || (splitIndex == (endIndex)); 175 btAssert(!unbal); 175 176 176 177 return splitIndex; -
code/branches/questsystem5/src/bullet/BulletCollision/Gimpact/btGImpactShape.h
r2907 r2908 882 882 class btGImpactMeshShape : public btGImpactShapeInterface 883 883 { 884 btStridingMeshInterface* m_meshInterface;885 886 884 protected: 887 885 btAlignedObjectArray<btGImpactMeshShapePart*> m_mesh_parts; … … 910 908 btGImpactMeshShape(btStridingMeshInterface * meshInterface) 911 909 { 912 m_meshInterface = meshInterface;913 910 buildMeshParts(meshInterface); 914 911 } … … 926 923 927 924 928 btStridingMeshInterface* getMeshInterface()929 {930 return m_meshInterface;931 }932 933 const btStridingMeshInterface* getMeshInterface() const934 {935 return m_meshInterface;936 }937 925 938 926 int getMeshPartCount() const … … 1046 1034 1047 1035 //! call when reading child shapes 1048 virtual void lockChildShapes() const1049 { 1050 btAssert(0); 1051 } 1052 1053 virtual void unlockChildShapes() const1036 virtual void lockChildShapes() 1037 { 1038 btAssert(0); 1039 } 1040 1041 virtual void unlockChildShapes() 1054 1042 { 1055 1043 btAssert(0); -
code/branches/questsystem5/src/bullet/BulletCollision/Gimpact/gim_box_set.cpp
r2907 r2908 111 111 } 112 112 113 btAssert(!((splitIndex==startIndex) || (splitIndex == (endIndex)))); 113 bool unbal = (splitIndex==startIndex) || (splitIndex == (endIndex)); 114 btAssert(!unbal); 114 115 115 116 return splitIndex; … … 180 181 } 181 182 182 -
code/branches/questsystem5/src/bullet/BulletCollision/Gimpact/gim_math.h
r2907 r2908 108 108 #define GIM_CLAMP(number,minval,maxval) (number<minval?minval:(number>maxval?maxval:number)) 109 109 110 #define GIM_GREATER(x, y) btFabs(x) > (y)110 #define GIM_GREATER(x, y) fabsf(x) > (y) 111 111 112 112 ///Swap numbers -
code/branches/questsystem5/src/bullet/BulletCollision/Gimpact/gim_tri_collision.h
r2907 r2908 276 276 else 277 277 { 278 btScalarsumuv;278 float sumuv; 279 279 sumuv = u+v; 280 280 if(sumuv<-G_EPSILON) -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
r2907 r2908 136 136 //btScalar clippedDist = dist; 137 137 138 //don't report time of impact for motion away from the contact normal (or causes minor penetration)139 if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=SIMD_EPSILON)140 return false;141 138 142 139 dLambda = dist / (projectedLinearVelocity+ maxAngularProjectedVelocity); … … 200 197 201 198 } 202 199 200 //don't report time of impact for motion away from the contact normal (or causes minor penetration) 203 201 if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=result.m_allowedPenetration)//SIMD_EPSILON) 204 202 return false; 205 203 206 204 result.m_fraction = lambda; 207 205 result.m_normal = n; -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
r2907 r2908 151 151 if ((delta > btScalar(0.0)) && (delta * delta > squaredDistance * input.m_maximumDistanceSquared)) 152 152 { 153 checkSimplex=true; 154 //checkPenetration = false; 153 checkPenetration = false; 155 154 break; 156 155 } -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
r2907 r2908 113 113 } 114 114 115 ///this returns the most recent applied impulse, to satisfy contact constraints by the constraint solver116 btScalar getAppliedImpulse() const117 {118 return m_appliedImpulse;119 }120 121 115 122 116 -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
r2907 r2908 184 184 185 185 } 186 if (insertIndex<0)187 insertIndex=0;188 189 186 btAssert(m_pointCache[insertIndex].m_userPersistentData==0); 190 187 m_pointCache[insertIndex] = newPoint; -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
r2907 r2908 56 56 57 57 btScalar m_contactBreakingThreshold; 58 btScalar m_contactProcessingThreshold;59 58 60 59 … … 72 71 btPersistentManifold(); 73 72 74 btPersistentManifold(void* body0,void* body1,int , btScalar contactBreakingThreshold ,btScalar contactProcessingThreshold)73 btPersistentManifold(void* body0,void* body1,int , btScalar contactBreakingThreshold) 75 74 : m_body0(body0),m_body1(body1),m_cachedPoints(0), 76 m_contactBreakingThreshold(contactBreakingThreshold), 77 m_contactProcessingThreshold(contactProcessingThreshold) 75 m_contactBreakingThreshold(contactBreakingThreshold) 78 76 { 79 77 … … 114 112 ///@todo: get this margin from the current physics / collision environment 115 113 btScalar getContactBreakingThreshold() const; 116 117 btScalar getContactProcessingThreshold() const118 {119 return m_contactProcessingThreshold;120 }121 114 122 115 int getCacheEntry(const btManifoldPoint& newPoint) const; -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
r2907 r2908 24 24 #include "btRaycastCallback.h" 25 25 26 btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3& from,const btVector3& to , unsigned int flags)26 btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3& from,const btVector3& to) 27 27 : 28 28 m_from(from), 29 29 m_to(to), 30 //@BP Mod31 m_flags(flags),32 30 m_hitFraction(btScalar(1.)) 33 31 { … … 58 56 return ; // same sign 59 57 } 60 //@BP Mod - Backface filtering61 if (((m_flags & kF_FilterBackfaces) != 0) && (dist_a > btScalar(0.0)))62 {63 // Backface, skip check64 return;65 }66 58 67 59 const btScalar proj_length=dist_a-dist_b; … … 98 90 if ( (btScalar)(cp2.dot(triangleNormal)) >=edge_tolerance) 99 91 { 100 //@BP Mod101 // Triangle normal isn't normalized102 triangleNormal.normalize();103 92 104 //@BP Mod - Allow for unflipped normal when raycasting against backfaces 105 if (((m_flags & kF_KeepUnflippedNormal) != 0) || (dist_a <= btScalar(0.0))) 93 if ( dist_a > 0 ) 106 94 { 107 m_hitFraction = reportHit( -triangleNormal,distance,partId,triangleIndex);95 m_hitFraction = reportHit(triangleNormal,distance,partId,triangleIndex); 108 96 } 109 97 else 110 98 { 111 m_hitFraction = reportHit(triangleNormal,distance,partId,triangleIndex);99 m_hitFraction = reportHit(-triangleNormal,distance,partId,triangleIndex); 112 100 } 113 101 } -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
r2907 r2908 30 30 btVector3 m_to; 31 31 32 //@BP Mod - allow backface filtering and unflipped normals33 enum EFlags34 {35 kF_None = 0,36 kF_FilterBackfaces = 1 << 0,37 kF_KeepUnflippedNormal = 1 << 1, // Prevents returned face normal getting flipped when a ray hits a back-facing triangle38 39 kF_Terminator = 0xFFFFFFFF40 };41 unsigned int m_flags;42 43 32 btScalar m_hitFraction; 44 33 45 btTriangleRaycastCallback(const btVector3& from,const btVector3& to , unsigned int flags=0);34 btTriangleRaycastCallback(const btVector3& from,const btVector3& to); 46 35 47 36 virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex); -
code/branches/questsystem5/src/bullet/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
r2907 r2908 26 26 27 27 #include "btVoronoiSimplexSolver.h" 28 #include <assert.h> 29 //#include <stdio.h> 28 30 29 31 #define VERTA 0 … … 36 38 { 37 39 38 btAssert(m_numVertices>0);40 assert(m_numVertices>0); 39 41 m_numVertices--; 40 42 m_simplexVectorW[index] = m_simplexVectorW[m_numVertices];
Note: See TracChangeset
for help on using the changeset viewer.