1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| using System; using UnityEngine; using UnityEditor.Experimental.GraphView; using UnityEngine.UIElements; namespace NKG.Editor { public class CustomEdgeControl : EdgeControl { private const float k_HorizontalExtension = 50.0f; private const float k_ArrowSize = 16.0f; private const float k_ArrowWidth = 0.6f; public CustomEdgeControl() { this.generateVisualContent = new Action<MeshGenerationContext>(OnGenerateVisualContent); } private void OnGenerateVisualContent(MeshGenerationContext mgc) { if (this.edgeWidth <= 0) return; this.UpdateRenderPoints(); DrawStraightLines(mgc); } protected override void UpdateRenderPoints() { base.UpdateRenderPoints(); var st = this.parent.ChangeCoordinatesTo((VisualElement)this, from); var et = this.parent.ChangeCoordinatesTo((VisualElement)this, to); var offset = k_HorizontalExtension; var renderPointsField = typeof(EdgeControl).GetField("m_RenderPoints", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); var renderPoints = renderPointsField.GetValue(this) as System.Collections.Generic.List<Vector2>; if (renderPoints != null) { renderPoints.Clear(); if (st.x < et.x) { renderPoints.Add(st); renderPoints.Add(new Vector2(st.x + offset, st.y)); renderPoints.Add(new Vector2(et.x - offset, et.y)); renderPoints.Add(et); } else { var centerY = (st.y + et.y) * 0.5f; renderPoints.Add(st); renderPoints.Add(new Vector2(st.x + offset, st.y)); renderPoints.Add(new Vector2(st.x + offset, centerY)); renderPoints.Add(new Vector2(et.x - offset, centerY)); renderPoints.Add(new Vector2(et.x - offset, et.y)); renderPoints.Add(et); } } } private void DrawStraightLines(MeshGenerationContext mgc) { var painter = mgc.painter2D; painter.lineWidth = edgeWidth; painter.strokeColor = outputColor; var offset = k_HorizontalExtension; var st = this.parent.ChangeCoordinatesTo((VisualElement)this, from); var et = this.parent.ChangeCoordinatesTo((VisualElement)this, to); painter.BeginPath(); painter.MoveTo(st); if (st.x < et.x) { var p1 = new Vector2(st.x + offset, st.y); var p2 = new Vector2(et.x - offset, et.y); painter.LineTo(p1); } else { var p1 = new Vector2(st.x + offset, st.y); var centerY = (st.y + et.y) * 0.5f; var p2 = new Vector2(st.x + offset, centerY); var p3 = new Vector2(et.x - offset, centerY); var p4 = new Vector2(et.x - offset, et.y); painter.LineTo(p1); } painter.Stroke(); DrawDirectionArrow(painter, st, et, offset); } private void DrawDirectionArrow(Painter2D painter, Vector2 st, Vector2 et, float offset) { Vector2 arrowPos; Vector2 arrowDir; if (st.x < et.x) { var p1 = new Vector2(st.x + offset, st.y); var p2 = new Vector2(et.x - offset, et.y); arrowPos = (p1 + p2) * 0.5f; arrowDir = (p2 - p1).normalized; } else { var centerY = (st.y + et.y) * 0.5f; var p2 = new Vector2(st.x + offset, centerY); var p3 = new Vector2(et.x - offset, centerY); arrowPos = (p2 + p3) * 0.5f; arrowDir = (p3 - p2).normalized; } DrawArrow(painter, arrowPos, arrowDir, k_ArrowSize); } private void DrawArrow(Painter2D painter, Vector2 position, Vector2 direction, float size) { var perpendicular = new Vector2(-direction.y, direction.x); var tip = position + direction * size * 0.6f; var base1 = position - direction * size * 0.4f + perpendicular * size * k_ArrowWidth; var base2 = position - direction * size * 0.4f - perpendicular * size * k_ArrowWidth; painter.BeginPath(); painter.MoveTo(tip); painter.LineTo(base1); painter.LineTo(base2); painter.LineTo(tip); painter.fillColor = painter.strokeColor; painter.Fill(); } }}
|