void Update() { if (!readyPlaying && generator.IsDone()) { LoggerTool.Post("Generated with " + clock.Elapsed() + " seconds."); readyPlaying = true; if (overviewCam) { overviewCam.SetActive(false); } curtain.FadeToColour(Color.clear); } }
IEnumerator LoadGameLevelWithProgress(string levelName) { yield return(new WaitForSecondsRealtime(0.5f)); loadingOperation = SceneManager.LoadSceneAsync(levelName); loadingOperation.allowSceneActivation = false; while (!loadingOperation.isDone) { LoggerTool.Post("Loading progress " + (loadingOperation.progress * 100) + "%"); if (loadingOperation.progress >= 0.9f) { loadingOperation.allowSceneActivation = true; LoggerTool.Post("Loaded level [" + levelName + "] with " + clock.Elapsed() + " seconds."); } yield return(null); } }
void Update() { if (Input.GetButtonDown("Fire1")) { LoggerTool.Post("Start generating island from a click"); bool prevRandSet = islandGenerator.useRandomSeed; islandGenerator.useRandomSeed = useRandomSeed; startedRecording = true; clock.Start(); islandGenerator.GenerateIsland(); islandGenerator.useRandomSeed = prevRandSet; } if (startedRecording && islandGenerator.IsDone()) { startedRecording = false; LoggerTool.Post("Generated with " + clock.Elapsed() + " seconds."); LoggerTool.Post(" ----------------------- "); } }
// Called by LandMap.GetZones (), returns number of subregions public int ClusterLocationsKMedoidsPAM(MapPoint[,] points) { // K-medoids cluster algorithm to separate locations in the regions ExecutionTimer clock = new ExecutionTimer(); int regionId = 0; foreach (MapRegion region in regions) { int k = InitializeNumOfK(region.turf.Count); Debug.Log(k + " medoid(s)"); Coord[] medoids = new Coord[k]; bool[] isMedoid = new bool[region.turf.Count]; for (int i = 0; i < k; i++) { // Assign medoid to first k data points medoids[i] = region.turf[i * (region.turf.Count / k)]; isMedoid[i * (region.turf.Count / k)] = true; } // Loop until converged int changes = -1; int iter = 0; float cost; while (changes != 0 && iter < 10) { clock.Start(); changes = 0; cost = 0; foreach (Coord tile in region.turf) { float distanceToMedoid = float.MaxValue; for (int i = 0; i < k; i++) { float currDistToMedoid = tile.ManhattanDist(medoids[i]); if (currDistToMedoid < distanceToMedoid) { distanceToMedoid = currDistToMedoid; points[tile.x, tile.y].areaValue = regionId + i; } } cost += distanceToMedoid; } for (int medoidIndex = 0; medoidIndex < k; medoidIndex++) { //float tt = clock.Elapsed (); float tSum = 0; Coord oldMedoid = medoids[medoidIndex]; for (int i = 0; i < region.turf.Count; i++) { Coord tile = region.turf[i]; if (tile != oldMedoid) { float newCost = 0; medoids[medoidIndex] = tile; float tCost = clock.Elapsed(); region.turf.Sum(til => til.ManhattanDist(medoids[points[til.x, til.y].areaValue - regionId])); /*foreach (Coord t in region.turf) { * newCost += t.ManhattanDist (medoids[points[t.x, t.y].areaValue - regionId]); * }*/ tSum += clock.Elapsed() - tCost; if (newCost < cost) { cost = newCost; changes++; } else { medoids[medoidIndex] = oldMedoid; } } } //Debug.Log ("Medoid " + medoidIndex + " takes " + (clock.Elapsed () - tt) + " seconds. Sum cost calc time = " + tSum); } iter++; //Debug.Log ("Iteration run with " + clock.Elapsed () + " seconds."); } Debug.Log("Iteration: " + iter); regionId += k; } return(regionId); }
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; } }