Beispiel #1
0
    private void BuildOcean(int seed)
    {
        int  halfMap     = mMapSize / 2;
        Tile currentTile = null;

        PerlinGenerator oceanGen     = new PerlinGenerator();
        int             oceanOctaves = 5;

        float[][] oceanNoise = oceanGen.Generate(seed, oceanOctaves, mMapSize);

        for (int y = 0; y < mMapSize; y++)
        {
            for (int x = 0; x < mMapSize; x++)
            {
                float height = oceanNoise[x][y];
                if (height < 0.35f)
                {
                    currentTile = mTiles[(int)eTileType.DeepWater];
                }
                else
                {
                    currentTile = mTiles[(int)eTileType.ShallowWater];
                }

                int        worldPosX = x - halfMap;
                int        worldPosY = y - halfMap;
                Vector3Int pos       = new Vector3Int(worldPosX, worldPosY, 0);

                mWaterTileMap.SetTile(pos, currentTile);
            }
        }
    }
    public IslandData Generate(WorldGenerator.IslandSize size, int seed, Vector3 position, float[][] moistureNoise, float[][] tempNoise, int numHeightLevels, bool fromTool = false)
    {
        if (_terrainSplats == null)
        {
            _terrainSplats = LoadPrototypes();
        }

        _id = IslandID++;
        int             realSize       = (int)size;
        PerlinGenerator islandNoiseGen = new PerlinGenerator();
        int             octaves        = 5;

        float[][] noise = islandNoiseGen.Generate(seed, octaves, realSize);
        float[,] heights = CreateHeightMap(noise, realSize, numHeightLevels);

        Vector3 posWithOffset = new Vector3(position.x - (realSize / 2f), position.y, position.z - (realSize / 2f));

        TerrainData tData = ApplyDataToTerrain(ref _currentTerrain, heights, realSize, numHeightLevels, fromTool);

        _currentTerrain.transform.position = posWithOffset;

        IslandData data = new IslandData(_id, realSize, posWithOffset, ref tData);

        //PopulateTiles(ref data, posWithOffset, moistureNoise, tempNoise, heights, realSize, ref tData);
        //DebugDrawGrid(posWithOffset, realSize, heights);

        PlaceDetails(heights, realSize, ref data, seed);

        return(data);
    }
    public GameObject Generate(WorldGenerator.IslandSize size, int seed, int numHeightLevels)
    {
        //fake climate data
        PerlinGenerator moistureNoiseGen = new PerlinGenerator();
        PerlinGenerator tempNoiseGen     = new PerlinGenerator();

        int octaves = 9;         // higher octaves (10+) create large biomes

        float[][] moistureNoise    = moistureNoiseGen.Generate(seed, octaves, (int)size);
        float[][] temperatureNoise = tempNoiseGen.Generate(seed, octaves, (int)size);

        // generate island
        Generate(size, seed, Vector3.zero, moistureNoise, temperatureNoise, numHeightLevels, true);
        return(_currentTerrain);
    }
Beispiel #4
0
    private void BuildTerrain(int seed)
    {
        int  halfMap     = mMapSize / 2;
        Tile currentTile = null;

        PerlinGenerator terrainGen     = new PerlinGenerator();
        int             terrainOctaves = 5;

        float[][] terrainNoise = terrainGen.Generate(seed, terrainOctaves, mMapSize);

        for (int y = 0; y < mMapSize; y++)
        {
            for (int x = 0; x < mMapSize; x++)
            {
                float height = terrainNoise[x][y];
                if (height < 0.45f)
                {
                    continue; // don't cover up water
                }
                else if (height < 0.55f)
                {
                    currentTile = mTiles[(int)eTileType.Sand];
                }
                else if (height < 0.725f)
                {
                    currentTile = mTiles[(int)eTileType.Grass];
                }
                else if (height < 0.775f)
                {
                    currentTile = mTiles[(int)eTileType.Rock];
                }
                else if (height < 0.865f)
                {
                    currentTile = mTiles[(int)eTileType.Mountain];
                }
                else
                {
                    currentTile = mTiles[(int)eTileType.Snow];
                }

                int        worldPosX = x - halfMap;
                int        worldPosY = y - halfMap;
                Vector3Int pos       = new Vector3Int(worldPosX, worldPosY, 0);

                mTerrainTileMap.SetTile(pos, currentTile);
            }
        }
    }
Beispiel #5
0
    private void GenerateWorld(int worldSeed)
    {
        GameObject      islGen    = (GameObject)Instantiate(_islandGenPrefab, Vector3.zero, Quaternion.identity);
        IslandGenerator generator = islGen.GetComponent <IslandGenerator>();

        System.Random worldPRNG = new System.Random(worldSeed);

        // biome/climate regions
        PerlinGenerator moistureNoiseGen = new PerlinGenerator();
        PerlinGenerator tempNoiseGen     = new PerlinGenerator();

        int octaves = 9;         // higher octaves (10+) create large biomes

        float[][] moistureNoise    = moistureNoiseGen.Generate(worldSeed, octaves, MaxWorldSize);
        float[][] temperatureNoise = tempNoiseGen.Generate(worldSeed, octaves, MaxWorldSize);

        for (int i = 0; i < NumberOfIslands; ++i)
        {
            MakeNewIsland(generator, worldPRNG.Next(), moistureNoise, temperatureNoise);
        }
    }
 void Generate()
 {
     perlinGenerator.Generate();
     gridSpawner.Generate();
 }
