Poly *Poly::CopyList ( ) const { Poly *pPoly = new Poly; pPoly->TextureID = TextureID; pPoly->m_iNumberOfVertices = m_iNumberOfVertices; pPoly->plane = plane; pPoly->verts = new Vertex[ m_iNumberOfVertices ]; memcpy ( pPoly->verts, verts, sizeof ( Vertex ) * m_iNumberOfVertices ); if ( !IsLast ( ) ) { pPoly->AddPoly ( m_pNext->CopyList ( ) ); } return pPoly; }
Poly *Poly::ClipToList ( Poly *pPoly_, bool bClipOnPlane_ ) { switch ( ClassifyPoly ( pPoly_ ) ) { case eCP::FRONT: { return pPoly_->CopyPoly ( ); } break; case eCP::BACK: { if ( IsLast ( ) ) { return NULL; } return m_pNext->ClipToList ( pPoly_, bClipOnPlane_ ); } break; case eCP::ONPLANE: { double Angle = plane.n.Dot ( pPoly_->plane.n ) - 1; if ( ( Angle < epsilon ) && ( Angle > -epsilon ) ) { if ( !bClipOnPlane_ ) { return pPoly_->CopyPoly ( ); } } if ( IsLast ( ) ) { return NULL; } return m_pNext->ClipToList ( pPoly_, bClipOnPlane_ ); } break; case eCP::SPLIT: { Poly *pFront = NULL; Poly *pBack = NULL; SplitPoly ( pPoly_, &pFront, &pBack ); if ( IsLast ( ) ) { delete pBack; return pFront; } Poly *pBackFrags = m_pNext->ClipToList ( pBack, bClipOnPlane_ ); if ( pBackFrags == NULL ) { delete pBack; return pFront; } if ( *pBackFrags == *pBack ) { delete pFront; delete pBack; delete pBackFrags; return pPoly_->CopyPoly ( ); } delete pBack; pFront->AddPoly ( pBackFrags ); return pFront; } break; } return NULL; }