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