Esempio n. 1
0
    private void FillQuad(List<UIVertex> vbo) {
        bool invert = growDirection == EnergyBarBase.GrowDirection.RadialCCW;

        var topLeftQuad = new Quad(invert);
        var topRightQuad = new Quad(invert);
        var bottomRightQuad = new Quad(invert);
        var bottomLeftQuad = new Quad(invert);

        topLeftQuad.anchor = Quad.Point.BottomRight;
        topRightQuad.anchor = Quad.Point.BottomLeft;
        bottomRightQuad.anchor = Quad.Point.TopLeft;
        bottomLeftQuad.anchor = Quad.Point.TopRight;

        var topLeftQuad2 = new Quad(topLeftQuad);
        var topRightQuad2 = new Quad(topRightQuad);
        var bottomRightQuad2 = new Quad(bottomRightQuad);
        var bottomLeftQuad2 = new Quad(bottomLeftQuad);

        // creating 8 quads instead of 8 because when using offset it may display one additional quad
        // and the simplest way is to create 8 quads and wrap around
        Quad[] ordered = new Quad[8];

        if (!invert) {
            ordered[0] = topRightQuad;
            ordered[1] = bottomRightQuad;
            ordered[2] = bottomLeftQuad;
            ordered[3] = topLeftQuad;
            ordered[4] = topRightQuad2;
            ordered[5] = bottomRightQuad2;
            ordered[6] = bottomLeftQuad2;
            ordered[7] = topLeftQuad2;
        } else {
            ordered[7] = topRightQuad2;
            ordered[6] = bottomRightQuad2;
            ordered[5] = bottomLeftQuad2;
            ordered[4] = topLeftQuad2;
            ordered[3] = topRightQuad;
            ordered[2] = bottomRightQuad;
            ordered[1] = bottomLeftQuad;
            ordered[0] = topLeftQuad;
        }

        float rOffset = radialFillOffset % 1;
        if (rOffset < 0) {
            rOffset += 1;
        }

        float fillValue = Mathf.Clamp01(this.fillValue) * radialFillLength;
        float fillStart = rOffset * 4;
        float fillEnd = (rOffset + fillValue) * 4;

        for (int i = Mathf.FloorToInt(fillStart); i < Mathf.CeilToInt(fillEnd); ++i) {
            Quad quad = ordered[i % 8];

            if (i < fillStart) {
                quad.offset = fillStart - i;
            } else {
                quad.offset = 0;
            }

            if (fillEnd > i + 1) {
                quad.progress = 1 - quad.offset;
            } else {
                quad.progress = fillEnd - i - quad.offset;
            }
        }

        float sx = 1;
        float sy = 1;
        float sx2 = sx / 2;
        float sy2 = sy / 2;

        // collect points anv uvs
        MadList<Vector2> points = new MadList<Vector2>(4);
        MadList<Vector2> uvs = new MadList<Vector2>(4);

        vbo.Clear();

        Vector4 outerUv = DataUtility.GetOuterUV(sprite);
        outerUv = FixUV(outerUv);

        topRightQuad.Points(sx2, sy, sx, sy2, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);

        topRightQuad2.Points(sx2, sy, sx, sy2, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);

        bottomRightQuad.Points(sx2, sy2, sx, 0, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);

        bottomRightQuad2.Points(sx2, sy2, sx, 0, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);


        bottomLeftQuad.Points(0, sy2, sx2, 0, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);

        bottomLeftQuad2.Points(0, sy2, sx2, 0, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);

        topLeftQuad.Points(0, sy, sx2, sy2, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);
        topLeftQuad2.Points(0, sy, sx2, sy2, points);
        PreparePointsAndUvs(points, uvs, outerUv);
        AddToVbo(vbo, points, uvs);
    }