public void DrawArc(INodeDrawInfo from, INodeDrawInfo to, bool isSelected, bool isTwoDirectional = false) { var toNodeDrawInfo = to as NodeDrawInfo; DrawUtilities.DrawDirectionalLine(DrawingContext.Current.ApplyScroll(from.Position), DrawingContext.Current.ApplyScroll(to.Position), toNodeDrawInfo.Radius, GetArcColor(isSelected), DrawingContext.Current.Zoom, isTwoDirectional); }
public bool TryExecute() { var drawingContext = DrawingContext.Current; var graphDrawerSystem = GraphContext.Current.GraphDrawerSystem; var evt = Event.current; if (evt.shift) { if (evt.type == EventType.mouseDown) { INodeDrawInfo nodeDrawInfo; if (graphDrawerSystem.GetNodeDrawInfoByPosition(drawingContext.GetMousePosition(), out nodeDrawInfo)) { _creatingArc = true; _nodeFrom = nodeDrawInfo; return(true); } } if (evt.type == EventType.MouseUp && _creatingArc) { TryCreateArc(graphDrawerSystem, drawingContext); _creatingArc = false; return(true); } if (_creatingArc) { INodeDrawInfo nodeDrawInfo; if (graphDrawerSystem.GetNodeDrawInfoByPosition(drawingContext.GetMousePosition(), out nodeDrawInfo)) { if (nodeDrawInfo == _nodeFrom) { graphDrawerSystem.DrawLoop(_nodeFrom, false); GraphEditorWindow.NeedHandlesRepaint = true; return(true); } } graphDrawerSystem.DrawArc(_nodeFrom, evt.mousePosition, false); GraphEditorWindow.NeedHandlesRepaint = true; return(true); } } else { if (_creatingArc) { TryCreateArc(graphDrawerSystem, drawingContext); _creatingArc = false; return(true); } } _creatingArc = false; return(false); }
//TODO Optimize search public bool GetNodeDrawInfoByPosition(Vector2 position, out INodeDrawInfo drawInfo) { foreach (var nodeDrawInfo in _nodeDrawInfos.Values) { if (Vector2.Distance(nodeDrawInfo.Position, position) <= nodeDrawInfo.Radius) { drawInfo = nodeDrawInfo; return(true); } } drawInfo = default(NodeDrawInfo); return(false); }
private bool CheckDistanceFromPointToLoop(Vector2 p, INodeDrawInfo nodeDrawInfo) { var drawInfo = nodeDrawInfo as NodeDrawInfo; Vector3 fromDirection = Vector3.down; Vector3 toDirection = Vector3.right;; var from = (Vector3)nodeDrawInfo.Position + fromDirection * drawInfo.Radius; var to = (Vector3)nodeDrawInfo.Position + toDirection * drawInfo.Radius; var tangentDistance = drawInfo.Radius * 4; var startTangent = from + fromDirection * tangentDistance; var endTangent = from + toDirection * tangentDistance; return(HandleUtility.DistancePointBezier(p, from, to, startTangent, endTangent) < SelectionArcDistanceThreshold * DrawingContext.Current.Zoom); }
//TODO Optimize public Node GetNode(INodeDrawInfo nodeDrawInfo) { return(_nodeDrawInfos.FirstOrDefault(n => n.Value == nodeDrawInfo).Key); }
public void DrawLoop(INodeDrawInfo node, bool isSelected) { var drawInfo = node as NodeDrawInfo; DrawUtilities.DrawLoop(DrawingContext.Current.ApplyScroll(node.Position), drawInfo.Radius, GetArcColor(isSelected), DrawingContext.Current.Zoom); }
public void Deselect(INodeDrawInfo node) { SelectedNodes.Remove(node); }
public void Select(INodeDrawInfo node) { SelectedNodes.Add(node); DeselectArc(); }