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(" ----------------------- ");
        }
    }
示例#4
0
    // 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;
        }
    }