private IEnumerator SubdivideSegment(SegmentData d) { // Find the 5 points that split this quad into 4 more. var top = (d.topLeft + d.topRight) / 2f; var right = (d.topRight + d.bottomRight) / 2f; var bottom = (d.bottomLeft + d.bottomRight) / 2f; var left = (d.topLeft + d.bottomLeft) / 2f; var mid = (d.topLeft + d.bottomRight) / 2f; // Define the 4 new quads using existing and new points. var segCorners = new Vector3[][] { new Vector3[] { d.topLeft, top, left, mid }, new Vector3[] { top, d.topRight, mid, right }, new Vector3[] { left, mid, d.bottomLeft, bottom }, new Vector3[] { mid, right, bottom, d.bottomRight } }; var uCenter = new Vector2((d.uvMin.x + d.uvMax.x) / 2f, (d.uvMin.y + d.uvMax.y) / 2f); var uTop = new Vector2(uCenter.x, d.uvMin.y); var uLeft = new Vector2(d.uvMin.x, uCenter.y); var uRight = new Vector2(d.uvMax.x, uLeft.y); var uBottom = new Vector2(uCenter.x, d.uvMax.y); var uvCorners = new Vector2[][] { new Vector2[] { d.uvMin, uCenter }, new Vector2[] { uTop, uRight }, new Vector2[] { uLeft, uBottom }, new Vector2[] { uCenter, d.uvMax } }; for (var i = 0; i < segCorners.Length; i++) { var d2 = d.subdivCopy(segCorners[i], uvCorners[i]); var go = new GameObject(); var tr = go.GetComponent <Transform>(); tr.parent = transform; tr.localPosition = Vector3.zero; tr.localRotation = Quaternion.identity; tr.localScale = new Vector3(1f, 1f, 1f); var seg = go.AddComponent <PlanetTerrainSegment>(); segments.Add(seg); if (Application.isPlaying) { yield return(StartCoroutine(seg.Generate(d2))); } else { IEnumerator e = seg.Generate(d2); while (e.MoveNext()) { ; } } } for (var i = 0; i < segments.Count; i++) { segments[i].Enable(); } if (p.minSubdivisions - d.subdivision <= 0) { if (mr.enabled) { mr.enabled = false; PTHelpers.segmentCount--; } if (mc != null) { mc.enabled = false; } } }