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