Beispiel #7
0
    private void BuildBiomes(int seed)
    {
        int  halfMap             = mMapSize / 2;
        Tile currentTerrtainTile = null;

        System.Random rand = new System.Random(seed);

        PerlinGenerator moistureGen  = new PerlinGenerator();
        int             moistOctaves = 8;

        float[][] moistureNoise = moistureGen.Generate(rand.Next(), moistOctaves, mMapSize);

        PerlinGenerator temperatureGen = new PerlinGenerator();
        int             tempOctaves    = 9;

        float[][] tempNoise = temperatureGen.Generate(rand.Next(), tempOctaves, mMapSize);

        PerlinGenerator vegetationGen = new PerlinGenerator();
        int             vegOctaves    = 1;

        float[][] vegNoise = vegetationGen.Generate(rand.Next(), vegOctaves, mMapSize);

        for (int y = 0; y < mMapSize; y++)
        {
            for (int x = 0; x < mMapSize; x++)
            {
                int        worldPosX           = x - halfMap;
                int        worldPosY           = y - halfMap;
                Vector3Int pos                 = new Vector3Int(worldPosX, worldPosY, 0);
                TileBase   existingWaterTile   = mWaterTileMap.GetTile(pos);
                TileBase   existingTerrainTile = mTerrainTileMap.GetTile(pos);

                Biome currentBiome = GetBiome(moistureNoise[x][y], tempNoise[x][y]);

                // don't modify certain tiles
                if ((existingTerrainTile == null && currentBiome.ID != eBiomeID.Tundra) ||
                    existingTerrainTile == mTiles[(int)eTileType.Rock] ||
                    existingTerrainTile == mTiles[(int)eTileType.Mountain] ||
                    existingTerrainTile == mTiles[(int)eTileType.Snow])
                {
                    continue;
                }

                // tile from biome
                currentTerrtainTile = currentBiome.PrimaryTerrainTile;
                if (currentBiome.ID == eBiomeID.Tundra)
                {
                    if (existingTerrainTile == null)
                    {
                        // over water
                        if (existingWaterTile == mTiles[(int)eTileType.ShallowWater])
                        {
                            currentTerrtainTile = currentBiome.SecondaryTerrainTile;
                        }
                        else
                        {
                            // deep water
                            currentTerrtainTile = null;
                        }
                    }
                }

                // vegetation from biome
                if (existingTerrainTile != null && vegNoise[x][y] > 1f - currentBiome.VegetationModifier)
                {
                    mPlantTileMap.SetTile(pos, currentBiome.PrimaryTreeTile);
                }

                mTerrainTileMap.SetTile(pos, currentTerrtainTile);
            }
        }
    }
    private void PlaceDetails(float[,] heights, int size, ref IslandData data, int seed)
    {
        System.Random prng            = new System.Random(seed);
        int           noiseSeed       = prng.Next();
        GameObject    detailContainer = new GameObject();

        detailContainer.name = "Details Container";
        detailContainer.transform.SetParent(_currentTerrain.transform);
        eBiome currentBiome = eBiome.Forest;

        PerlinGenerator detailNoiseGen = new PerlinGenerator();

        float[][] noise = detailNoiseGen.Generate(noiseSeed, 3, size);

        int detailID = -1;

        for (int i = 0; i < size; ++i)
        {
            for (int j = 0; j < size; ++j)
            {
                detailID = -1;
                bool  changeScale = false;
                float height      = heights[j, i];
                if (height > 0f)
                {
                    float value = noise[i][j];
                    //currentBiome = data.GetTile(i, j).Biome;

                    // slope
                    // need to map x/z to terrain space
                    float y_01 = (float)i / (float)size;
                    float x_01 = (float)j / (float)size;

                    // Calculate the steepness of the terrain
                    float steepness = data.Data.GetSteepness(y_01, x_01);

                    if (steepness < _maxVegetationSlope)
                    {
                        if (value > 0.85f)
                        {
                            detailID    = (int)eDetailType.Tree;
                            changeScale = true;

                            if (value > 0.95f)
                            {
                                // TODO set scale modifier here or something
                                //detail = _detailObjects[(int)DetailType.Tree_Pine_0];
                            }
                            else if (value > 0.9f)
                            {
                                //detail = _detailObjects[(int)DetailType.Tree_Pine_1];
                            }
                            else
                            {
                                //detail = _detailObjects[(int)DetailType.Tree_Pine_2];
                            }
                        }
                        else if (value > 0.75f)
                        {
                            detailID = (int)eDetailType.Flower;
                            //detail = _detailObjects[(int)DetailType.Flower_Bud];
                        }
                        else if (value > 0.68f)
                        {
                            detailID = (int)eDetailType.Grass;
                            //detail = _detailObjects[(int)DetailType.Grass];
                        }
                        else if (value > 0.65f)
                        {
                            detailID = (int)eDetailType.Fern;
                            //detail = _detailObjects[(int)DetailType.Fern];
                        }
                        else if (value < 0.025f)
                        {
                            detailID = (int)eDetailType.Rock;
                            //detail = _detailObjects[(int)DetailType.Rock_Medium];
                        }

                        //if (detail != null)
                        if (detailID > -1)
                        {
                            //GameObject detail = null;
                            GameObject detail    = GetDetailsForBiome(currentBiome)[detailID];
                            GameObject detailObj = (GameObject)Instantiate(detail, Vector3.zero, Quaternion.identity);

                            float angle = prng.Next(359) + 1;
                            detailObj.transform.Rotate(Vector3.up, angle);

                            if (changeScale)
                            {
                                float scaleFactor = (float)prng.NextDouble() + 0.25f;
                                detailObj.transform.localScale = new Vector3(scaleFactor, scaleFactor, scaleFactor);
                            }

                            detailObj.transform.SetParent(detailContainer.transform);

                            // need to place a tile here
                            PlaceTile(i, j, ref data, _currentTerrain.transform.position);

                            data.AddObjectToTile(detailObj, i, j);
                        }
                    }
                }
            }
        }
    }