void SimpleBroadphase::RefreshOverlappingPairs() { //first check for new overlapping pairs int i,j; for (i=0;i<m_numProxies;i++) { BroadphaseProxy* proxy0 = m_pProxies[i]; for (j=i+1;j<m_numProxies;j++) { BroadphaseProxy* proxy1 = m_pProxies[j]; SimpleBroadphaseProxy* p0 = GetSimpleProxyFromProxy(proxy0); SimpleBroadphaseProxy* p1 = GetSimpleProxyFromProxy(proxy1); if (AabbOverlap(p0,p1)) { if ( !FindPair(proxy0,proxy1)) { AddOverlappingPair(proxy0,proxy1); } } } } //then remove non-overlapping ones for (i=0;i<GetNumOverlappingPairs();i++) { BroadphasePair& pair = GetOverlappingPair(i); SimpleBroadphaseProxy* proxy0 = GetSimpleProxyFromProxy(pair.m_pProxy0); SimpleBroadphaseProxy* proxy1 = GetSimpleProxyFromProxy(pair.m_pProxy1); if (!AabbOverlap(proxy0,proxy1)) { RemoveOverlappingPair(pair); } } }
// sorting a min edge downwards can only ever *add* overlaps void AxisSweep3::SortMinDown(int axis, unsigned short edge, bool updateOverlaps) { Edge* pEdge = m_pEdges[axis] + edge; Edge* pPrev = pEdge - 1; Handle* pHandleEdge = GetHandle(pEdge->m_handle); while (pEdge->m_pos < pPrev->m_pos) { Handle* pHandlePrev = GetHandle(pPrev->m_handle); if (pPrev->IsMax()) { // if previous edge is a maximum check the bounds and add an overlap if necessary if (updateOverlaps && TestOverlap(axis,pHandleEdge, pHandlePrev)) { AddOverlappingPair(pHandleEdge,pHandlePrev); //AddOverlap(pEdge->m_handle, pPrev->m_handle); } // update edge reference in other handle pHandlePrev->m_maxEdges[axis]++; } else pHandlePrev->m_minEdges[axis]++; pHandleEdge->m_minEdges[axis]--; // swap the edges Edge swap = *pEdge; *pEdge = *pPrev; *pPrev = swap; // decrement pEdge--; pPrev--; } }
// sorting a max edge upwards can only ever *add* overlaps void AxisSweep3::SortMaxUp(int axis, unsigned short edge, bool updateOverlaps) { Edge* pEdge = m_pEdges[axis] + edge; Edge* pNext = pEdge + 1; Handle* pHandleEdge = GetHandle(pEdge->m_handle); while (pEdge->m_pos > pNext->m_pos) { Handle* pHandleNext = GetHandle(pNext->m_handle); if (!pNext->IsMax()) { // if next edge is a minimum check the bounds and add an overlap if necessary if (updateOverlaps && TestOverlap(axis, pHandleEdge, pHandleNext)) { Handle* handle0 = GetHandle(pEdge->m_handle); Handle* handle1 = GetHandle(pNext->m_handle); AddOverlappingPair(handle0,handle1); } // update edge reference in other handle pHandleNext->m_minEdges[axis]--; } else pHandleNext->m_maxEdges[axis]--; pHandleEdge->m_maxEdges[axis]++; // swap the edges Edge swap = *pEdge; *pEdge = *pNext; *pNext = swap; // increment pEdge++; pNext++; } }