/* ============ idBrushList::Split ============ */ void idBrushList::Split( const idPlane& plane, int planeNum, idBrushList& frontList, idBrushList& backList, bool useBrushSavedPlaneSide ) { idBrush* b, *front, *back; frontList.Clear(); backList.Clear(); if( !useBrushSavedPlaneSide ) { for( b = head; b; b = b->next ) { b->Split( plane, planeNum, &front, &back ); if( front ) { frontList.AddToTail( front ); } if( back ) { backList.AddToTail( back ); } } return; } for( b = head; b; b = b->next ) { if( b->savedPlaneSide & BRUSH_PLANESIDE_BOTH ) { b->Split( plane, planeNum, &front, &back ); if( front ) { frontList.AddToTail( front ); } if( back ) { backList.AddToTail( back ); } } else if( b->savedPlaneSide & BRUSH_PLANESIDE_FRONT ) { frontList.AddToTail( b->Copy() ); } else { backList.AddToTail( b->Copy() ); } } }
/* ============ idBrush::Subtract ============ */ bool idBrush::Subtract( const idBrush* b, idBrushList& list ) const { int i; idBrush* front, *back; const idBrush* in; list.Clear(); in = this; for( i = 0; i < b->sides.Num() && in; i++ ) { in->Split( b->sides[i]->plane, b->sides[i]->planeNum, &front, &back ); if( in != this ) { delete in; } if( front ) { list.AddToTail( front ); } in = back; } // if didn't really intersect if( !in ) { list.Free(); return false; } delete in; return true; }