Tanoda
UIPolygon.cs
Go to the documentation of this file.
1
3
5{
6 [AddComponentMenu("UI/Extensions/Primitives/UI Polygon")]
8 {
9 public bool fill = true;
10 public float thickness = 5;
11 [Range(3, 360)]
12 public int sides = 3;
13 [Range(0, 360)]
14 public float rotation = 0;
15 [Range(0, 1)]
16 public float[] VerticesDistances = new float[3];
17 private float size = 0;
18
19 public void DrawPolygon(int _sides)
20 {
21 sides = _sides;
22 VerticesDistances = new float[_sides + 1];
23 for (int i = 0; i < _sides; i++) VerticesDistances[i] = 1; ;
24 rotation = 0;
25 SetAllDirty();
26 }
27 public void DrawPolygon(int _sides, float[] _VerticesDistances)
28 {
29 sides = _sides;
30 VerticesDistances = _VerticesDistances;
31 rotation = 0;
32 SetAllDirty();
33 }
34 public void DrawPolygon(int _sides, float[] _VerticesDistances, float _rotation)
35 {
36 sides = _sides;
37 VerticesDistances = _VerticesDistances;
38 rotation = _rotation;
39 SetAllDirty();
40 }
41 void Update()
42 {
43 size = rectTransform.rect.width;
44 if (rectTransform.rect.width > rectTransform.rect.height)
45 size = rectTransform.rect.height;
46 else
47 size = rectTransform.rect.width;
48 thickness = (float)Mathf.Clamp(thickness, 0, size / 2);
49 }
50
51 protected override void OnPopulateMesh(VertexHelper vh)
52 {
53 vh.Clear();
54
55 Vector2 prevX = Vector2.zero;
56 Vector2 prevY = Vector2.zero;
57 Vector2 uv0 = new Vector2(0, 0);
58 Vector2 uv1 = new Vector2(0, 1);
59 Vector2 uv2 = new Vector2(1, 1);
60 Vector2 uv3 = new Vector2(1, 0);
61 Vector2 pos0;
62 Vector2 pos1;
63 Vector2 pos2;
64 Vector2 pos3;
65 float degrees = 360f / sides;
66 int vertices = sides + 1;
67 if (VerticesDistances.Length != vertices)
68 {
69 VerticesDistances = new float[vertices];
70 for (int i = 0; i < vertices - 1; i++) VerticesDistances[i] = 1;
71 }
72 // last vertex is also the first!
73 VerticesDistances[vertices - 1] = VerticesDistances[0];
74 for (int i = 0; i < vertices; i++)
75 {
76 float outer = -rectTransform.pivot.x * size * VerticesDistances[i];
77 float inner = -rectTransform.pivot.x * size * VerticesDistances[i] + thickness;
78 float rad = Mathf.Deg2Rad * (i * degrees + rotation);
79 float c = Mathf.Cos(rad);
80 float s = Mathf.Sin(rad);
81 uv0 = new Vector2(0, 1);
82 uv1 = new Vector2(1, 1);
83 uv2 = new Vector2(1, 0);
84 uv3 = new Vector2(0, 0);
85 pos0 = prevX;
86 pos1 = new Vector2(outer * c, outer * s);
87 if (fill)
88 {
89 pos2 = Vector2.zero;
90 pos3 = Vector2.zero;
91 }
92 else
93 {
94 pos2 = new Vector2(inner * c, inner * s);
95 pos3 = prevY;
96 }
97 prevX = pos1;
98 prevY = pos2;
99 vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 }));
100 }
101 }
102 }
103}
override void OnPopulateMesh(VertexHelper vh)
Definition: UIPolygon.cs:51
void DrawPolygon(int _sides, float[] _VerticesDistances, float _rotation)
Definition: UIPolygon.cs:34
void DrawPolygon(int _sides, float[] _VerticesDistances)
Definition: UIPolygon.cs:27
UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)
Credit Erdener Gonenc - @PixelEnvision.