Example #1
0
// Creates two outlines out of one by splitting the original one in half.
// Inserts the resulting outlines into the given list.
void SPLIT::SplitOutlineList(TESSLINE* outlines) const {
  SplitOutline();
  while (outlines->next != NULL) outlines = outlines->next;

  outlines->next = new TESSLINE;
  outlines->next->loop = point1;
  outlines->next->ComputeBoundingBox();

  outlines = outlines->next;

  outlines->next = new TESSLINE;
  outlines->next->loop = point2;
  outlines->next->ComputeBoundingBox();

  outlines->next->next = NULL;
}
PolySide COccludee::SplitPlane(const LTPlane &cPlane, bool bSplitOccluded)
{
	// Split the outlines into visible and occluded portions

	COutline sVisible;
	COutline sOccluded;

	uint32 nOccludedSize = m_aOccluded.size();

	TOutlineList::iterator iCurOutline;
	if (!bSplitOccluded)
	{
		iCurOutline = m_aVisible.begin();
		while (iCurOutline != m_aVisible.end())
		{
			PolySide nResult = SplitOutline(cPlane, *iCurOutline, sVisible, sOccluded);
			switch (nResult)
			{
				case FrontSide : 
					++iCurOutline;
					goto endLoop;
				case BackSide : 
					if ((iCurOutline + 1) != m_aVisible.end())
						*iCurOutline = m_aVisible.back();
					m_aVisible.pop_back();
					ASSERT(sOccluded.size() > 2);
					m_aOccluded.push_back(sOccluded);
					goto endLoop;
				case Intersect :
					ASSERT(sVisible.size() > 2);
					*iCurOutline = sVisible;
					++iCurOutline;
					ASSERT(sOccluded.size() > 2);
					m_aOccluded.push_back(sOccluded);
					goto endLoop;
			}
		}
	}

	if (bSplitOccluded)
	{
		iCurOutline = m_aOccluded.begin();
		while (nOccludedSize)
		{
			ASSERT(iCurOutline != m_aOccluded.end());
			--nOccludedSize;
			PolySide nResult = SplitOutline(cPlane, *iCurOutline, sVisible, sOccluded);
			switch (nResult)
			{
				case FrontSide :
					if ((iCurOutline + 1) != m_aOccluded.end())
						*iCurOutline = m_aOccluded.back();
					m_aOccluded.pop_back();
					ASSERT(sVisible.size() > 2);
					m_aVisible.push_back(sVisible);
					goto endLoop;
				case BackSide :
					++iCurOutline;
					goto endLoop;
				case Intersect :
					ASSERT(sOccluded.size() > 2);
					*iCurOutline = sOccluded;
					++iCurOutline;
					ASSERT(sVisible.size() > 2);
					m_aVisible.push_back(sVisible);
					goto endLoop;
			}
		}
	}

	endLoop:
	if (m_aVisible.empty())
		return BackSide;
	if (m_aOccluded.empty())
		return FrontSide;
	return Intersect;
}