From 7e279b78a15c6f312fea822d0df35e5a34f1d1f9 Mon Sep 17 00:00:00 2001 From: "Simon (darkside) Jackson" Date: Sun, 11 Oct 2015 12:05:53 +0100 Subject: [PATCH] Updated remainder of UI API updates. --HG-- branch : develop_5.3 --- Scripts/ImageExtended.cs | 17 +- Scripts/LetterSpacing.cs | 4 +- Scripts/Primatives/DiamondGraph.cs | 19 +- Scripts/Primatives/UICircle.cs | 13 +- Scripts/Primatives/UICornerCut.cs | 313 ++++++++++---------- Scripts/Primatives/UILineRenderer.cs | 14 +- Scripts/Primatives/UILineTextureRenderer.cs | 14 +- 7 files changed, 185 insertions(+), 209 deletions(-) diff --git a/Scripts/ImageExtended.cs b/Scripts/ImageExtended.cs index 87a82d9..e2b6a4d 100644 --- a/Scripts/ImageExtended.cs +++ b/Scripts/ImageExtended.cs @@ -9,6 +9,7 @@ namespace UnityEngine.UI.Extensions { /// /// Image is a textured element in the UI hierarchy. + /// Non-Functional as of 5.2.1p+ / 5.3, need to see updated Image Base script updates to fix properly. /// [AddComponentMenu("UI/Extensions/Image Extended")] @@ -196,7 +197,6 @@ namespace UnityEngine.UI.Extensions var size = overrideSprite == null ? Vector2.zero : new Vector2(overrideSprite.rect.width, overrideSprite.rect.height); Rect r = GetPixelAdjustedRect(); - // Debug.Log(string.Format("r:{2}, size:{0}, padding:{1}", size, padding, r)); int spriteW = Mathf.RoundToInt(size.x); int spriteH = Mathf.RoundToInt(size.y); @@ -253,13 +253,10 @@ namespace UnityEngine.UI.Extensions /// Update the UI renderer mesh. /// - protected override void OnPopulateMesh(Mesh toFill) + protected override void OnPopulateMesh(VertexHelper vh) { List vbo = new List(); - using (var helper = new VertexHelper(toFill)) - { - helper.GetUIVertexStream(vbo); - } + vh.GetUIVertexStream(vbo); switch (type) { @@ -276,12 +273,8 @@ namespace UnityEngine.UI.Extensions GenerateFilledSprite(vbo, m_PreserveAspect); break; } - - using (var helper = new VertexHelper()) - { - helper.AddUIVertexTriangleStream(vbo); - helper.FillMesh(toFill); - } + vh.Clear(); + vh.AddUIVertexTriangleStream(vbo); } #region Various fill functions diff --git a/Scripts/LetterSpacing.cs b/Scripts/LetterSpacing.cs index 93f7bf4..d4778d3 100644 --- a/Scripts/LetterSpacing.cs +++ b/Scripts/LetterSpacing.cs @@ -46,7 +46,9 @@ using System.Collections.Generic; namespace UnityEngine.UI.Extensions { [AddComponentMenu("UI/Effects/Extensions/Letter Spacing")] - public class LetterSpacing : BaseMeshEffect + ///Summary + /// Note, LetterSpacing is now non-functional in 5.2.1p+ / 5.3, seems the vertex order has changed? + public class LetterSpacing : BaseMeshEffect { [SerializeField] private float m_spacing = 0f; diff --git a/Scripts/Primatives/DiamondGraph.cs b/Scripts/Primatives/DiamondGraph.cs index c986f98..4f63516 100644 --- a/Scripts/Primatives/DiamondGraph.cs +++ b/Scripts/Primatives/DiamondGraph.cs @@ -15,8 +15,9 @@ namespace UnityEngine.UI.Extensions public float c = 1; public float d = 1; - protected override void OnPopulateMesh(Mesh m) + protected override void OnPopulateMesh(VertexHelper vh) { + vh.Clear(); float wHalf = rectTransform.rect.width / 2; //float hHalf = rectTransform.rect.height / 2; a = Math.Min(1, Math.Max(0, a)); @@ -25,17 +26,13 @@ namespace UnityEngine.UI.Extensions d = Math.Min(1, Math.Max(0, d)); Color32 color32 = color; - using (var vh = new VertexHelper()) - { - vh.AddVert(new Vector3(-wHalf * a, 0), color32, new Vector2(0f, 0f)); - vh.AddVert(new Vector3(0, wHalf * b), color32, new Vector2(0f, 1f)); - vh.AddVert(new Vector3(wHalf * c, 0), color32, new Vector2(1f, 1f)); - vh.AddVert(new Vector3(0, -wHalf * d), color32, new Vector2(1f, 0f)); + vh.AddVert(new Vector3(-wHalf * a, 0), color32, new Vector2(0f, 0f)); + vh.AddVert(new Vector3(0, wHalf * b), color32, new Vector2(0f, 1f)); + vh.AddVert(new Vector3(wHalf * c, 0), color32, new Vector2(1f, 1f)); + vh.AddVert(new Vector3(0, -wHalf * d), color32, new Vector2(1f, 0f)); - vh.AddTriangle(0, 1, 2); - vh.AddTriangle(2, 3, 0); - vh.FillMesh(m); - } + vh.AddTriangle(0, 1, 2); + vh.AddTriangle(2, 3, 0); } } } \ No newline at end of file diff --git a/Scripts/Primatives/UICircle.cs b/Scripts/Primatives/UICircle.cs index 89694e7..ff2137d 100644 --- a/Scripts/Primatives/UICircle.cs +++ b/Scripts/Primatives/UICircle.cs @@ -67,13 +67,12 @@ namespace UnityEngine.UI.Extensions } - protected override void OnPopulateMesh(Mesh toFill) + protected override void OnPopulateMesh(VertexHelper vh) { float outer = -rectTransform.pivot.x * rectTransform.rect.width; float inner = -rectTransform.pivot.x * rectTransform.rect.width + this.thickness; - toFill.Clear(); - var vbo = new VertexHelper(toFill); + vh.Clear(); Vector2 prevX = Vector2.zero; Vector2 prevY = Vector2.zero; @@ -119,15 +118,9 @@ namespace UnityEngine.UI.Extensions prevX = pos1; prevY = pos2; - vbo.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 })); + vh.AddUIVertexQuad(SetVbo(new[] { pos0, pos1, pos2, pos3 }, new[] { uv0, uv1, uv2, uv3 })); } - - if (vbo.currentVertCount > 3) - { - vbo.FillMesh(toFill); - } - } } } \ No newline at end of file diff --git a/Scripts/Primatives/UICornerCut.cs b/Scripts/Primatives/UICornerCut.cs index f25ea10..2e6bd88 100644 --- a/Scripts/Primatives/UICornerCut.cs +++ b/Scripts/Primatives/UICornerCut.cs @@ -1,156 +1,159 @@ -/// -/// Created by Freezy - ElicitIce.nl -/// Posted on Unity Forums http://forum.unity3d.com/threads/cut-corners-primative.359494/ -/// -/// Free for any use and alteration, source code may not be sold without my permission. -/// If you make improvements on this script please share them with the community. -/// -/// -/// Here is a script that will take a rectangular TransformRect and cut off some corners based on the corner size. -/// This is great for when you need a quick and easy non-square panel/image. -/// Enjoy! -/// It adds an additional square if the relevant side has a corner cut, it then offsets the ends to simulate a cut corner. -/// UVs are being set, but might be skewed when a texture is applied. -/// You could hide the additional colors by using the following: -/// http://rumorgames.com/hide-in-inspector/ -/// -/// - -namespace UnityEngine.UI.Extensions { - [ExecuteInEditMode] - [AddComponentMenu("UI/Extensions/Primitives/Cut Corners")] - public class UICornerCut : MaskableGraphic { - - public Vector2 cornerSize = new Vector2(16, 16); - - [Header("Corners to cut")] - public bool cutUL = true; - public bool cutUR; - public bool cutLL; - public bool cutLR; - - [Tooltip("Up-Down colors become Left-Right colors")] - public bool makeColumns = false; - - [Header("Color the cut bars differently")] - public bool useColorUp; -// [HideUnless("useColorUp")] - public Color32 colorUp = Color.blue; - - public bool useColorDown; -// [HideUnless("useColorDown")] - public Color32 colorDown = Color.green; - - protected override void OnPopulateMesh(Mesh m) { - var rect = rectTransform.rect; - var rectNew = rect; - - Color32 color32 = color; - using (var vh = new VertexHelper()) { - bool up = cutUL | cutUR; - bool down = cutLL | cutLR; - bool left = cutLL | cutUL; - bool right = cutLR | cutUR; - bool any = up | down; - - if (any && cornerSize.sqrMagnitude > 0) { - //nibble off the sides - - if (left) - rectNew.xMin += cornerSize.x; - if (down) - rectNew.yMin += cornerSize.y; - if (up) - rectNew.yMax -= cornerSize.y; - if (right) - rectNew.xMax -= cornerSize.x; - - //add two squares to the main square - Vector2 ul, ur, ll, lr; - - if (makeColumns) { - ul = new Vector2(rect.xMin, cutUL ? rectNew.yMax : rect.yMax); - ur = new Vector2(rect.xMax, cutUR ? rectNew.yMax : rect.yMax); - ll = new Vector2(rect.xMin, cutLL ? rectNew.yMin : rect.yMin); - lr = new Vector2(rect.xMax, cutLR ? rectNew.yMin : rect.yMin); - - if (left) - AddSquare( - ll, ul, - new Vector2(rectNew.xMin, rect.yMax), - new Vector2(rectNew.xMin, rect.yMin), - rect, useColorUp ? colorUp : color32, vh); - if (right) - AddSquare( - ur, lr, - new Vector2(rectNew.xMax, rect.yMin), - new Vector2(rectNew.xMax, rect.yMax), - rect, useColorDown ? colorDown : color32, vh); - } else { - ul = new Vector2(cutUL ? rectNew.xMin : rect.xMin, rect.yMax); - ur = new Vector2(cutUR ? rectNew.xMax : rect.xMax, rect.yMax); - ll = new Vector2(cutLL ? rectNew.xMin : rect.xMin, rect.yMin); - lr = new Vector2(cutLR ? rectNew.xMax : rect.xMax, rect.yMin); - if (down) - AddSquare( - lr, ll, - new Vector2(rect.xMin, rectNew.yMin), - new Vector2(rect.xMax, rectNew.yMin), - rect, useColorDown ? colorDown : color32, vh); - if (up) - AddSquare( - ul, ur, - new Vector2(rect.xMax, rectNew.yMax), - new Vector2(rect.xMin, rectNew.yMax), - rect, useColorUp ? colorUp : color32, vh); - } - } - - //center - if (makeColumns) - AddSquare(new Rect(rectNew.xMin, rect.yMin, rectNew.width, rect.height), rect, color32, vh); - else - AddSquare(new Rect(rect.xMin, rectNew.yMin, rect.width, rectNew.height), rect, color32, vh); - - vh.FillMesh(m); - } - } - - private static void AddSquare(Rect rect, Rect rectUV, Color32 color32, VertexHelper vh) { - int v0 = AddVert(rect.xMin, rect.yMin, rectUV, color32, vh); - int v1 = AddVert(rect.xMin, rect.yMax, rectUV, color32, vh); - int v2 = AddVert(rect.xMax, rect.yMax, rectUV, color32, vh); - int v3 = AddVert(rect.xMax, rect.yMin, rectUV, color32, vh); - - vh.AddTriangle(v0, v1, v2); - vh.AddTriangle(v2, v3, v0); - } - - private static void AddSquare(Vector2 a, Vector2 b, Vector2 c, Vector2 d, Rect rectUV, Color32 color32, VertexHelper vh) { - int v0 = AddVert(a.x, a.y, rectUV, color32, vh); - int v1 = AddVert(b.x, b.y, rectUV, color32, vh); - int v2 = AddVert(c.x, c.y, rectUV, color32, vh); - int v3 = AddVert(d.x, d.y, rectUV, color32, vh); - - vh.AddTriangle(v0, v1, v2); - vh.AddTriangle(v2, v3, v0); - } - - /// - /// Auto UV handler within the assigned area - /// - /// - /// - /// - /// - /// - private static int AddVert(float x, float y, Rect area, Color32 color32, VertexHelper vh) { - var uv = new Vector2( - Mathf.InverseLerp(area.xMin, area.xMax, x), - Mathf.InverseLerp(area.yMin, area.yMax, y) - ); - vh.AddVert(new Vector3(x, y), color32, uv); - return vh.currentVertCount - 1; - } - } +/// +/// Created by Freezy - ElicitIce.nl +/// Posted on Unity Forums http://forum.unity3d.com/threads/cut-corners-primative.359494/ +/// +/// Free for any use and alteration, source code may not be sold without my permission. +/// If you make improvements on this script please share them with the community. +/// +/// +/// Here is a script that will take a rectangular TransformRect and cut off some corners based on the corner size. +/// This is great for when you need a quick and easy non-square panel/image. +/// Enjoy! +/// It adds an additional square if the relevant side has a corner cut, it then offsets the ends to simulate a cut corner. +/// UVs are being set, but might be skewed when a texture is applied. +/// You could hide the additional colors by using the following: +/// http://rumorgames.com/hide-in-inspector/ +/// +/// + +namespace UnityEngine.UI.Extensions { + [ExecuteInEditMode] + [AddComponentMenu("UI/Extensions/Primitives/Cut Corners")] + public class UICornerCut : MaskableGraphic { + + public Vector2 cornerSize = new Vector2(16, 16); + + [Header("Corners to cut")] + public bool cutUL = true; + public bool cutUR; + public bool cutLL; + public bool cutLR; + + [Tooltip("Up-Down colors become Left-Right colors")] + public bool makeColumns = false; + + [Header("Color the cut bars differently")] + public bool useColorUp; +// [HideUnless("useColorUp")] + public Color32 colorUp = Color.blue; + + public bool useColorDown; +// [HideUnless("useColorDown")] + public Color32 colorDown = Color.green; + + protected override void OnPopulateMesh(VertexHelper vh) + { + var rect = rectTransform.rect; + var rectNew = rect; + + Color32 color32 = color; + bool up = cutUL | cutUR; + bool down = cutLL | cutLR; + bool left = cutLL | cutUL; + bool right = cutLR | cutUR; + bool any = up | down; + + if (any && cornerSize.sqrMagnitude > 0) + { + + //nibble off the sides + vh.Clear(); + if (left) + rectNew.xMin += cornerSize.x; + if (down) + rectNew.yMin += cornerSize.y; + if (up) + rectNew.yMax -= cornerSize.y; + if (right) + rectNew.xMax -= cornerSize.x; + + //add two squares to the main square + Vector2 ul, ur, ll, lr; + + if (makeColumns) + { + ul = new Vector2(rect.xMin, cutUL ? rectNew.yMax : rect.yMax); + ur = new Vector2(rect.xMax, cutUR ? rectNew.yMax : rect.yMax); + ll = new Vector2(rect.xMin, cutLL ? rectNew.yMin : rect.yMin); + lr = new Vector2(rect.xMax, cutLR ? rectNew.yMin : rect.yMin); + + if (left) + AddSquare( + ll, ul, + new Vector2(rectNew.xMin, rect.yMax), + new Vector2(rectNew.xMin, rect.yMin), + rect, useColorUp ? colorUp : color32, vh); + if (right) + AddSquare( + ur, lr, + new Vector2(rectNew.xMax, rect.yMin), + new Vector2(rectNew.xMax, rect.yMax), + rect, useColorDown ? colorDown : color32, vh); + } + else + { + ul = new Vector2(cutUL ? rectNew.xMin : rect.xMin, rect.yMax); + ur = new Vector2(cutUR ? rectNew.xMax : rect.xMax, rect.yMax); + ll = new Vector2(cutLL ? rectNew.xMin : rect.xMin, rect.yMin); + lr = new Vector2(cutLR ? rectNew.xMax : rect.xMax, rect.yMin); + if (down) + AddSquare( + lr, ll, + new Vector2(rect.xMin, rectNew.yMin), + new Vector2(rect.xMax, rectNew.yMin), + rect, useColorDown ? colorDown : color32, vh); + if (up) + AddSquare( + ul, ur, + new Vector2(rect.xMax, rectNew.yMax), + new Vector2(rect.xMin, rectNew.yMax), + rect, useColorUp ? colorUp : color32, vh); + } + + //center + if (makeColumns) + AddSquare(new Rect(rectNew.xMin, rect.yMin, rectNew.width, rect.height), rect, color32, vh); + else + AddSquare(new Rect(rect.xMin, rectNew.yMin, rect.width, rectNew.height), rect, color32, vh); + + } + } + + private static void AddSquare(Rect rect, Rect rectUV, Color32 color32, VertexHelper vh) { + int v0 = AddVert(rect.xMin, rect.yMin, rectUV, color32, vh); + int v1 = AddVert(rect.xMin, rect.yMax, rectUV, color32, vh); + int v2 = AddVert(rect.xMax, rect.yMax, rectUV, color32, vh); + int v3 = AddVert(rect.xMax, rect.yMin, rectUV, color32, vh); + + vh.AddTriangle(v0, v1, v2); + vh.AddTriangle(v2, v3, v0); + } + + private static void AddSquare(Vector2 a, Vector2 b, Vector2 c, Vector2 d, Rect rectUV, Color32 color32, VertexHelper vh) { + int v0 = AddVert(a.x, a.y, rectUV, color32, vh); + int v1 = AddVert(b.x, b.y, rectUV, color32, vh); + int v2 = AddVert(c.x, c.y, rectUV, color32, vh); + int v3 = AddVert(d.x, d.y, rectUV, color32, vh); + + vh.AddTriangle(v0, v1, v2); + vh.AddTriangle(v2, v3, v0); + } + + /// + /// Auto UV handler within the assigned area + /// + /// + /// + /// + /// + /// + private static int AddVert(float x, float y, Rect area, Color32 color32, VertexHelper vh) { + var uv = new Vector2( + Mathf.InverseLerp(area.xMin, area.xMax, x), + Mathf.InverseLerp(area.yMin, area.yMax, y) + ); + vh.AddVert(new Vector3(x, y), color32, uv); + return vh.currentVertCount - 1; + } + } } \ No newline at end of file diff --git a/Scripts/Primatives/UILineRenderer.cs b/Scripts/Primatives/UILineRenderer.cs index 6398d83..52be296 100644 --- a/Scripts/Primatives/UILineRenderer.cs +++ b/Scripts/Primatives/UILineRenderer.cs @@ -65,7 +65,7 @@ namespace UnityEngine.UI.Extensions } } - protected override void OnPopulateMesh(Mesh toFill) + protected override void OnPopulateMesh(VertexHelper vh) { // requires sets of quads if (Points == null || Points.Length < 2) @@ -107,8 +107,7 @@ namespace UnityEngine.UI.Extensions offsetY += Margin.y / 2f; } - toFill.Clear(); - var vbo = new VertexHelper(toFill); + vh.Clear(); Vector2 prevV1 = Vector2.zero; Vector2 prevV2 = Vector2.zero; @@ -144,24 +143,19 @@ namespace UnityEngine.UI.Extensions Vector2[] uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomCenter, uvTopCenter }; if (i > 1) - vbo.AddUIVertexQuad(SetVbo(new[] { prevV1, prevV2, v1, v2 }, uvs)); + vh.AddUIVertexQuad(SetVbo(new[] { prevV1, prevV2, v1, v2 }, uvs)); if (i == 1) uvs = new[] { uvTopLeft, uvBottomLeft, uvBottomCenter, uvTopCenter }; else if (i == TempPoints.Length - 1) uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomRight, uvTopRight }; - vbo.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs)); + vh.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs)); prevV1 = v3; prevV2 = v4; } - - if (vbo.currentVertCount > 3) - { - vbo.FillMesh(toFill); - } } protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs) diff --git a/Scripts/Primatives/UILineTextureRenderer.cs b/Scripts/Primatives/UILineTextureRenderer.cs index 8e6a101..6b4476f 100644 --- a/Scripts/Primatives/UILineTextureRenderer.cs +++ b/Scripts/Primatives/UILineTextureRenderer.cs @@ -66,7 +66,7 @@ namespace UnityEngine.UI.Extensions } } - protected override void OnPopulateMesh(Mesh toFill) + protected override void OnPopulateMesh(VertexHelper vh) { // requires sets of quads if (Points == null || Points.Length < 2) @@ -108,8 +108,7 @@ namespace UnityEngine.UI.Extensions offsetY += Margin.y / 2f; } - toFill.Clear(); - var vbo = new VertexHelper(toFill); + vh.Clear(); Vector2 prevV1 = Vector2.zero; Vector2 prevV2 = Vector2.zero; @@ -145,24 +144,19 @@ namespace UnityEngine.UI.Extensions Vector2[] uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomCenter, uvTopCenter }; if (i > 1) - vbo.AddUIVertexQuad(SetVbo(new[] { prevV1, prevV2, v1, v2 }, uvs)); + vh.AddUIVertexQuad(SetVbo(new[] { prevV1, prevV2, v1, v2 }, uvs)); if (i == 1) uvs = new[] { uvTopLeft, uvBottomLeft, uvBottomCenter, uvTopCenter }; else if (i == TempPoints.Length - 1) uvs = new[] { uvTopCenter, uvBottomCenter, uvBottomRight, uvTopRight }; - vbo.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs)); + vh.AddUIVertexQuad(SetVbo(new[] { v1, v2, v3, v4 }, uvs)); prevV1 = v3; prevV2 = v4; } - - if (vbo.currentVertCount > 3) - { - vbo.FillMesh(toFill); - } } protected UIVertex[] SetVbo(Vector2[] vertices, Vector2[] uvs)