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