Exemplo n.º 1
0
    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
        });
    }
Exemplo n.º 2
0
    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);
    }
Exemplo n.º 3
0
    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);
    }