public void UpdateMesh()
    {
        List <BalloonPoint> points = balloon.GetPoints();

        int pointsCount = points.Count;

        if (pointsCount < 2)
        {
            return;
        }

        #region Vertices
        Vector3[] vertices = new Vector3[(pointsCount) * (sides + 1)];
        Color[]   colours  = new Color[vertices.Length];

        BalloonPoint point;

        for (int seg = 0; seg < pointsCount; seg++)
        {
            point = points[seg];

            float radius = point.transform.localScale.x;

            Vector3 position = points[seg].transform.position;

            for (int side = 0; side <= sides; side++)
            {
                int currSide = side == sides ? 0 : side;

                float angle = (float)currSide / sides * 360f;

                Vector3 direction = Quaternion.AngleAxis(angle, point.transform.forward) * point.transform.up;

                Vector3 vertex = position + direction * radius;

                vertices[side + seg * (sides + 1)] = balloon.transform.InverseTransformPoint(vertex);

                colours[side + seg * (sides + 1)] = point.Colour;
            }
        }
        #endregion

        #region Triangles
        int   facesNo     = vertices.Length;
        int   trianglesNo = facesNo * 2;
        int   indexes     = trianglesNo * 3;
        int[] triangles   = new int[indexes];

        int i = 0;
        for (int seg = 0; seg < pointsCount - 1; seg++)
        {
            for (int side = 0; side <= sides - 1; side++)
            {
                int current = side + seg * (sides + 1);

                int next = side + (seg + 1) * (sides + 1);

                if (i < triangles.Length - 6)
                {
                    triangles[i++] = current;
                    triangles[i++] = next;
                    triangles[i++] = next + 1;

                    triangles[i++] = current;
                    triangles[i++] = next + 1;
                    triangles[i++] = current + 1;
                }
            }
        }
        #endregion

        mesh.vertices  = vertices;
        mesh.colors    = colours;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
    }