void	btHashedOverlappingPairCache::sortOverlappingPairs(btDispatcher* dispatcher)
{
	///need to keep hashmap in sync with pair address, so rebuild all
	btBroadphasePairArray tmpPairs;
	int i;
	for (i=0;i<m_overlappingPairArray.size();i++)
	{
		tmpPairs.push_back(m_overlappingPairArray[i]);
	}

	for (i=0;i<tmpPairs.size();i++)
	{
		removeOverlappingPair(tmpPairs[i].m_pProxy0,tmpPairs[i].m_pProxy1,dispatcher);
	}
	
	for (i = 0; i < m_next.size(); i++)
	{
		m_next[i] = BT_NULL_PAIR;
	}

	tmpPairs.quickSort(btBroadphasePairSortPredicate());

	for (i=0;i<tmpPairs.size();i++)
	{
		addOverlappingPair(tmpPairs[i].m_pProxy0,tmpPairs[i].m_pProxy1);
	}

	
}
	/**
	 * Sorts the minimum end point for specified axis and removes overlapping pair if necessary.
	 */
	void SweepAndPrune::sortMinUp(unsigned int axis, unsigned int endPointIndex, bool testOverlap)
	{
		BodyEndPoint *endPoint = &sortedEndPoints[axis][endPointIndex];
		BodyEndPoint *nextEndPoint = &sortedEndPoints[axis][endPointIndex+1];

		while(endPoint->getValue() > nextEndPoint->getValue())
		{
			//update indexes in bodies
			if(nextEndPoint->isMin())
			{
				nextEndPoint->getBodyBox()->min[axis]--;
			}else
			{
				const int axis1 = (1  << axis) & 3;
				const int axis2 = (1  << axis1) & 3;
				if(testOverlap && isOverlap(endPoint->getBodyBox(), nextEndPoint->getBodyBox(), axis1, axis2))
				{
					removeOverlappingPair(endPoint->getBodyBox(), nextEndPoint->getBodyBox());
				}
				nextEndPoint->getBodyBox()->max[axis]--;
			}
			endPoint->getBodyBox()->min[axis]++;

			//swap end points
			BodyEndPoint tmp = *endPoint;
			*endPoint = *nextEndPoint;
			*nextEndPoint = tmp;

			//increment
			endPoint++;
			nextEndPoint++;
		}
	}
	/**
	 * Sorts the minimum end point for specified axis and removes overlapping pair if necessary.
	 */
	void SweepAndPrune::sortMaxDown(unsigned int axis, unsigned int endPointIndex, bool testOverlap)
	{
		BodyEndPoint *endPoint = &sortedEndPoints[axis][endPointIndex];
		BodyEndPoint *prevEndPoint = &sortedEndPoints[axis][endPointIndex-1];

		while(endPoint->getValue() < prevEndPoint->getValue())
		{
			//update indexes in bodies
			if(prevEndPoint->isMin())
			{
				const int axis1 = (1  << axis) & 3;
				const int axis2 = (1  << axis1) & 3;
				if(testOverlap && isOverlap(endPoint->getBodyBox(), prevEndPoint->getBodyBox(), axis1, axis2))
				{
					removeOverlappingPair(endPoint->getBodyBox(), prevEndPoint->getBodyBox());
				}
				prevEndPoint->getBodyBox()->min[axis]++;
			}else
			{
				prevEndPoint->getBodyBox()->max[axis]++;
			}
			endPoint->getBodyBox()->max[axis]--;

			//swap end points
			BodyEndPoint tmp = *endPoint;
			*endPoint = *prevEndPoint;
			*prevEndPoint = tmp;

			//decrement
			endPoint--;
			prevEndPoint--;
		}
	}
Example #4
0
void	btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher)
{
	BT_PROFILE("btHashedOverlappingPairCache::processAllOverlappingPairs");
	int i;

//	printf("m_overlappingPairArray.size()=%d\n",m_overlappingPairArray.size());
	for (i=0;i<m_overlappingPairArray.size();)
	{
	
		btBroadphasePair* pair = &m_overlappingPairArray[i];
		if (callback->processOverlap(*pair))
		{
			removeOverlappingPair(pair->m_pProxy0,pair->m_pProxy1,dispatcher);
		} else
		{
			i++;
		}
	}
}
Example #5
0
void    btHashedOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback,btDispatcher* dispatcher, const struct btDispatcherInfo& dispatchInfo)
{
    if (dispatchInfo.m_deterministicOverlappingPairs)
    {
        btBroadphasePairArray& pa = getOverlappingPairArray();
        btAlignedObjectArray<MyPairIndex> indices;
        {
            BT_PROFILE("sortOverlappingPairs");
            indices.resize(pa.size());
            for (int i=0;i<indices.size();i++)
            {
                const btBroadphasePair& p = pa[i];
                const int uidA0 = p.m_pProxy0 ? p.m_pProxy0->m_uniqueId : -1;
                const int uidA1 = p.m_pProxy1 ? p.m_pProxy1->m_uniqueId : -1;
                
                indices[i].m_uidA0 = uidA0;
                indices[i].m_uidA1 = uidA1;
                indices[i].m_orgIndex = i;
            }
            indices.quickSort(MyPairIndeSortPredicate());
        }
        {
            BT_PROFILE("btHashedOverlappingPairCache::processAllOverlappingPairs");
            int i;
            for (i=0;i<indices.size();)
            {
                btBroadphasePair* pair = &pa[indices[i].m_orgIndex];
                if (callback->processOverlap(*pair))
                {
                    removeOverlappingPair(pair->m_pProxy0,pair->m_pProxy1,dispatcher);
                } else
                {
                    i++;
                }
            }
        }
    } else
    {
        processAllOverlappingPairs(callback, dispatcher);
    }
}
void	b3HashedOverlappingPairCache::processAllOverlappingPairs(b3OverlapCallback* callback,b3Dispatcher* dispatcher)
{

	int i;

//	printf("m_overlappingPairArray.size()=%d\n",m_overlappingPairArray.size());
	for (i=0;i<m_overlappingPairArray.size();)
	{
	
		b3BroadphasePair* pair = &m_overlappingPairArray[i];
		if (callback->processOverlap(*pair))
		{
			removeOverlappingPair(pair->x,pair->y,dispatcher);

			b3g_overlappingPairs--;
		} else
		{
			i++;
		}
	}
}