ArcMeshData MakeMeshData() { ArcMeshData top = MakeArcMeshData(false); ArcMeshData bottom = MakeArcMeshData(true); for (int i = 0; i < bottom.triangles.Length; i++) { bottom.triangles[i] += top.vertices.Length; } List <int> tris = new List <int>(); tris.AddRange(top.triangles); tris.AddRange(bottom.triangles); int[] _tris = tris.ToArray(); List <Vector2> verts = new List <Vector2>(); verts.AddRange(top.vertices); verts.AddRange(bottom.vertices); Vector2[] _verts = verts.ToArray(); return(new ArcMeshData() { vertices = _verts, triangles = _tris }); }
ArcMeshData MakeArcMeshData(bool reverse) { int vertexCount = arcSides * 2; int arcVertex = arcSides * 2 + 2; Vector2[] _vertices = new Vector2[arcVertex]; int[] _triangles = new int[vertexCount * 3]; float angleStep = (startAngleDeg - endAngleDeg) / (float)arcSides; int steps = arcSides + 1; var offset = new Vector2(arcRadius * svgPixelsPerUnit / 2, arcRadius * svgPixelsPerUnit / 2); for (int i = 0; i < steps; i++) { float angle = endAngleDeg + i * angleStep; Vector2 dir = GetAngleVectorByDegree(angle); var correctedRadius = arcRadius * svgPixelsPerUnit / 2; var correctedMaskRadius = maskRadius * svgPixelsPerUnit / 2; Vector2 outer = dir * correctedRadius; Vector2 inner = outer - dir * (correctedMaskRadius > correctedRadius ? 0 : correctedRadius - correctedMaskRadius); _vertices[i * 2] = inner + offset; _vertices[i * 2 + 1] = outer + offset; int ti = i * 6; //triangle index { if (i < arcSides) { if (reverse) { _triangles[ti] = i * 2 + 1; _triangles[ti + 1] = i * 2 + 0; _triangles[ti + 2] = i * 2 + 2; _triangles[ti + 3] = i * 2 + 3; _triangles[ti + 4] = i * 2 + 1; _triangles[ti + 5] = i * 2 + 2; } else { _triangles[ti] = i * 2 + 1; _triangles[ti + 1] = i * 2 + 2; _triangles[ti + 2] = i * 2 + 0; _triangles[ti + 3] = i * 2 + 3; _triangles[ti + 4] = i * 2 + 2; _triangles[ti + 5] = i * 2 + 1; } } } } ArcMeshData info = new ArcMeshData(); info.triangles = _triangles; info.vertices = _vertices; return(info); }
Sprite BuildArcSprite() { ArcMeshData arcMeshData = MakeMeshData(); var pivot = Vector2.one / 2; Texture2D texture = null; var correctedRadius = arcRadius * svgPixelsPerUnit / 2; var rect = new Rect(-correctedRadius, -correctedRadius, correctedRadius * 2, correctedRadius * 2); var spriteCreateMethod = typeof(Sprite).GetMethod("Create", BindingFlags.Static | BindingFlags.NonPublic, Type.DefaultBinder, new Type[] { typeof(Rect), typeof(Vector2), typeof(float), typeof(Texture2D) }, null); var sprite = spriteCreateMethod.Invoke(null, new object[] { rect, pivot, svgPixelsPerUnit, texture }) as Sprite; sprite.OverrideGeometry(arcMeshData.vertices.ToArray(), arcMeshData.triangles.Select(t => (UInt16)t).ToArray()); var color32 = Enumerable.Repeat(color, arcMeshData.vertices.Length).Select(c => (Color32)c); using (var nativeColors = new NativeArray <Color32>(color32.ToArray(), Allocator.Temp)) SpriteDataAccessExtensions.SetVertexAttribute <Color32>(sprite, VertexAttribute.Color, nativeColors); return(sprite); }