/// <summary> /// Remove edge and set true to dirty_tris . /// </summary> /// <param name="e"></param> public void RemoveEdge(Edge e) { _edges.Remove(e); dirty_tris = true; dirty_offset = true; }
/// <summary> /// Create new edge and add it to list of edges. /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <returns>Created edge</returns> public Edge CreateEdge(SpritePoint p1, SpritePoint p2) { Edge newEdge = new Edge(p1, p2); _edges.Add(newEdge); dirty_tris = true; return newEdge; }
/// <summary> /// Get all edges what be connected this edge. /// </summary> /// <param name="edge"></param> /// <returns></returns> public List<Edge> GetEdgesWithEdge(Edge edge) { List<Edge> res = new List<Edge>(); foreach (var item in edges) { if (item.ContainsPoint(edge.point1) || item.ContainsPoint(edge.point2)) { res.Add(item); } } return res; }
/// <summary> /// Get closet edge and get the point for splitting in "EdgeDivider". /// </summary> /// <param name="spritePos">sprite position</param> /// <param name="without">Edges wll not be used</param> /// <returns></returns> public EdgeDivider GetClosestEdge(Vector2 spritePos, Edge[] without = null) { EdgeDivider ed = new EdgeDivider(); float minDis = float.MaxValue; List<Edge> wo = null; if (without != null) { wo = new List<Edge>(without); } foreach (Edge edge in edges) { if (without != null && wo.Contains(edge)) { continue; } Vector2 v = edge.GetClosest(spritePos); float d = Vector2.Distance(spritePos, v); if (d < minDis) { minDis = d; ed.edge = edge; ed.position = v; } } return ed; }
/// <summary> /// Add edge to the topology and set true to dirty_tris. /// </summary> /// <param name="e"></param> public void AddEdge(Edge e) { _edges.Add(e); dirty_tris = true; }
/// <summary> /// Divide the edge. /// </summary> /// <param name="ed"></param> /// <param name="autoOffset"></param> /// <returns></returns> public SpritePoint DivedeEdge(EdgeDivider ed, bool autoOffset = false) { SpritePoint newPoint = new SpritePoint(ed.position); Edge e1 = new Edge(ed.edge.point1, newPoint); Edge e2 = new Edge(newPoint, ed.edge.point2); AddPoint(newPoint); AddEdge(e1); AddEdge(e2); if (autoOffset) { float d1 = Vector2.Distance(ed.edge.point1.spritePosition, ed.position); float d2 = Vector2.Distance(ed.edge.point2.spritePosition, ed.position); float ds = d1 + d2; float w1 = d1 / ds; Vector2 np = Vector2.Lerp(ed.edge.point1.spritePosition + ed.edge.point1.offset2d, ed.edge.point2.spritePosition + ed.edge.point2.offset2d, w1); newPoint.offset2d = np - newPoint.spritePosition; } RemoveEdge(ed.edge); return newPoint; }
void drawDeleteEdge(Edge edge) { Handles.color = Color.red; if (inversGizmos) { inversHandlesColor(); } Handles.DrawLine(getImagePos(edge.point1.spritePosition), getImagePos(edge.point2.spritePosition)); }