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); } } } }
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); } } }
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; } } } } }