Example #1
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            if (!gameObject.activeInHierarchy)
            {
                if (Debug.isDebugBuild && Application.isEditor)
                {
                    Debug.LogError("On populate mesh is called for disabled UI element");
                }

                return;
            }

            var rt       = rectTransform;
            var piv      = rt.pivot;
            var rectSize = rt.rect.size;


            vh.Clear();

            var vertex = UIVertex.simpleVert;


            var rctS = rectSize;

            float rectDiff = rctS.x - rctS.y;

            rctS = new Vector2(Mathf.Max(0, rectDiff / rctS.x), Mathf.Max(0, (-rectDiff) / rctS.y));

            var scaleToSided = rctS.x - rctS.y; // If x>0 - positive, else - negative


            if (feedPositionData)
            {
                var pos = Vector2.zero;

                switch (_positionDataType)
                {
                case PositionDataType.AtlasPosition:

                    var sp = sprite;

                    if (sp)
                    {
                        var tex = sp.texture;

                        if (tex)
                        {
                            var texturePixelSize = new Vector2(tex.width, tex.height);

                            var atlased = SpriteRect;

                            pos = atlased.center / texturePixelSize;

                            vertex.uv3 = atlased.size / texturePixelSize;
                        }
                    }

                    break;

                case PositionDataType.ScreenPosition:


                    pos = RectTransformUtility.WorldToScreenPoint(
                        IsOverlay ? null : (canvas ? canvas.worldCamera : null), rt.position);

                    pos.Scale(new Vector2(1f / Screen.width, 1f / Screen.height));

                    break;

                case PositionDataType.FadeOutPosition:

                    pos = faeOutUvPosition.min;

                    vertex.uv3 = faeOutUvPosition.max;

                    break;
                }

                vertex.uv2 = pos;
            }

            var corner1 = (Vector2.zero - piv) * rectSize;
            var corner2 = (Vector2.one - piv) * rectSize;

            vertex.color = color;

            vertex.uv0      = new Vector2(0, 0);
            vertex.uv1      = new Vector2(scaleToSided, GetCorner(0));
            vertex.position = new Vector2(corner1.x, corner1.y);
            vh.AddFull(vertex);

            vertex.uv0      = new Vector2(0, 1);
            vertex.uv1.y    = GetCorner(1);
            vertex.position = new Vector2(corner1.x, corner2.y);
            vh.AddFull(vertex);

            vertex.uv0      = new Vector2(1, 1);
            vertex.uv1.y    = GetCorner(2);
            vertex.position = new Vector2(corner2.x, corner2.y);
            vh.AddFull(vertex);

            vertex.uv0      = new Vector2(1, 0);
            vertex.uv1.y    = GetCorner(3);
            vertex.position = new Vector2(corner2.x, corner1.y);
            vh.AddFull(vertex);

            if (LinkedCorners)
            {
                //1  2
                //0  3
                vh.AddTriangle(0, 1, 2);
                vh.AddTriangle(2, 3, 0);
            }
            else
            {
                //1    6,9    2
                //7  13  14   8
                //4  12  15   11
                //0    5,10   3

                // TODO: Implement atlasing for Unlinked

                var cornMid = (corner1 + corner2) * 0.5f;

                vertex.uv1.y = GetCorner(0);
                vh.AddFull(vertex.Set(0, 0.5f, corner1, cornMid)); //4
                vh.AddFull(vertex.Set(0.5f, 0, cornMid, corner1)); //5

                vertex.uv1.y = GetCorner(1);
                vh.AddFull(vertex.Set(0.5f, 1, cornMid, corner2)); //6
                vh.AddFull(vertex.Set(0, 0.5f, corner1, cornMid)); //7

                vertex.uv1.y = GetCorner(2);
                vh.AddFull(vertex.Set(1, 0.5f, corner2, cornMid)); //8
                vh.AddFull(vertex.Set(0.5f, 1, cornMid, corner2)); //9

                vertex.uv1.y = GetCorner(3);
                vh.AddFull(vertex.Set(0.5f, 0, cornMid, corner1)); //10
                vh.AddFull(vertex.Set(1, 0.5f, corner2, cornMid)); //11

                vertex.uv1.y = GetCorner(0);
                vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //12

                vertex.uv1.y = GetCorner(1);
                vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //13

                vertex.uv1.y = GetCorner(2);
                vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //14

                vertex.uv1.y = GetCorner(3);
                vh.AddFull(vertex.Set(0.5f, 0.5f, cornMid, cornMid)); //15

                vh.AddTriangle(0, 4, 5);
                vh.AddTriangle(1, 6, 7);
                vh.AddTriangle(2, 8, 9);
                vh.AddTriangle(3, 10, 11);

                vh.AddTriangle(12, 5, 4);
                vh.AddTriangle(13, 7, 6);
                vh.AddTriangle(14, 9, 8);
                vh.AddTriangle(15, 11, 10);
            }
        }