void GenerateInEditor()
    {
        if (!Application.isPlaying)
        {
            finished = false;

            if (useRandomSeed)
            {
                seed = DateTime.Now.ToString();
            }

            Random.State oldState = Random.state;
            int          seedHash = seed.GetHashCode();
            Random.InitState(seedHash);

            for (int i = 0; i < randCol.Length; i++)
            {
                randCol[i] = Random.ColorHSV(0, 1, 0, 1, 0.5f, 1);
            }

            map = new LandMap(islandData.maxWidth, islandData.maxHeight);

            // Fill the map randomly with 0s and 1s based on percentage fill
            map.RandomFillMap(islandData.randomFillPercent);

            // Mold to the base shape
            if (islandData.baseShape)
            {
                map.makeBaseShape(islandData.baseShape);
            }

            // Smooth the map 5 times
            map.SmoothMap(5);

            meshGen = GetComponent <IslandMeshGenerator> ();
            vertDatabase.Clear();
            vertDatabase.tileSize = islandData.tileSize;

            // Find separated regions to form an island
            List <MapRegion> regions = map.GetRegions();

            // Create separate islands
            SeparateIslands(regions);

            clk.Start();
            vertDatabase.SetCoordDB();
            Debug.Log("Indexing takes " + clk.Elapsed() + " seconds.");

            if (shouldElevate)
            {
                int highestPeak = 0;
                foreach (IsleInfo island in islands)
                {
                    int peak = island.surfaceMeshDetail.localPeak;
                    highestPeak = peak > highestPeak ? peak : highestPeak;
                }
                foreach (IsleInfo island in islands)
                {
                    island.surfaceMeshDetail.NormalizeGradientMap(highestPeak);
                }

                vertDatabase.SetVerticesInlandPos(islands, islandData.mountainCurve);

                ElevationGenerator elevGen = GetComponent <ElevationGenerator> ();
                elevGen.elevateSurface(islands, islandData.altitude, islandData.mountainCurve, surfaceNoiseData, seedHash, 0, vertDatabase);    // elevate hills on the surface
                elevGen.elevateSurface(islands, -islandData.stalactite, islandData.bellyCurve, undersideNoiseData, seedHash, 2, vertDatabase);  // extend stakes at surface below
            }

            clk.Start();
            int zoneNum = DoClustering(regions, map.spots, vertDatabase, clusterAnalysis, seedHash);
            Debug.Log("Clustering takes " + clk.Elapsed() + " seconds.");

            // Find strategic locations in each region
            List <MapRegion> zones = map.GetZones(zoneNum);
            SpliceTerritory(zones);

            SetColliders();

            PlacementGenerator placement = GetComponent <PlacementGenerator> ();
            if (placement && decorateTerrain)
            {
                placement.GenerateTrees(islands);
                placement.GenerateSectorsContent(sectors, vertDatabase);
            }
            else if (placement)
            {
                //placement.GeneratePlacements (islands);
                placement.GenerateSectorsContent(sectors, vertDatabase);
            }

            if (flatShading)
            {
                foreach (IsleInfo island in islands)
                {
                    for (int surfaceIndex = 0; surfaceIndex < 3; surfaceIndex++)
                    {
                        MeshFilter mf           = island.GetSurfaceMesh(surfaceIndex);
                        float      oldVertCount = mf.sharedMesh.vertexCount;
                        mf.sharedMesh = FlatShade.DuplicateSharedVertex(mf.sharedMesh);
                        float newVertCount = mf.sharedMesh.vertexCount;
                        //Debug.Log (mf.transform.parent.name + "." + mf.transform.name + " new vertices are at " + (newVertCount / oldVertCount * 100) + "% with " + newVertCount + " verts.");
                    }
                }
            }

            Random.state = oldState;
        }
    }
    void PartitionIslands()
    {
        // Based on regions, create separate child GameObject for each island

        // Destroy all the previous islands
        islands.Clear();
        var childList = transform.Cast <Transform> ().ToList();

        foreach (Transform island in childList)
        {
#if UNITY_EDITOR
            ////////////////////////////////////////////////////////////  for debugging, onnly for in editor
            if (!Application.isPlaying)                             ////
            {
                UnityEditor.EditorApplication.delayCall += () =>    ////
                {                                                   ////
                    if (island)                                     ////
                    {
                        DestroyImmediate(island.gameObject);        ////
                    }                                               ////
                };                                                  ////
            }
            else                                                    ////
            ////////////////////////////////////////////////////////////
            {
#endif
            Destroy(island.gameObject);
#if UNITY_EDITOR
            ////////////////////////////////////////////////////////////
        }                                                                       ////
        ////////////////////////////////////////////////////////////
#endif
        }

        List <MapRegion> islandRegions = map.GetRegions();
        IslandMeshGenerator meshGen    = GetComponent <IslandMeshGenerator> ();

        int islandCount = 1;
        foreach (MapRegion region in islandRegions)
        {
            IsleInfo isle = new IsleInfo();
            isle.id = islandCount;

            // Create each isle game object
            isle.gameObject = new GameObject("Island " + isle.id);
            isle.gameObject.transform.parent        = transform;
            isle.gameObject.transform.localRotation = Quaternion.identity;
            isle.offset = region.GetCentre() * islandData.tileSize;
            isle.gameObject.transform.localPosition = isle.offset;

            // Child game object of isle to store surface
            GameObject surface = AddChildMesh("Surface", isle.gameObject.transform, withCollider);
            // Child game object of isle to store wall
            GameObject wall = AddChildMesh("Wall", isle.gameObject.transform);
            // Child game object of isle to store underside
            GameObject underside = AddChildMesh("Underside", isle.gameObject.transform);
            underside.transform.position += Vector3.up * -islandData.depth;

            List <Mesh> meshes = meshGen.GenerateMesh(region, isle, islandData.tileSize, islandData.depth);

            // Mesh for surface
            surface.GetComponent <MeshFilter> ().mesh       = meshes[0];
            surface.GetComponent <MeshRenderer> ().material = islandData.grassMaterial;

            // Mesh for wall
            wall.GetComponent <MeshFilter> ().mesh       = meshes[1];
            wall.GetComponent <MeshRenderer> ().material = islandData.wallMaterial;

            // Mesh for underside
            underside.GetComponent <MeshFilter> ().mesh       = meshes[2];
            underside.GetComponent <MeshRenderer> ().material = islandData.dirtMaterial;

            islands.Add(isle);
            islandCount++;
        }
    }