Tanoda
UILineTextureRenderer.cs
Go to the documentation of this file.
1
4
5using System.Collections.Generic;
6
8{
9 [AddComponentMenu("UI/Extensions/Primitives/UILineTextureRenderer")]
11 {
12 [SerializeField]
13 Rect m_UVRect = new Rect(0f, 0f, 1f, 1f);
14 [SerializeField]
15 private Vector2[] m_points;
16
17 public float LineThickness = 2;
18 public bool UseMargins;
19 public Vector2 Margin;
20 public bool relativeSize;
21
25 public Rect uvRect
26 {
27 get
28 {
29 return m_UVRect;
30 }
31 set
32 {
33 if (m_UVRect == value)
34 return;
35 m_UVRect = value;
36 SetVerticesDirty();
37 }
38 }
39
43 public Vector2[] Points
44 {
45 get
46 {
47 return m_points;
48 }
49 set
50 {
51 if (m_points == value)
52 return;
53 m_points = value;
54 SetAllDirty();
55 }
56 }
57
58 protected override void OnPopulateMesh(VertexHelper vh)
59 {
60 // requires sets of quads
61 if (m_points == null || m_points.Length < 2)
62 m_points = new[] { new Vector2(0, 0), new Vector2(1, 1) };
63 var capSize = 24;
64 var sizeX = rectTransform.rect.width;
65 var sizeY = rectTransform.rect.height;
66 var offsetX = -rectTransform.pivot.x * rectTransform.rect.width;
67 var offsetY = -rectTransform.pivot.y * rectTransform.rect.height;
68
69 // don't want to scale based on the size of the rect, so this is switchable now
70 if (!relativeSize)
71 {
72 sizeX = 1;
73 sizeY = 1;
74 }
75 // build a new set of m_points taking into account the cap sizes.
76 // would be cool to support corners too, but that might be a bit tough :)
77 var pointList = new List<Vector2>();
78 pointList.Add(m_points[0]);
79 var capPoint = m_points[0] + (m_points[1] - m_points[0]).normalized * capSize;
80 pointList.Add(capPoint);
81
82 // should bail before the last point to add another cap point
83 for (int i = 1; i < m_points.Length - 1; i++)
84 {
85 pointList.Add(m_points[i]);
86 }
87 capPoint = m_points[m_points.Length - 1] - (m_points[m_points.Length - 1] - m_points[m_points.Length - 2]).normalized * capSize;
88 pointList.Add(capPoint);
89 pointList.Add(m_points[m_points.Length - 1]);
90
91 var Tempm_points = pointList.ToArray();
92 if (UseMargins)
93 {
94 sizeX -= Margin.x;
95 sizeY -= Margin.y;
96 offsetX += Margin.x / 2f;
97 offsetY += Margin.y / 2f;
98 }
99
100 vh.Clear();
101
102 Vector2 prevV1 = Vector2.zero;
103 Vector2 prevV2 = Vector2.zero;
104
105 for (int i = 1; i < Tempm_points.Length; i++)
106 {
107 var prev = Tempm_points[i - 1];
108 var cur = Tempm_points[i];
109 prev = new Vector2(prev.x * sizeX + offsetX, prev.y * sizeY + offsetY);
110 cur = new Vector2(cur.x * sizeX + offsetX, cur.y * sizeY + offsetY);
111
112 float angle = Mathf.Atan2(cur.y - prev.y, cur.x - prev.x) * 180f / Mathf.PI;
113
114 var v1 = prev + new Vector2(0, -LineThickness / 2);
115 var v2 = prev + new Vector2(0, +LineThickness / 2);
116 var v3 = cur + new Vector2(0, +LineThickness / 2);
117 var v4 = cur + new Vector2(0, -LineThickness / 2);
118
119 v1 = RotatePointAroundPivot(v1, prev, new Vector3(0, 0, angle));
120 v2 = RotatePointAroundPivot(v2, prev, new Vector3(0, 0, angle));
121 v3 = RotatePointAroundPivot(v3, cur, new Vector3(0, 0, angle));
122 v4 = RotatePointAroundPivot(v4, cur, new Vector3(0, 0, angle));
123
124 Vector2 uvTopLeft = Vector2.zero;
125 Vector2 uvBottomLeft = new Vector2(0, 1);
126
127 Vector2 uvTopCenter = new Vector2(0.5f, 0);
128 Vector2 uvBottomCenter = new Vector2(0.5f, 1);
129
130 Vector2 uvTopRight = new Vector2(1, 0);
131 Vector2 uvBottomRight = new Vector2(1, 1);
132
133 Vector2[] uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomCenter, uvTopCenter };
134
135 if (i > 1)
136 vh.AddUIVertexQuad(SetVbo(new[] { prevV1, prevV2, v1, v2 }, uvs));
137
138 if (i == 1)
139 uvs = new[] { uvTopLeft, uvBottomLeft, uvBottomCenter, uvTopCenter };
140 else if (i == Tempm_points.Length - 1)
141 uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomRight, uvTopRight };
142
143 vh.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs));
144
145
146 prevV1 = v3;
147 prevV2 = v4;
148 }
149 }
150
151 public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
152 {
153 Vector3 dir = point - pivot; // get point direction relative to pivot
154 dir = Quaternion.Euler(angles) * dir; // rotate it
155 point = dir + pivot; // calculate rotated point
156 return point; // return it
157 }
158 }
159}
Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
Rect uvRect
UV rectangle used by the texture.
Vector2[] Points
Points to be drawn in the line.
UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)
Credit Erdener Gonenc - @PixelEnvision.