// sorting a max edge downwards can only ever *remove* overlaps void AxisSweep3::SortMaxDown(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 was a minimum remove any overlap between the two handles if (updateOverlaps) { Handle* handle0 = GetHandle(pEdge->m_handle); Handle* handle1 = GetHandle(pPrev->m_handle); BroadphasePair* pair = FindPair(handle0,handle1); //assert(pair); if (pair) { RemoveOverlappingPair(*pair); } } // update edge reference in other handle pHandlePrev->m_minEdges[axis]++;; } else pHandlePrev->m_maxEdges[axis]++; pHandleEdge->m_maxEdges[axis]--; // swap the edges Edge swap = *pEdge; *pEdge = *pPrev; *pPrev = swap; // decrement pEdge--; pPrev--; } }
// sorting a min edge upwards can only ever *remove* overlaps void AxisSweep3::SortMinUp(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 maximum remove any overlap between the two handles if (updateOverlaps) { Handle* handle0 = GetHandle(pEdge->m_handle); Handle* handle1 = GetHandle(pNext->m_handle); BroadphasePair* pair = FindPair(handle0,handle1); //assert(pair); if (pair) { RemoveOverlappingPair(*pair); } } // update edge reference in other handle pHandleNext->m_maxEdges[axis]--; } else pHandleNext->m_minEdges[axis]--; pHandleEdge->m_minEdges[axis]++; // swap the edges Edge swap = *pEdge; *pEdge = *pNext; *pNext = swap; // increment pEdge++; pNext++; } }
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); } } }