private void UpdateMesh()
        {
            if (Segments > 0 && SegmentDetail > 0 && RadiusDetail > 0)
            {
                if (generatedMesh == null)
                {
                    generatedMesh = SgtHelper.CreateTempMesh("Ring Mesh (Generated)");

                    ApplyMesh();
                }

                var slices    = SegmentDetail + 1;
                var rings     = RadiusDetail + 1;
                var total     = slices * rings * 2;
                var positions = new Vector3[total];
                var coords1   = new Vector2[total];
                var coords2   = new Vector2[total];
                var colors    = new Color[total];
                var indices   = new int[SegmentDetail * RadiusDetail * 6];
                var yawStep   = (Mathf.PI * 2.0f) / Segments / SegmentDetail;
                var sliceStep = 1.0f / SegmentDetail;
                var ringStep  = 1.0f / RadiusDetail;

                for (var slice = 0; slice < slices; slice++)
                {
                    var a = yawStep * slice;
                    var x = Mathf.Sin(a);
                    var z = Mathf.Cos(a);

                    for (var ring = 0; ring < rings; ring++)
                    {
                        var v       = rings * slice + ring;
                        var slice01 = sliceStep * slice;
                        var ring01  = ringStep * ring;
                        var radius  = Mathf.Lerp(RadiusMin, RadiusMax, ring01);

                        positions[v] = new Vector3(x * radius, 0.0f, z * radius);
                        colors[v]    = new Color(1.0f, 1.0f, 1.0f, 0.0f);
                        coords1[v]   = new Vector2(ring01, slice01);
                        coords2[v]   = new Vector2(radius, slice01 * radius);
                    }
                }

                for (var slice = 0; slice < SegmentDetail; slice++)
                {
                    for (var ring = 0; ring < RadiusDetail; ring++)
                    {
                        var i  = (slice * RadiusDetail + ring) * 6;
                        var v0 = slice * rings + ring;
                        var v1 = v0 + rings;

                        indices[i + 0] = v0 + 0;
                        indices[i + 1] = v0 + 1;
                        indices[i + 2] = v1 + 0;
                        indices[i + 3] = v1 + 1;
                        indices[i + 4] = v1 + 0;
                        indices[i + 5] = v0 + 1;
                    }
                }

                generatedMesh.Clear(false);
                generatedMesh.vertices  = positions;
                generatedMesh.colors    = colors;
                generatedMesh.uv        = coords1;
                generatedMesh.uv2       = coords2;
                generatedMesh.triangles = indices;
                generatedMesh.RecalculateNormals();
                generatedMesh.RecalculateBounds();

                var bounds = generatedMesh.bounds;

                generatedMesh.bounds = SgtHelper.NewBoundsCenter(bounds, bounds.center + bounds.center.normalized * BoundsShift);
            }

            if (Shadow != null)
            {
                Shadow.RadiusMin = RadiusMin;
                Shadow.RadiusMax = RadiusMax;
            }

            ApplyMesh();
        }