/**
	 * Sorts the maximum end point for specified axis and adds overlapping pair if necessary.
	 */
	void SweepAndPrune::sortMaxUp(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())
			{
				const int axis1 = (1  << axis) & 3;
				const int axis2 = (1  << axis1) & 3;
				if(testOverlap && isOverlap(endPoint->getBodyBox(), nextEndPoint->getBodyBox(), axis1, axis2))
				{
					createOverlappingPair(endPoint->getBodyBox(), nextEndPoint->getBodyBox());
				}
				nextEndPoint->getBodyBox()->min[axis]--;
			}else
			{
				nextEndPoint->getBodyBox()->max[axis]--;
			}
			endPoint->getBodyBox()->max[axis]++;

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

			//increment
			endPoint++;
			nextEndPoint++;
		}
	}
	/**
	 * Sorts the minimum end point for specified axis and adds overlapping pair if necessary.
	 */
	void SweepAndPrune::sortMinDown(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())
			{
				prevEndPoint->getBodyBox()->min[axis]++;
			}else
			{
				const int axis1 = (1  << axis) & 3;
				const int axis2 = (1  << axis1) & 3;
				if(testOverlap && isOverlap(endPoint->getBodyBox(), prevEndPoint->getBodyBox(), axis1, axis2))
				{
					createOverlappingPair(endPoint->getBodyBox(), prevEndPoint->getBodyBox());
				}
				prevEndPoint->getBodyBox()->max[axis]++;
			}
			endPoint->getBodyBox()->min[axis]--;

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

			//decrement
			endPoint--;
			prevEndPoint--;
		}
	}
Example #3
0
	void AABBTree::computeOverlappingPairsFor(AABBNode *leafNode, AABBNode *rootNode)
	{
		std::stack<AABBNode *> stackNodes;
		stackNodes.push(rootNode);

		while(!stackNodes.empty())
		{ //tree traversal: pre-order (iterative)
			AABBNode *currentNode = stackNodes.top();
			stackNodes.pop();

			if(leafNode!=currentNode && leafNode->getAABBox().collideWithAABBox(currentNode->getAABBox()))
			{
				if (currentNode->isLeaf())
				{
					createOverlappingPair(leafNode->getBodyNodeData(), currentNode->getBodyNodeData());
				}else
				{
					stackNodes.push(currentNode->getRightChild());
					stackNodes.push(currentNode->getLeftChild());
				}
			}
		}
	}