Changeset 2430 for code/branches/physics/src/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h
- Timestamp:
- Dec 13, 2008, 11:45:51 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/physics/src/bullet/BulletCollision/BroadphaseCollision/btAxisSweep3.h
r2192 r2430 20 20 #define AXIS_SWEEP_3_H 21 21 22 #include "LinearMath/btPoint3.h"23 22 #include "LinearMath/btVector3.h" 24 23 #include "btOverlappingPairCache.h" … … 26 25 #include "btBroadphaseProxy.h" 27 26 #include "btOverlappingPairCallback.h" 27 #include "btDbvtBroadphase.h" 28 28 29 29 //#define DEBUG_BROADPHASE 1 … … 62 62 BP_FP_INT_TYPE m_minEdges[3], m_maxEdges[3]; // 6 * 2 = 12 63 63 // BP_FP_INT_TYPE m_uniqueId; 64 BP_FP_INT_TYPE m_pad; 65 64 btBroadphaseProxy* m_dbvtProxy;//for faster raycast 66 65 //void* m_pOwner; this is now in btBroadphaseProxy.m_clientObject 67 66 … … 72 71 73 72 protected: 74 bt Point3 m_worldAabbMin; // overall system bounds75 bt Point3 m_worldAabbMax; // overall system bounds73 btVector3 m_worldAabbMin; // overall system bounds 74 btVector3 m_worldAabbMax; // overall system bounds 76 75 77 76 btVector3 m_quantize; // scaling factor for quantization … … 95 94 int m_invalidPair; 96 95 96 ///additional dynamic aabb structure, used to accelerate ray cast queries. 97 ///can be disabled using a optional argument in the constructor 98 btDbvtBroadphase* m_raycastAccelerator; 99 btOverlappingPairCache* m_nullPairCache; 100 101 97 102 // allocation/deallocation 98 103 BP_FP_INT_TYPE allocHandle(); … … 109 114 //void RemoveOverlap(BP_FP_INT_TYPE handleA, BP_FP_INT_TYPE handleB); 110 115 111 void quantize(BP_FP_INT_TYPE* out, const btPoint3& point, int isMax) const;116 112 117 113 118 void sortMinDown(int axis, BP_FP_INT_TYPE edge, btDispatcher* dispatcher, bool updateOverlaps ); … … 118 123 public: 119 124 120 btAxisSweep3Internal(const bt Point3& worldAabbMin,const btPoint3& worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel, BP_FP_INT_TYPE maxHandles = 16384, btOverlappingPairCache* pairCache=0);125 btAxisSweep3Internal(const btVector3& worldAabbMin,const btVector3& worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel, BP_FP_INT_TYPE maxHandles = 16384, btOverlappingPairCache* pairCache=0,bool disableRaycastAccelerator = false); 121 126 122 127 virtual ~btAxisSweep3Internal(); … … 129 134 virtual void calculateOverlappingPairs(btDispatcher* dispatcher); 130 135 131 BP_FP_INT_TYPE addHandle(const bt Point3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask,btDispatcher* dispatcher,void* multiSapProxy);136 BP_FP_INT_TYPE addHandle(const btVector3& aabbMin,const btVector3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask,btDispatcher* dispatcher,void* multiSapProxy); 132 137 void removeHandle(BP_FP_INT_TYPE handle,btDispatcher* dispatcher); 133 void updateHandle(BP_FP_INT_TYPE handle, const bt Point3& aabbMin,const btPoint3& aabbMax,btDispatcher* dispatcher);138 void updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher); 134 139 SIMD_FORCE_INLINE Handle* getHandle(BP_FP_INT_TYPE index) const {return m_pHandles + index;} 140 141 void resetPool(); 135 142 136 143 void processAllOverlappingPairs(btOverlapCallback* callback); … … 140 147 virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher); 141 148 virtual void setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher); 149 virtual void getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const; 150 151 virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0), const btVector3& aabbMax = btVector3(0,0,0)); 152 153 void quantize(BP_FP_INT_TYPE* out, const btVector3& point, int isMax) const; 154 ///unQuantize should be conservative: aabbMin/aabbMax should be larger then 'getAabb' result 155 void unQuantize(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const; 142 156 143 157 bool testAabbOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1); … … 218 232 219 233 Handle* handle = getHandle(handleId); 220 234 235 if (m_raycastAccelerator) 236 { 237 btBroadphaseProxy* rayProxy = m_raycastAccelerator->createProxy(aabbMin,aabbMax,shapeType,userPtr,collisionFilterGroup,collisionFilterMask,dispatcher,0); 238 handle->m_dbvtProxy = rayProxy; 239 } 221 240 return handle; 222 241 } … … 228 247 { 229 248 Handle* handle = static_cast<Handle*>(proxy); 249 if (m_raycastAccelerator) 250 m_raycastAccelerator->destroyProxy(handle->m_dbvtProxy,dispatcher); 230 251 removeHandle(static_cast<BP_FP_INT_TYPE>(handle->m_uniqueId), dispatcher); 231 252 } … … 235 256 { 236 257 Handle* handle = static_cast<Handle*>(proxy); 258 handle->m_aabbMin = aabbMin; 259 handle->m_aabbMax = aabbMax; 237 260 updateHandle(static_cast<BP_FP_INT_TYPE>(handle->m_uniqueId), aabbMin, aabbMax,dispatcher); 238 239 } 240 241 242 243 244 245 template <typename BP_FP_INT_TYPE> 246 btAxisSweep3Internal<BP_FP_INT_TYPE>::btAxisSweep3Internal(const btPoint3& worldAabbMin,const btPoint3& worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel,BP_FP_INT_TYPE userMaxHandles, btOverlappingPairCache* pairCache ) 261 if (m_raycastAccelerator) 262 m_raycastAccelerator->setAabb(handle->m_dbvtProxy,aabbMin,aabbMax,dispatcher); 263 264 } 265 266 template <typename BP_FP_INT_TYPE> 267 void btAxisSweep3Internal<BP_FP_INT_TYPE>::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback,const btVector3& aabbMin,const btVector3& aabbMax) 268 { 269 if (m_raycastAccelerator) 270 { 271 m_raycastAccelerator->rayTest(rayFrom,rayTo,rayCallback,aabbMin,aabbMax); 272 } else 273 { 274 //choose axis? 275 BP_FP_INT_TYPE axis = 0; 276 //for each proxy 277 for (BP_FP_INT_TYPE i=1;i<m_numHandles*2+1;i++) 278 { 279 if (m_pEdges[axis][i].IsMax()) 280 { 281 rayCallback.process(getHandle(m_pEdges[axis][i].m_handle)); 282 } 283 } 284 } 285 } 286 287 288 289 template <typename BP_FP_INT_TYPE> 290 void btAxisSweep3Internal<BP_FP_INT_TYPE>::getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const 291 { 292 Handle* pHandle = static_cast<Handle*>(proxy); 293 aabbMin = pHandle->m_aabbMin; 294 aabbMax = pHandle->m_aabbMax; 295 } 296 297 298 template <typename BP_FP_INT_TYPE> 299 void btAxisSweep3Internal<BP_FP_INT_TYPE>::unQuantize(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const 300 { 301 Handle* pHandle = static_cast<Handle*>(proxy); 302 303 unsigned short vecInMin[3]; 304 unsigned short vecInMax[3]; 305 306 vecInMin[0] = m_pEdges[0][pHandle->m_minEdges[0]].m_pos ; 307 vecInMax[0] = m_pEdges[0][pHandle->m_maxEdges[0]].m_pos +1 ; 308 vecInMin[1] = m_pEdges[1][pHandle->m_minEdges[1]].m_pos ; 309 vecInMax[1] = m_pEdges[1][pHandle->m_maxEdges[1]].m_pos +1 ; 310 vecInMin[2] = m_pEdges[2][pHandle->m_minEdges[2]].m_pos ; 311 vecInMax[2] = m_pEdges[2][pHandle->m_maxEdges[2]].m_pos +1 ; 312 313 aabbMin.setValue((btScalar)(vecInMin[0]) / (m_quantize.getX()),(btScalar)(vecInMin[1]) / (m_quantize.getY()),(btScalar)(vecInMin[2]) / (m_quantize.getZ())); 314 aabbMin += m_worldAabbMin; 315 316 aabbMax.setValue((btScalar)(vecInMax[0]) / (m_quantize.getX()),(btScalar)(vecInMax[1]) / (m_quantize.getY()),(btScalar)(vecInMax[2]) / (m_quantize.getZ())); 317 aabbMax += m_worldAabbMin; 318 } 319 320 321 322 323 template <typename BP_FP_INT_TYPE> 324 btAxisSweep3Internal<BP_FP_INT_TYPE>::btAxisSweep3Internal(const btVector3& worldAabbMin,const btVector3& worldAabbMax, BP_FP_INT_TYPE handleMask, BP_FP_INT_TYPE handleSentinel,BP_FP_INT_TYPE userMaxHandles, btOverlappingPairCache* pairCache , bool disableRaycastAccelerator) 247 325 :m_bpHandleMask(handleMask), 248 326 m_handleSentinel(handleSentinel), … … 250 328 m_userPairCallback(0), 251 329 m_ownsPairCache(false), 252 m_invalidPair(0) 330 m_invalidPair(0), 331 m_raycastAccelerator(0) 253 332 { 254 333 BP_FP_INT_TYPE maxHandles = static_cast<BP_FP_INT_TYPE>(userMaxHandles+1);//need to add one sentinel handle … … 259 338 m_pairCache = new(ptr) btHashedOverlappingPairCache(); 260 339 m_ownsPairCache = true; 340 } 341 342 if (!disableRaycastAccelerator) 343 { 344 m_nullPairCache = new (btAlignedAlloc(sizeof(btNullPairCache),16)) btNullPairCache(); 345 m_raycastAccelerator = new (btAlignedAlloc(sizeof(btDbvtBroadphase),16)) btDbvtBroadphase(m_nullPairCache);//m_pairCache); 346 m_raycastAccelerator->m_deferedcollide = true;//don't add/remove pairs 261 347 } 262 348 … … 321 407 btAxisSweep3Internal<BP_FP_INT_TYPE>::~btAxisSweep3Internal() 322 408 { 323 409 if (m_raycastAccelerator) 410 { 411 m_nullPairCache->~btOverlappingPairCache(); 412 btAlignedFree(m_nullPairCache); 413 m_raycastAccelerator->~btDbvtBroadphase(); 414 btAlignedFree (m_raycastAccelerator); 415 } 416 324 417 for (int i = 2; i >= 0; i--) 325 418 { … … 336 429 337 430 template <typename BP_FP_INT_TYPE> 338 void btAxisSweep3Internal<BP_FP_INT_TYPE>::quantize(BP_FP_INT_TYPE* out, const bt Point3& point, int isMax) const431 void btAxisSweep3Internal<BP_FP_INT_TYPE>::quantize(BP_FP_INT_TYPE* out, const btVector3& point, int isMax) const 339 432 { 340 433 #ifdef OLD_CLAMPING_METHOD 341 434 ///problem with this clamping method is that the floating point during quantization might still go outside the range [(0|isMax) .. (m_handleSentinel&m_bpHandleMask]|isMax] 342 435 ///see http://code.google.com/p/bullet/issues/detail?id=87 343 bt Point3 clampedPoint(point);436 btVector3 clampedPoint(point); 344 437 clampedPoint.setMax(m_worldAabbMin); 345 438 clampedPoint.setMin(m_worldAabbMax); … … 382 475 383 476 template <typename BP_FP_INT_TYPE> 384 BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::addHandle(const bt Point3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask,btDispatcher* dispatcher,void* multiSapProxy)477 BP_FP_INT_TYPE btAxisSweep3Internal<BP_FP_INT_TYPE>::addHandle(const btVector3& aabbMin,const btVector3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask,btDispatcher* dispatcher,void* multiSapProxy) 385 478 { 386 479 // quantize the bounds … … 445 538 //explicitly remove the pairs containing the proxy 446 539 //we could do it also in the sortMinUp (passing true) 447 // todo: compare performance540 ///@todo: compare performance 448 541 if (!m_pairCache->hasDeferredRemoval()) 449 542 { … … 493 586 494 587 } 588 589 template <typename BP_FP_INT_TYPE> 590 void btAxisSweep3Internal<BP_FP_INT_TYPE>::resetPool() 591 { 592 if (m_numHandles == 0) 593 { 594 m_firstFreeHandle = 1; 595 { 596 for (BP_FP_INT_TYPE i = m_firstFreeHandle; i < m_maxHandles; i++) 597 m_pHandles[i].SetNextFree(static_cast<BP_FP_INT_TYPE>(i + 1)); 598 m_pHandles[m_maxHandles - 1].SetNextFree(0); 599 } 600 } 601 } 602 495 603 496 604 extern int gOverlappingPairs; … … 621 729 622 730 template <typename BP_FP_INT_TYPE> 623 void btAxisSweep3Internal<BP_FP_INT_TYPE>::updateHandle(BP_FP_INT_TYPE handle, const bt Point3& aabbMin,const btPoint3& aabbMax,btDispatcher* dispatcher)731 void btAxisSweep3Internal<BP_FP_INT_TYPE>::updateHandle(BP_FP_INT_TYPE handle, const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher) 624 732 { 625 733 // assert(bounds.IsFinite()); … … 900 1008 public: 901 1009 902 btAxisSweep3(const bt Point3& worldAabbMin,const btPoint3& worldAabbMax, unsigned short int maxHandles = 16384, btOverlappingPairCache* pairCache = 0);1010 btAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned short int maxHandles = 16384, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false); 903 1011 904 1012 }; … … 911 1019 public: 912 1020 913 bt32BitAxisSweep3(const bt Point3& worldAabbMin,const btPoint3& worldAabbMax, unsigned int maxHandles = 1500000, btOverlappingPairCache* pairCache = 0);1021 bt32BitAxisSweep3(const btVector3& worldAabbMin,const btVector3& worldAabbMax, unsigned int maxHandles = 1500000, btOverlappingPairCache* pairCache = 0, bool disableRaycastAccelerator = false); 914 1022 915 1023 };
Note: See TracChangeset
for help on using the changeset viewer.