您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
160 行
5.5 KiB
160 行
5.5 KiB
using System;
|
|
using UnityEngine;
|
|
|
|
//#pragma warning disable 0414
|
|
//#pragma warning disable 0219
|
|
|
|
namespace UnityEditor.Experimental.Graph
|
|
{
|
|
internal class Edge<T> : CanvasElement where T : CanvasElement, IConnect
|
|
{
|
|
protected T m_Left;
|
|
protected T m_Right;
|
|
protected ICanvasDataSource m_Data;
|
|
|
|
public Edge(ICanvasDataSource data, T left, T right)
|
|
{
|
|
m_Data = data;
|
|
zIndex = 9999;
|
|
m_SupportsRenderToTexture = false;
|
|
left.AddDependency(this);
|
|
right.AddDependency(this);
|
|
m_Left = left;
|
|
m_Right = right;
|
|
|
|
UpdateModel(UpdateType.Update);
|
|
|
|
KeyDown += OnDeleteEdge;
|
|
}
|
|
|
|
public T Left
|
|
{
|
|
get { return m_Left; }
|
|
}
|
|
|
|
public T Right
|
|
{
|
|
get { return m_Right; }
|
|
}
|
|
|
|
private bool OnDeleteEdge(CanvasElement element, Event e, Canvas2D canvas)
|
|
{
|
|
if (e.type == EventType.Used)
|
|
return false;
|
|
|
|
if (e.keyCode == KeyCode.Delete)
|
|
{
|
|
m_Data.DeleteElement(this);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public override bool Intersects(Rect rect)
|
|
{
|
|
// first check coarse bounding box
|
|
if (!base.Intersects(rect))
|
|
return false;
|
|
|
|
// bounding box check succeeded, do more fine grained check by checking intersection between the rectangles' diagonal
|
|
// and the line segments
|
|
|
|
Vector3 from = m_Left.ConnectPosition();
|
|
Vector3 to = m_Right.ConnectPosition();
|
|
Orientation orientation = m_Left.GetOrientation();
|
|
|
|
Vector3[] points, tangents;
|
|
EdgeConnector<T>.GetTangents(m_Left.GetDirection(), orientation, from, to, out points, out tangents);
|
|
Vector3[] allPoints = Handles.MakeBezierPoints(points[0], points[1], tangents[0], tangents[1], 20);
|
|
|
|
for (int a = 0; a < allPoints.Length; a++)
|
|
{
|
|
if (a >= allPoints.Length - 1)
|
|
{
|
|
break;
|
|
}
|
|
|
|
Vector2 segmentA = new Vector2(allPoints[a].x, allPoints[a].y);
|
|
Vector2 segmentB = new Vector2(allPoints[a + 1].x, allPoints[a + 1].y);
|
|
|
|
if (UnityEditorInternal.Experimental.RectUtils.IntersectsSegment(rect, segmentA, segmentB))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public override bool Contains(Vector2 canvasPosition)
|
|
{
|
|
// first check coarse bounding box
|
|
if (!base.Contains(canvasPosition))
|
|
return false;
|
|
|
|
// bounding box check succeeded, do more fine grained check by measuring distance to bezier points
|
|
|
|
Vector3 from = m_Left.ConnectPosition();
|
|
Vector3 to = m_Right.ConnectPosition();
|
|
Orientation orientation = m_Left.GetOrientation();
|
|
|
|
Vector3[] points, tangents;
|
|
EdgeConnector<T>.GetTangents(m_Left.GetDirection(), orientation, from, to, out points, out tangents);
|
|
Vector3[] allPoints = Handles.MakeBezierPoints(points[0], points[1], tangents[0], tangents[1], 20);
|
|
|
|
float minDistance = Mathf.Infinity;
|
|
foreach (Vector3 currentPoint in allPoints)
|
|
{
|
|
float distance = Vector3.Distance(currentPoint, canvasPosition);
|
|
minDistance = Mathf.Min(minDistance, distance);
|
|
if (minDistance < 15.0f)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public override void Render(Rect parentRect, Canvas2D canvas)
|
|
{
|
|
Color edgeColor = selected ? Color.yellow : Color.white;
|
|
|
|
Vector3 from = m_Left.ConnectPosition();
|
|
Vector3 to = m_Right.ConnectPosition();
|
|
Orientation orientation = m_Left.GetOrientation();
|
|
|
|
Vector3[] points, tangents;
|
|
EdgeConnector<T>.GetTangents(m_Left.GetDirection(), orientation, from, to, out points, out tangents);
|
|
Handles.DrawBezier(points[0], points[1], tangents[0], tangents[1], edgeColor, null, 5f);
|
|
|
|
// little widget on the middle of the edge
|
|
Vector3[] allPoints = Handles.MakeBezierPoints(points[0], points[1], tangents[0], tangents[1], 20);
|
|
Color oldColor = Handles.color;
|
|
Handles.color = Color.blue;
|
|
Handles.DrawSolidDisc(allPoints[10], new Vector3(0.0f, 0.0f, -1.0f), 6f);
|
|
Handles.color = edgeColor;
|
|
Handles.DrawWireDisc(allPoints[10], new Vector3(0.0f, 0.0f, -1.0f), 6f);
|
|
Handles.DrawWireDisc(allPoints[10], new Vector3(0.0f, 0.0f, -1.0f), 5f);
|
|
|
|
// dot on top of anchor showing it's connected
|
|
Handles.color = new Color(0.3f, 0.4f, 1.0f, 1.0f);
|
|
Handles.DrawSolidDisc(from, new Vector3(0.0f, 0.0f, -1.0f), 4f);
|
|
Handles.DrawSolidDisc(to, new Vector3(0.0f, 0.0f, -1.0f), 4f);
|
|
Handles.color = oldColor;
|
|
}
|
|
|
|
public override void UpdateModel(UpdateType t)
|
|
{
|
|
Vector3 from = m_Left.ConnectPosition();
|
|
Vector3 to = m_Right.ConnectPosition();
|
|
|
|
Rect r = new Rect();
|
|
r.min = new Vector2(Math.Min(from.x, to.x), Math.Min(from.y, to.y));
|
|
r.max = new Vector2(Math.Max(from.x, to.x), Math.Max(from.y, to.y));
|
|
|
|
translation = r.min;
|
|
scale = new Vector3(r.width, r.height, 1.0f);
|
|
|
|
base.UpdateModel(t);
|
|
}
|
|
}
|
|
}
|