// 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; }