public static void CreateTerrainmap(ref TerrainType[,] terrainmap, float[,] matrix, LocalTerrainSettings terrainParam) { ushort height = (ushort)terrainmap.GetLength(0); ushort width = (ushort)terrainmap.GetLength(1); for (ushort y = 0; y < height; ++y) for (ushort x = 0; x < width; ++x) if (matrix[y, x] < terrainParam.Terrains[0].StartingHeight) terrainmap[y, x] |= terrainParam.BottommostTerrain.TerrainType; else if (matrix[y, x] >= terrainParam.Terrains[terrainParam.Terrains.Length - 1].StartingHeight) terrainmap[y, x] |= terrainParam.Terrains[terrainParam.Terrains.Length - 1].TerrainType; else for (byte i = 1; i < terrainParam.Terrains.Length; ++i) if (matrix[y, x] < terrainParam.Terrains[i].StartingHeight) { terrainmap[y, x] |= terrainParam.Terrains[i - 1].TerrainType; break; } }
public static void CreateVegetation(ref LocalMap map, LocalTerrainSettings terrainParam, float vegetationValue) { float?[,] forestMatrix = new float?[map.Height, map.Width]; HeighmapNeighboring hmNb; hmNb.Left = new float[map.Height]; hmNb.Top = new float[map.Width]; hmNb.Right = new float[map.Height]; hmNb.Bottom = new float[map.Width]; for (ushort i = 0; i < map.Height; ++i) hmNb.Right[i] = hmNb.Left[i] = vegetationValue; for (ushort i = 0; i < map.Width; ++i) hmNb.Bottom[i] = hmNb.Top[i] = vegetationValue; CreateHeightmap(ref forestMatrix, 1, hmNb);//TODO for (ushort y = 0; y < map.Height; ++y) for (ushort x = 0; x < map.Width; ++x) { LocalTerrainSettings.Terrain terrain = terrainParam.GetTerrain(map.TerrainMatrix[y, x]); if (terrain.PlantProbability > 0 && forestMatrix[y, x] > 0 && Random.value < terrain.PlantProbability * forestMatrix[y, x]) { Entity plant = GameObject.Instantiate(terrain.Trees[Random.Range(0, terrain.Trees.Length)]); plant.Pos = new U16Vec2(x, y); map.AddObject(plant); /*if (map.ForestMatrix[pos.Y, pos.X] < LocalMapParam.BushesForestValue) plant.GetComponent<SpriteRenderer>().sprite = LocalMapParam.BushSprites[Random.Range(0, LocalMapParam.BushSprites.Length)]; else plant.GetComponent<SpriteRenderer>().sprite = LocalMapParam.TreeSprites[Random.Range(0, LocalMapParam.TreeSprites.Length)];*/ } } }
//TODO Временно public static void CreateLocalMap(ref LocalMap map, LocalTerrainSettings settings, HeighmapNeighboring hmNb, float landscapeRoughness, float forest) { float?[,] buf = new float?[map.Height, map.Width]; WorldGenerator.CreateHeightmap(ref buf, landscapeRoughness, hmNb); float[,] buf2 = new float[map.Height, map.Width]; for (ushort y = 0; y < map.Height; ++y) for (ushort x = 0; x < map.Width; ++x) { buf2[y, x] = buf[y, x].Value; buf[y, x] = null; } WorldGenerator.CreateTerrainmap(ref map.TerrainMatrix, buf2, settings); WorldGenerator.CreateVegetation(ref map, settings, forest); }