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++; } }