/// <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> /// 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); }
/// <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> /// 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 pointTool() { latestPoint = null; if (dragPoint != null) { dragPoint.spritePosition = getLocalPos(Event.current.mousePosition + deltaDrag); drawDragPoint(dragPoint); Repaint(); if (Event.current.rawType == EventType.MouseUp) { closestPoint = dragPoint; dragPoint = null; clossesDiveder = null; Repaint(); } if (Event.current.type == EventType.MouseDrag) { updateSpriteDeformer(); } return; } if (Event.current.type == EventType.MouseMove) { float minDis = snapDistance; closestPoint = null; foreach (SpritePoint p in spriteDeformer.points) { float cm = Vector2.Distance(getImagePos(p.spritePosition), Event.current.mousePosition); if (cm < minDis) { minDis = cm; closestPoint = p; } } clossesDiveder = null; if (closestPoint == null) { Vector2 mPos = getLocalPos(mousePosInImage); EdgeDivider ed = spriteDeformer.GetClosestEdge(mPos); if (Vector2.Distance(getImagePos(ed.position), mousePosInImage) < snapDistance) { clossesDiveder = ed; } } Repaint(); } if (clossesDiveder != null) { drawNewPoint(clossesDiveder.position); } if (closestPoint != null) { drawClosestPoint(closestPoint); } if (closestPoint == null && clossesDiveder == null) { drawNewPoint(getLocalPos(Event.current.mousePosition)); } if (Event.current.type == EventType.MouseDown) { if (closestPoint != null) { dragPoint = closestPoint; deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition; } else { if (clossesDiveder == null) { dragPoint = new SpritePoint(getLocalPos(Event.current.mousePosition)); deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition; spriteDeformer.AddPoint(dragPoint, true); updateSpriteDeformer(); } else { dragPoint = spriteDeformer.DivedeEdge(clossesDiveder, true); closestPoint = dragPoint; deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition; updateSpriteDeformer(); } } } }
void deleteTool() { if (Event.current.type == EventType.MouseMove) { float minDis = snapDistance; closestPoint = null; foreach (SpritePoint p in spriteDeformer.points) { if (p == latestPoint) { continue; } if (spriteDeformer.ContainsEdge(latestPoint, p)) { continue; } float cm = Vector2.Distance(getImagePos(p.spritePosition), Event.current.mousePosition); if (cm < minDis) { minDis = cm; closestPoint = p; } } Repaint(); } if (closestPoint != null) { List <Edge> edges = spriteDeformer.GetEdgesWithPoint(closestPoint); if (edges.Count == 0) { drawDeletePoint(closestPoint); if (Event.current.type == EventType.MouseUp) { spriteDeformer.RemovePoint(closestPoint); updateSpriteDeformer(); closestPoint = null; Repaint(); } } if (edges.Count == 2) { drawDeletePoint(closestPoint); SpritePoint anetherPoint1 = edges[0].point1 != closestPoint ? edges[0].point1 : edges[0].point2; SpritePoint anetherPoint2 = edges[1].point1 != closestPoint ? edges[1].point1 : edges[1].point2; drawDeleteEdge(edges[0]); drawDeleteEdge(edges[1]); if (!spriteDeformer.ContainsEdge(anetherPoint1, anetherPoint2)) { drawNewEdge(anetherPoint1.spritePosition, anetherPoint2.spritePosition); } if (Event.current.type == EventType.MouseUp) { spriteDeformer.RemovePoint(closestPoint); if (!spriteDeformer.ContainsEdge(anetherPoint1, anetherPoint2)) { spriteDeformer.AddEdge(new Edge(anetherPoint1, anetherPoint2)); } closestPoint = null; Repaint(); updateSpriteDeformer(); return; } } if (edges.Count == 1 || edges.Count > 2) { foreach (Edge e in edges) { drawDeleteEdge(e); drawDeletePoint(closestPoint); } if (Event.current.type == EventType.MouseUp) { foreach (Edge e in edges) { spriteDeformer.RemoveEdge(e); } spriteDeformer.RemovePoint(closestPoint); updateSpriteDeformer(); closestPoint = null; Repaint(); } } } if (closestPoint == null) { EdgeDivider ed = spriteDeformer.GetClosestEdge(getLocalPos(Event.current.mousePosition)); if (Vector2.Distance(getImagePos(ed.position), Event.current.mousePosition) < snapDistance / 2) { drawDeleteEdge(ed.edge); if (Event.current.type == EventType.MouseUp) { spriteDeformer.RemoveEdge(ed.edge); Repaint(); } } } }
void pointTool() { latestPoint = null; if (dragPoint != null) { dragPoint.spritePosition = getLocalPos(Event.current.mousePosition + deltaDrag); drawDragPoint(dragPoint); Repaint(); if (Event.current.rawType == EventType.MouseUp) { closestPoint = dragPoint; dragPoint = null; clossesDiveder = null; Repaint(); } if (Event.current.type == EventType.MouseDrag) updateSpriteDeformer(); return; } if (Event.current.type == EventType.MouseMove) { float minDis = snapDistance; closestPoint = null; foreach (SpritePoint p in spriteDeformer.points) { float cm = Vector2.Distance(getImagePos(p.spritePosition), Event.current.mousePosition); if (cm < minDis) { minDis = cm; closestPoint = p; } } clossesDiveder = null; if (closestPoint == null) { Vector2 mPos = getLocalPos(mousePosInImage); EdgeDivider ed = spriteDeformer.GetClosestEdge(mPos); if (Vector2.Distance(getImagePos(ed.position), mousePosInImage) < snapDistance) { clossesDiveder = ed; } } Repaint(); } if (clossesDiveder != null) { drawNewPoint(clossesDiveder.position); } if (closestPoint != null) { drawClosestPoint(closestPoint); } if (closestPoint == null && clossesDiveder == null) { drawNewPoint(getLocalPos(Event.current.mousePosition)); } if (Event.current.type == EventType.mouseDown) { if (closestPoint != null) { dragPoint = closestPoint; deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition; } else { if (clossesDiveder == null) { dragPoint = new SpritePoint(getLocalPos(Event.current.mousePosition)); deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition; spriteDeformer.AddPoint(dragPoint, true); updateSpriteDeformer(); } else { dragPoint = spriteDeformer.DivedeEdge(clossesDiveder, true); closestPoint = dragPoint; deltaDrag = getImagePos(dragPoint.spritePosition) - Event.current.mousePosition; updateSpriteDeformer(); } } } }