Ejemplo n.º 1
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            LeanGuiSprite.UpdateCache();

            vh.Clear();

            var rect = rectTransform.rect;

            positions.Clear();

            if (points != null)
            {
                for (var i = 0; i < points.Count; i++)
                {
                    var p = points[i];
                    var x = rect.xMin + rect.width * p.z + p.x;
                    var y = rect.yMin + rect.height * p.w + p.y;

                    positions.Add(new Vector2(x, y));
                }
            }

            if (CalculateNormals() == true)
            {
                vert.color = color;
                vert.uv0   = LeanGuiSprite.CachedSolid;

                if (thickness < 0.0f)
                {
                    if (blur > 0.0f)
                    {
                        WriteVertexRing(vh, -blur); WriteTriangleDisc(vh);

                        vert.uv0 = LeanGuiSprite.CachedClear;

                        WriteVertexRing(vh, blur); WriteTriangleRing(vh, 0, LeanTriangulation.Points.Count);
                    }
                    else
                    {
                        WriteVertexRing(vh, 0.0f); WriteTriangleDisc(vh);
                    }
                }
                else if (thickness > 0.0f)
                {
                    if (blur > 0.0f)
                    {
                        WriteVertexRing(vh, blur - thickness);              // Inner
                        WriteVertexRing(vh, -blur);                         // Outer

                        vert.uv0 = LeanGuiSprite.CachedClear;

                        WriteVertexRing(vh, blur);                         // Outer Blur Edge
                        WriteVertexRing(vh, -blur - thickness);            // Inner Blur Edge

                        WriteTriangleRing(vh, 0, positions.Count);
                        WriteTriangleRing(vh, positions.Count, positions.Count * 2);
                        WriteTriangleRing(vh, positions.Count * 3, 0);
                    }
                    else
                    {
                        WriteVertexRing(vh, -thickness);
                        WriteVertexRing(vh, 0.0f);

                        WriteTriangleRing(vh, 0, positions.Count);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        protected override void OnPopulateMesh(VertexHelper vh)
        {
            LeanGuiSprite.UpdateCache();

            vh.Clear();

            var rect   = InflateRect(rectTransform.rect);
            var limit  = Mathf.Min(rect.width / 2.0f, rect.height / 2.0f);
            var center = rect.center;
            var radTL  = Mathf.Max(0.0f, radiusTL >= 0.0f ? radiusTL : radius);
            var radTR  = Mathf.Max(0.0f, radiusTR >= 0.0f ? radiusTR : radius);
            var radBR  = Mathf.Max(0.0f, radiusBR >= 0.0f ? radiusBR : radius);
            var radBL  = Mathf.Max(0.0f, radiusBL >= 0.0f ? radiusBL : radius);

            var poiTL = CalculatePoints(radTL, detailTL);
            var poiTR = CalculatePoints(radTR, detailTR);
            var poiBR = CalculatePoints(radBR, detailBR);
            var poiBL = CalculatePoints(radBL, detailBL);

            Shift(rect.width, ref radTL, ref radTR);
            Shift(rect.width, ref radBL, ref radBR);
            Shift(rect.height, ref radBL, ref radTL);
            Shift(rect.height, ref radBR, ref radTR);

            corners[0].Radius = radTL;
            corners[1].Radius = radTR;
            corners[2].Radius = radBR;
            corners[3].Radius = radBL;

            vert.color = color;
            vert.uv0   = LeanGuiSprite.CachedSolid;

            pointCount = 0;

            SetCorner(0, poiTL, Mathf.PI * 1.5f);
            SetCorner(1, poiTR, Mathf.PI * 0.0f);
            SetCorner(2, poiBR, Mathf.PI * 0.5f);
            SetCorner(3, poiBL, Mathf.PI * 1.0f);

            if (thickness < 0.0f)
            {
                if (blur > 0.0f)
                {
                    Overflow(blur, limit);

                    WriteAll(vh, rect, -blur, limit);

                    vert.uv0 = LeanGuiSprite.CachedClear;

                    WriteAll(vh, rect, blur, float.PositiveInfinity);

                    WriteTriangleDisc(vh);

                    WriteTriangleRing(vh, 0, pointCount);
                }
                else
                {
                    WriteAll(vh, rect, 0.0f, float.PositiveInfinity);

                    WriteTriangleDisc(vh);
                }
            }
            else if (thickness > 0.0f)
            {
                if (blur > 0.0f)
                {
                    var blur2 = Mathf.Min(blur, thickness * 0.5f);

                    WriteAll(vh, rect, blur2 - thickness, limit);                     // Inner
                    WriteAll(vh, rect, -blur2, float.PositiveInfinity);               // Outer

                    vert.uv0 = LeanGuiSprite.CachedClear;

                    WriteAll(vh, rect, blur, float.PositiveInfinity);                 // Outer Blur Edge
                    WriteAll(vh, rect, -blur - thickness, limit);                     // Inner Blur Edge

                    WriteTriangleRing(vh, 0, pointCount);
                    WriteTriangleRing(vh, pointCount, pointCount * 2);
                    WriteTriangleRing(vh, pointCount * 3, 0);
                }
                else
                {
                    WriteAll(vh, rect, -thickness, limit);
                    WriteAll(vh, rect, 0.0f, float.PositiveInfinity);

                    WriteTriangleRing(vh, 0, pointCount);
                }
            }
        }
Ejemplo n.º 3
0
        protected override void OnPopulateMesh(VertexHelper vertexHelper)
        {
            LeanGuiSprite.UpdateCache();

            var rect = rectTransform.rect;

            vh     = vertexHelper;
            size   = rect.size * 0.5f;
            center = rect.center;

            vh.Clear();

            if (detail > 2)
            {
                innerVert.color = color;
                innerVert.uv0   = LeanGuiSprite.CachedSolid;

                outerVert.color = color;
                outerVert.uv0   = LeanGuiSprite.CachedClear;

                var angleCur = 0.0f;
                var angleMax = Mathf.Abs(Mathf.PI * 2.0f * fill);
                var angleInc = Mathf.PI * 2.0f / detail;
                var sign     = Mathf.Sign(fill);
                var index    = 0;

                if (thickness < 0.0f)
                {
                    if (blur > 0.0f)
                    {
                        innerVert.position = center; vh.AddVert(innerVert);

                        WriteLineA(angleCur);

                        while (angleCur < angleMax)
                        {
                            var nextAngle = Mathf.Min(angleCur + angleInc, angleMax);

                            WriteLineA(nextAngle * sign);

                            AddTriangle(0, index + 1, index + 3);

                            AddTriangle(index + 1, index + 2, index + 3);
                            AddTriangle(index + 4, index + 3, index + 2);

                            angleCur = nextAngle; index += 2;
                        }
                    }
                    else
                    {
                        innerVert.position = center; vh.AddVert(innerVert);

                        WriteLineB(angleCur);

                        while (angleCur < angleMax)
                        {
                            var nextAngle = Mathf.Min(angleCur + angleInc, angleMax);

                            WriteLineB(nextAngle * sign);

                            AddTriangle(0, index + 1, index + 2);

                            angleCur = nextAngle; index += 1;
                        }
                    }
                }
                else
                {
                    if (blur > 0.0f)
                    {
                        WriteLineC(angleCur);

                        while (angleCur < angleMax)
                        {
                            var nextAngle = Mathf.Min(angleCur + angleInc, angleMax);

                            WriteLineC(nextAngle * sign);

                            AddTriangle(index + 0, index + 1, index + 4);
                            AddTriangle(index + 5, index + 4, index + 1);

                            AddTriangle(index + 1, index + 2, index + 5);
                            AddTriangle(index + 6, index + 5, index + 2);

                            AddTriangle(index + 2, index + 3, index + 6);
                            AddTriangle(index + 7, index + 6, index + 3);

                            angleCur = nextAngle; index += 4;
                        }
                    }
                    else
                    {
                        WriteLineD(angleCur);

                        while (angleCur < angleMax)
                        {
                            var nextAngle = Mathf.Min(angleCur + angleInc, angleMax);

                            WriteLineD(nextAngle * sign);

                            AddTriangle(index + 0, index + 1, index + 2);
                            AddTriangle(index + 3, index + 2, index + 1);

                            angleCur = nextAngle; index += 2;
                        }
                    }
                }
            }
        }