Beispiel #1
0
        protected override void Update()
        {
            // return if no lighthouse was selected since last update
            if (m_selectedLighthouse == null)
            {
                return;
            }

            // get current mouseposition
            var worldlocation = Camera.main.ScreenPointToRay(Input.mousePosition).origin;

            worldlocation.z = -2f;

            // move lighthouse to mouse position
            // will update visibility polygon
            m_selectedLighthouse.Pos = worldlocation;

            // see if lighthouse was released
            if (Input.GetMouseButtonUp(0))
            {
                //check whether lighthouse is over the island
                if (!LevelPolygon.ContainsInside(m_selectedLighthouse.Pos))
                {
                    // destroy the lighthouse
                    m_solution.RemoveLighthouse(m_selectedLighthouse);
                    Destroy(m_selectedLighthouse.gameObject);
                    UpdateLighthouseText();
                }

                // lighthouse no longer selected
                m_selectedLighthouse = null;

                CheckSolution();
            }
        }
        /// <summary>
        /// Builds a list of Edge objects from a LevelPolygon
        /// </summary>
        private static IList<Edge> BuildPolygonEdgeList( LevelPolygon poly )
        {
            List< Edge > edges = new List< Edge >( poly.Edges.Length );

            for ( int edgeIndex = 0; edgeIndex < edges.Count; ++edgeIndex )
            {
                LevelEdge srcEdge = poly.Edges[ edgeIndex ];
                edges[ edgeIndex ] = new Edge( srcEdge );
            }

            return edges;
        }
        /// <summary>
        /// Combines two polygons together using a CSG operator. Returns a BSP tree for the result polygon
        /// </summary>
        public static Node Combine( LevelPolygon poly1, LevelPolygon poly2, Operation op )
        {
            IList< Edge > poly1Edges = BuildPolygonEdgeList( poly1 );
            IList< Edge > poly2Edges = BuildPolygonEdgeList( poly2 );

            Node poly1Root = BuildNode( poly1Edges );
            Node poly2Root = BuildNode( poly2Edges );

            List< Edge > sourceEdges = new List< Edge >( );

            switch ( op )
            {
                case Operation.Union :
                {
                    ClipEdges( poly1Root, poly2Edges, true, false, sourceEdges );
                    ClipEdges( poly2Root, poly1Edges, true, false, sourceEdges );
                    break;
                }
                case Operation.Intersection :
                {
                    ClipEdges( poly1Root, poly2Edges, false, true, sourceEdges );
                    ClipEdges( poly2Root, poly1Edges, false, true, sourceEdges );
                    break;
                }
                case Operation.Complement :
                {
                    ClipEdges( poly1Root, poly2Edges, false, true, sourceEdges );
                    ClipEdges( poly2Root, poly1Edges, false, true, sourceEdges );
                    break;
                }
            }

            return BuildNode( sourceEdges );
        }