/// <summary>
        /// Called when a edge list is finished
        /// </summary>
        protected override void OnFinished( Point3[] points, bool loop )
        {
            try
            {
                LevelGeometry level = LevelGeometry.FromCurrentScene( );

                Point2[] points2 = new Point2[ points.Length ];
                for ( int ptIndex = 0; ptIndex < points.Length; ++ptIndex )
                {
                    points2[ ptIndex ] = new Point2( points[ ptIndex ].X, points[ ptIndex ].Z );
                }

                UiPolygon brush = new UiPolygon( "", points2 );
                level.Add( brush, false, false );

                AppLog.Info( "Combined brush with current level geometry" );
            }
            catch ( Exception ex )
            {
                AppLog.Exception( ex, "Failed to combine brush with current level geometry" );
                ErrorMessageBox.Show( Resources.FailedToCombineCsgBrush );
            }
        }
        /// <summary>
        /// Builds a BSP tree from a CSG brush
        /// </summary>
        private static BspNode Build( UiPolygon brush, bool reverse )
        {
            Point2[] points = brush.Points;
            if ( reverse )
            {
                Array.Reverse( points );
            }

            //	Create edges
            List< Edge > sourceEdges = new List< Edge >( points.Length );
            for ( int ptIndex = 0; ptIndex < points.Length; ++ptIndex )
            {
                Edge edge = new Edge( points[ ptIndex ], points[ ( ptIndex + 1 ) % points.Length ] );
                sourceEdges.Add( edge );
            }

            //	Build the BSP tree from the edge list
            BspNode node = BuildNode( null, sourceEdges );

            return node;
        }
 /// <summary>
 /// Combines a brush with the current geometry set
 /// </summary>
 /// <param name="op">CSG operation</param>
 /// <param name="brush">Brush to add to the level geometry</param>
 /// <exception cref="InvalidOperationException">Thrown by convex region builder if BSP tree is internally invalid</exception>
 public void Combine( Operation op, UiPolygon brush )
 {
     BspNode brushBsp = Build( brush, op == Operation.Complement );
     BspNode newRoot = null;
     if ( m_Root == null )
     {
         if ( op == Operation.Union || op == Operation.EdgeUnion )
         {
             newRoot = brushBsp;
         }
     }
     else
     {
         newRoot = Combine( op, m_Root, brushBsp );
     }
     if ( newRoot != null )
     {
         FixUpDoubleSidedNodes( newRoot );
         BuildConvexRegions( newRoot );
         m_Root = newRoot;
     }
     if ( GeometryChanged != null )
     {
         GeometryChanged( this, null );
     }
 }
        private void AddCircleToLevelGeometry( LevelGeometry geometry )
        {
            try
            {
                Point2[] points2 = new Point2[ EdgeCount ];

                float angle = m_AngleStart;
                float angleIncrement = Constants.TwoPi / EdgeCount;
                for ( int ptIndex = 0; ptIndex < EdgeCount; ++ptIndex )
                {
                    float x = m_CentrePoint.X + Functions.Sin( angle ) * m_Radius;
                    float y = m_CentrePoint.Z + Functions.Cos( angle ) * m_Radius;

                    points2[ ptIndex ] = new Point2( x, y );

                    angle += angleIncrement;
                    if ( angle > Constants.TwoPi )
                    {
                        angle -= Constants.TwoPi;
                    }
                }

                UiPolygon brush = new UiPolygon( "", points2 );
                geometry.Add( brush, false, false );
                AppLog.Info( "Combined brush with current level geometry" );
            }
            catch ( Exception ex )
            {
                AppLog.Exception( ex, "Failed to combine circle brush with current level geometry" );
                ErrorMessageBox.Show( Resources.FailedToCombineCsgBrush );
            }

            m_DefiningRadius = false;
        }