Beispiel #1
0
    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;
            }
        }
    }