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); }
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); } } }
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(); }
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); } } } } } }