19 #ifndef BT_AXIS_SWEEP_3_INTERNAL_H
20 #define BT_AXIS_SWEEP_3_INTERNAL_H
30 #define USE_OVERLAP_TEST_ON_REMOVES 1
35 template <
typename BP_FP_INT_TYPE>
53 BP_FP_INT_TYPE
IsMax()
const {
return static_cast<BP_FP_INT_TYPE
>(
m_pos & 1);}
108 bool testOverlap2D(
const Handle* pHandleA,
const Handle* pHandleB,
int axis0,
int axis1);
110 #ifdef DEBUG_BROADPHASE
111 void debugPrintAxis(
int axis,
bool checkCardinality=
true);
112 #endif //DEBUG_BROADPHASE
205 #ifdef DEBUG_BROADPHASE
208 template <
typename BP_FP_INT_TYPE>
211 int numEdges = m_pHandles[0].m_maxEdges[axis];
212 printf(
"SAP Axis %d, numEdges=%d\n",axis,numEdges);
215 for (i=0;i<numEdges+1;i++)
217 Edge* pEdge = m_pEdges[axis] + i;
218 Handle* pHandlePrev = getHandle(pEdge->m_handle);
219 int handleIndex = pEdge->IsMax()? pHandlePrev->m_maxEdges[axis] : pHandlePrev->m_minEdges[axis];
221 beginOrEnd=pEdge->IsMax()?
'E':
'B';
222 printf(
" [%c,h=%d,p=%x,i=%d]\n",beginOrEnd,pEdge->m_handle,pEdge->m_pos,handleIndex);
225 if (checkCardinality)
226 btAssert(numEdges == m_numHandles*2+1);
228 #endif //DEBUG_BROADPHASE
230 template <
typename BP_FP_INT_TYPE>
234 BP_FP_INT_TYPE handleId = addHandle(aabbMin,aabbMax, userPtr,collisionFilterGroup,collisionFilterMask,dispatcher);
236 Handle* handle = getHandle(handleId);
238 if (m_raycastAccelerator)
240 btBroadphaseProxy* rayProxy = m_raycastAccelerator->
createProxy(aabbMin,aabbMax,shapeType,userPtr,collisionFilterGroup,collisionFilterMask,dispatcher);
241 handle->m_dbvtProxy = rayProxy;
248 template <
typename BP_FP_INT_TYPE>
251 Handle* handle =
static_cast<Handle*
>(proxy);
252 if (m_raycastAccelerator)
253 m_raycastAccelerator->
destroyProxy(handle->m_dbvtProxy,dispatcher);
254 removeHandle(
static_cast<BP_FP_INT_TYPE
>(handle->m_uniqueId), dispatcher);
257 template <
typename BP_FP_INT_TYPE>
260 Handle* handle =
static_cast<Handle*
>(proxy);
261 handle->m_aabbMin = aabbMin;
262 handle->m_aabbMax = aabbMax;
263 updateHandle(
static_cast<BP_FP_INT_TYPE
>(handle->m_uniqueId), aabbMin, aabbMax,dispatcher);
264 if (m_raycastAccelerator)
265 m_raycastAccelerator->
setAabb(handle->m_dbvtProxy,aabbMin,aabbMax,dispatcher);
269 template <
typename BP_FP_INT_TYPE>
272 if (m_raycastAccelerator)
274 m_raycastAccelerator->
rayTest(rayFrom,rayTo,rayCallback,aabbMin,aabbMax);
278 BP_FP_INT_TYPE axis = 0;
280 for (BP_FP_INT_TYPE i=1;i<m_numHandles*2+1;i++)
282 if (m_pEdges[axis][i].IsMax())
284 rayCallback.
process(getHandle(m_pEdges[axis][i].m_handle));
290 template <
typename BP_FP_INT_TYPE>
293 if (m_raycastAccelerator)
295 m_raycastAccelerator->
aabbTest(aabbMin,aabbMax,callback);
299 BP_FP_INT_TYPE axis = 0;
301 for (BP_FP_INT_TYPE i=1;i<m_numHandles*2+1;i++)
303 if (m_pEdges[axis][i].IsMax())
305 Handle* handle = getHandle(m_pEdges[axis][i].m_handle);
317 template <
typename BP_FP_INT_TYPE>
320 Handle* pHandle =
static_cast<Handle*
>(proxy);
321 aabbMin = pHandle->m_aabbMin;
322 aabbMax = pHandle->m_aabbMax;
326 template <
typename BP_FP_INT_TYPE>
329 Handle* pHandle =
static_cast<Handle*
>(proxy);
331 unsigned short vecInMin[3];
332 unsigned short vecInMax[3];
334 vecInMin[0] = m_pEdges[0][pHandle->m_minEdges[0]].m_pos ;
335 vecInMax[0] = m_pEdges[0][pHandle->m_maxEdges[0]].m_pos +1 ;
336 vecInMin[1] = m_pEdges[1][pHandle->m_minEdges[1]].m_pos ;
337 vecInMax[1] = m_pEdges[1][pHandle->m_maxEdges[1]].m_pos +1 ;
338 vecInMin[2] = m_pEdges[2][pHandle->m_minEdges[2]].m_pos ;
339 vecInMax[2] = m_pEdges[2][pHandle->m_maxEdges[2]].m_pos +1 ;
342 aabbMin += m_worldAabbMin;
345 aabbMax += m_worldAabbMin;
351 template <
typename BP_FP_INT_TYPE>
353 :m_bpHandleMask(handleMask),
354 m_handleSentinel(handleSentinel),
355 m_pairCache(pairCache),
356 m_userPairCallback(0),
357 m_ownsPairCache(false),
359 m_raycastAccelerator(0)
361 BP_FP_INT_TYPE maxHandles =
static_cast<BP_FP_INT_TYPE
>(userMaxHandles+1);
370 if (!disableRaycastAccelerator)
399 m_pHandles[i].SetNextFree(
static_cast<BP_FP_INT_TYPE
>(i + 1));
405 for (
int i = 0; i < 3; i++)
417 for (
int axis = 0; axis < 3; axis++)
426 #ifdef DEBUG_BROADPHASE
427 debugPrintAxis(axis);
428 #endif //DEBUG_BROADPHASE
434 template <
typename BP_FP_INT_TYPE>
437 if (m_raycastAccelerator)
445 for (
int i = 2; i >= 0; i--)
449 delete [] m_pHandles;
458 template <
typename BP_FP_INT_TYPE>
461 #ifdef OLD_CLAMPING_METHOD
465 clampedPoint.
setMax(m_worldAabbMin);
466 clampedPoint.
setMin(m_worldAabbMax);
467 btVector3 v = (clampedPoint - m_worldAabbMin) * m_quantize;
468 out[0] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.
getX() & m_bpHandleMask) | isMax);
469 out[1] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.
getY() & m_bpHandleMask) | isMax);
470 out[2] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.
getZ() & m_bpHandleMask) | isMax);
472 btVector3 v = (point - m_worldAabbMin) * m_quantize;
473 out[0]=(v[0]<=0)?(BP_FP_INT_TYPE)isMax:(v[0]>=m_handleSentinel)?(BP_FP_INT_TYPE)((m_handleSentinel&m_bpHandleMask)|isMax):(BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v[0]&m_bpHandleMask)|isMax);
474 out[1]=(v[1]<=0)?(BP_FP_INT_TYPE)isMax:(v[1]>=m_handleSentinel)?(BP_FP_INT_TYPE)((m_handleSentinel&m_bpHandleMask)|isMax):(BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v[1]&m_bpHandleMask)|isMax);
475 out[2]=(v[2]<=0)?(BP_FP_INT_TYPE)isMax:(v[2]>=m_handleSentinel)?(BP_FP_INT_TYPE)((m_handleSentinel&m_bpHandleMask)|isMax):(BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v[2]&m_bpHandleMask)|isMax);
476 #endif //OLD_CLAMPING_METHOD
480 template <
typename BP_FP_INT_TYPE>
485 BP_FP_INT_TYPE handle = m_firstFreeHandle;
486 m_firstFreeHandle = getHandle(handle)->GetNextFree();
492 template <
typename BP_FP_INT_TYPE>
495 btAssert(handle > 0 && handle < m_maxHandles);
497 getHandle(handle)->SetNextFree(m_firstFreeHandle);
498 m_firstFreeHandle = handle;
504 template <
typename BP_FP_INT_TYPE>
508 BP_FP_INT_TYPE min[3], max[3];
509 quantize(min, aabbMin, 0);
510 quantize(max, aabbMax, 1);
513 BP_FP_INT_TYPE handle = allocHandle();
516 Handle* pHandle = getHandle(handle);
518 pHandle->m_uniqueId =
static_cast<int>(handle);
520 pHandle->m_clientObject = pOwner;
521 pHandle->m_collisionFilterGroup = collisionFilterGroup;
522 pHandle->m_collisionFilterMask = collisionFilterMask;
525 BP_FP_INT_TYPE limit =
static_cast<BP_FP_INT_TYPE
>(m_numHandles * 2);
529 for (BP_FP_INT_TYPE axis = 0; axis < 3; axis++)
532 m_pHandles[0].m_maxEdges[axis] += 2;
534 m_pEdges[axis][limit + 1] = m_pEdges[axis][limit - 1];
536 m_pEdges[axis][limit - 1].m_pos = min[axis];
537 m_pEdges[axis][limit - 1].m_handle = handle;
539 m_pEdges[axis][limit].m_pos = max[axis];
540 m_pEdges[axis][limit].m_handle = handle;
542 pHandle->m_minEdges[axis] =
static_cast<BP_FP_INT_TYPE
>(limit - 1);
543 pHandle->m_maxEdges[axis] = limit;
547 sortMinDown(0, pHandle->m_minEdges[0], dispatcher,
false);
548 sortMaxDown(0, pHandle->m_maxEdges[0], dispatcher,
false);
549 sortMinDown(1, pHandle->m_minEdges[1], dispatcher,
false);
550 sortMaxDown(1, pHandle->m_maxEdges[1], dispatcher,
false);
551 sortMinDown(2, pHandle->m_minEdges[2], dispatcher,
true);
552 sortMaxDown(2, pHandle->m_maxEdges[2], dispatcher,
true);
559 template <
typename BP_FP_INT_TYPE>
563 Handle* pHandle = getHandle(handle);
574 int limit =
static_cast<int>(m_numHandles * 2);
578 for (axis = 0;axis<3;axis++)
580 m_pHandles[0].m_maxEdges[axis] -= 2;
584 for ( axis = 0; axis < 3; axis++)
586 Edge* pEdges = m_pEdges[axis];
587 BP_FP_INT_TYPE max = pHandle->m_maxEdges[axis];
588 pEdges[max].m_pos = m_handleSentinel;
590 sortMaxUp(axis,max,dispatcher,
false);
593 BP_FP_INT_TYPE i = pHandle->m_minEdges[axis];
594 pEdges[i].m_pos = m_handleSentinel;
597 sortMinUp(axis,i,dispatcher,
false);
599 pEdges[limit-1].m_handle = 0;
600 pEdges[limit-1].m_pos = m_handleSentinel;
602 #ifdef DEBUG_BROADPHASE
603 debugPrintAxis(axis,
false);
604 #endif //DEBUG_BROADPHASE
616 template <
typename BP_FP_INT_TYPE>
619 if (m_numHandles == 0)
621 m_firstFreeHandle = 1;
623 for (BP_FP_INT_TYPE i = m_firstFreeHandle; i < m_maxHandles; i++)
624 m_pHandles[i].SetNextFree(
static_cast<BP_FP_INT_TYPE
>(i + 1));
625 m_pHandles[m_maxHandles - 1].SetNextFree(0);
634 template <
typename BP_FP_INT_TYPE>
646 overlappingPairArray.
resize(overlappingPairArray.
size() - m_invalidPair);
658 for (i=0;i<overlappingPairArray.
size();i++)
663 bool isDuplicate = (pair == previousPair);
667 bool needsRemoval =
false;
676 needsRemoval =
false;
704 #define CLEAN_INVALID_PAIRS 1
705 #ifdef CLEAN_INVALID_PAIRS
710 overlappingPairArray.
resize(overlappingPairArray.
size() - m_invalidPair);
712 #endif//CLEAN_INVALID_PAIRS
720 template <
typename BP_FP_INT_TYPE>
723 const Handle* pHandleA =
static_cast<Handle*
>(proxy0);
724 const Handle* pHandleB =
static_cast<Handle*
>(proxy1);
728 for (
int axis = 0; axis < 3; axis++)
730 if (pHandleA->m_maxEdges[axis] < pHandleB->m_minEdges[axis] ||
731 pHandleB->m_maxEdges[axis] < pHandleA->m_minEdges[axis])
739 template <
typename BP_FP_INT_TYPE>
744 if (pHandleA->m_maxEdges[axis0] < pHandleB->m_minEdges[axis0] ||
745 pHandleB->m_maxEdges[axis0] < pHandleA->m_minEdges[axis0] ||
746 pHandleA->m_maxEdges[axis1] < pHandleB->m_minEdges[axis1] ||
747 pHandleB->m_maxEdges[axis1] < pHandleA->m_minEdges[axis1])
754 template <
typename BP_FP_INT_TYPE>
760 Handle* pHandle = getHandle(handle);
763 BP_FP_INT_TYPE min[3], max[3];
764 quantize(min, aabbMin, 0);
765 quantize(max, aabbMax, 1);
768 for (
int axis = 0; axis < 3; axis++)
770 BP_FP_INT_TYPE emin = pHandle->m_minEdges[axis];
771 BP_FP_INT_TYPE emax = pHandle->m_maxEdges[axis];
773 int dmin = (int)min[axis] - (
int)m_pEdges[axis][emin].m_pos;
774 int dmax = (int)max[axis] - (
int)m_pEdges[axis][emax].m_pos;
776 m_pEdges[axis][emin].m_pos = min[axis];
777 m_pEdges[axis][emax].m_pos = max[axis];
781 sortMinDown(axis, emin,dispatcher,
true);
784 sortMaxUp(axis, emax,dispatcher,
true);
788 sortMinUp(axis, emin,dispatcher,
true);
791 sortMaxDown(axis, emax,dispatcher,
true);
793 #ifdef DEBUG_BROADPHASE
794 debugPrintAxis(axis);
795 #endif //DEBUG_BROADPHASE
805 template <
typename BP_FP_INT_TYPE>
809 Edge* pEdge = m_pEdges[axis] + edge;
810 Edge* pPrev = pEdge - 1;
811 Handle* pHandleEdge = getHandle(pEdge->m_handle);
813 while (pEdge->m_pos < pPrev->m_pos)
815 Handle* pHandlePrev = getHandle(pPrev->m_handle);
820 const int axis1 = (1 << axis) & 3;
821 const int axis2 = (1 << axis1) & 3;
822 if (updateOverlaps && testOverlap2D(pHandleEdge, pHandlePrev,axis1,axis2))
825 if (m_userPairCallback)
833 pHandlePrev->m_maxEdges[axis]++;
836 pHandlePrev->m_minEdges[axis]++;
838 pHandleEdge->m_minEdges[axis]--;
850 #ifdef DEBUG_BROADPHASE
851 debugPrintAxis(axis);
852 #endif //DEBUG_BROADPHASE
857 template <
typename BP_FP_INT_TYPE>
860 Edge* pEdge = m_pEdges[axis] + edge;
861 Edge* pNext = pEdge + 1;
862 Handle* pHandleEdge = getHandle(pEdge->m_handle);
864 while (pNext->m_handle && (pEdge->m_pos >= pNext->m_pos))
866 Handle* pHandleNext = getHandle(pNext->m_handle);
870 Handle* handle0 = getHandle(pEdge->m_handle);
871 Handle* handle1 = getHandle(pNext->m_handle);
872 const int axis1 = (1 << axis) & 3;
873 const int axis2 = (1 << axis1) & 3;
878 && testOverlap2D(handle0,handle1,axis1,axis2)
879 #endif //USE_OVERLAP_TEST_ON_REMOVES
885 if (m_userPairCallback)
892 pHandleNext->m_maxEdges[axis]--;
895 pHandleNext->m_minEdges[axis]--;
897 pHandleEdge->m_minEdges[axis]++;
913 template <
typename BP_FP_INT_TYPE>
917 Edge* pEdge = m_pEdges[axis] + edge;
918 Edge* pPrev = pEdge - 1;
919 Handle* pHandleEdge = getHandle(pEdge->m_handle);
921 while (pEdge->m_pos < pPrev->m_pos)
923 Handle* pHandlePrev = getHandle(pPrev->m_handle);
928 Handle* handle0 = getHandle(pEdge->m_handle);
929 Handle* handle1 = getHandle(pPrev->m_handle);
930 const int axis1 = (1 << axis) & 3;
931 const int axis2 = (1 << axis1) & 3;
935 && testOverlap2D(handle0,handle1,axis1,axis2)
936 #endif //USE_OVERLAP_TEST_ON_REMOVES
943 if (m_userPairCallback)
951 pHandlePrev->m_minEdges[axis]++;;
954 pHandlePrev->m_maxEdges[axis]++;
956 pHandleEdge->m_maxEdges[axis]--;
969 #ifdef DEBUG_BROADPHASE
970 debugPrintAxis(axis);
971 #endif //DEBUG_BROADPHASE
976 template <
typename BP_FP_INT_TYPE>
979 Edge* pEdge = m_pEdges[axis] + edge;
980 Edge* pNext = pEdge + 1;
981 Handle* pHandleEdge = getHandle(pEdge->m_handle);
983 while (pNext->m_handle && (pEdge->m_pos >= pNext->m_pos))
985 Handle* pHandleNext = getHandle(pNext->m_handle);
987 const int axis1 = (1 << axis) & 3;
988 const int axis2 = (1 << axis1) & 3;
993 if (updateOverlaps && testOverlap2D(pHandleEdge, pHandleNext,axis1,axis2))
995 Handle* handle0 = getHandle(pEdge->m_handle);
996 Handle* handle1 = getHandle(pNext->m_handle);
998 if (m_userPairCallback)
1003 pHandleNext->m_minEdges[axis]--;
1006 pHandleNext->m_maxEdges[axis]--;
1008 pHandleEdge->m_maxEdges[axis]++;