public SetTileDataNoHeight ( IntVector3 p, TileData data ) : void | ||
p | IntVector3 | |
data | TileData | |
리턴 | void |
public static TerrainData CreateBallMap(IntSize3 size, int innerSide = 0) { var map = new TerrainData(size); int side = MyMath.Min(size.Width, size.Height, size.Depth); int r = side / 2 - 1; int ir = innerSide / 2 - 1; Parallel.For(0, size.Depth, z => { for (int y = 0; y < size.Height; ++y) { for (int x = 0; x < size.Width; ++x) { var pr = Math.Sqrt((x - r) * (x - r) + (y - r) * (y - r) + (z - r) * (z - r)); var p = new IntVector3(x, y, z); if (pr < r && pr >= ir) { map.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Granite)); } else { map.SetTileDataNoHeight(p, TileData.EmptyTileData); } } } }); map.RescanLevelMap(); return(map); }
public static TerrainData CreateBallMap(IntSize3 size, int innerSide = 0) { var map = new TerrainData(size); int side = MyMath.Min(size.Width, size.Height, size.Depth); int r = side / 2 - 1; int ir = innerSide / 2 - 1; Parallel.For(0, size.Depth, z => { for (int y = 0; y < size.Height; ++y) for (int x = 0; x < size.Width; ++x) { var pr = Math.Sqrt((x - r) * (x - r) + (y - r) * (y - r) + (z - r) * (z - r)); var p = new IntVector3(x, y, z); if (pr < r && pr >= ir) map.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Granite)); else map.SetTileDataNoHeight(p, TileData.EmptyTileData); } }); map.RescanLevelMap(); return map; }
public static TerrainData CreateCubeMap(IntSize3 size, int margin) { var map = new TerrainData(size); Parallel.For(0, size.Depth, z => { for (int y = 0; y < size.Height; ++y) { for (int x = 0; x < size.Width; ++x) { var p = new IntVector3(x, y, z); if (x < margin || y < margin || z < margin || x >= size.Width - margin || y >= size.Height - margin || z >= size.Depth - margin) { map.SetTileDataNoHeight(p, TileData.EmptyTileData); } else { map.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Granite)); } } } }); map.RescanLevelMap(); return(map); }
static void FillFromNoiseMap(TerrainData terrainData, SharpNoise.NoiseMap noiseMap) { var max = noiseMap.Data.Max(); var min = noiseMap.Data.Min(); Parallel.For(0, noiseMap.Data.Length, i => { var v = noiseMap.Data[i]; // [-1 .. 1] v -= min; v /= (max - min); // [0 .. 1] v *= terrainData.Depth * 8 / 10; v += terrainData.Depth * 2 / 10; noiseMap.Data[i] = v; }); Parallel.For(0, terrainData.Height, y => { for (int x = 0; x < terrainData.Width; ++x) { var v = noiseMap[x, y]; int iv = (int)v; for (int z = terrainData.Depth - 1; z >= 0; --z) { var p = new IntVector3(x, y, z); /* above ground */ if (z > iv) { terrainData.SetTileDataNoHeight(p, TileData.EmptyTileData); } /* surface */ else if (z == iv) { terrainData.SetTileDataNoHeight(p, TileData.EmptyTileData); } /* underground */ else if (z < iv) { terrainData.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Granite)); } else { throw new Exception(); } } } }); }
public static TerrainData CreateCubeMap(IntSize3 size, int margin) { var map = new TerrainData(size); Parallel.For(0, size.Depth, z => { for (int y = 0; y < size.Height; ++y) for (int x = 0; x < size.Width; ++x) { var p = new IntVector3(x, y, z); if (x < margin || y < margin || z < margin || x >= size.Width - margin || y >= size.Height - margin || z >= size.Depth - margin) map.SetTileDataNoHeight(p, TileData.EmptyTileData); else map.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Granite)); } }); map.RescanLevelMap(); return map; }
public static void CreateBaseMinerals(TerrainData terrain, Random random, double xk, double yk) { int width = terrain.Width; int height = terrain.Height; int depth = terrain.Depth; var rockMaterials = Materials.GetMaterials(MaterialCategory.Rock).ToArray(); var layers = new MaterialID[20]; { int rep = 0; MaterialID mat = MaterialID.Undefined; for (int z = 0; z < layers.Length; ++z) { if (rep == 0) { rep = random.Next(4) + 1; mat = rockMaterials[random.Next(rockMaterials.Length - 1)].ID; } layers[z] = mat; rep--; } } Parallel.For(0, height, y => { for (int x = 0; x < width; ++x) { int surface = terrain.GetSurfaceLevel(x, y); for (int z = 0; z < surface; ++z) { var p = new IntVector3(x, y, z); int _z = MyMath.Round(z + x * xk + y * yk); _z = _z % layers.Length; if (_z < 0) { _z += layers.Length; } terrain.SetTileDataNoHeight(p, TileData.GetNaturalWall(layers[_z])); } } }); }
public static void CreateBaseMinerals(TerrainData terrain, Random random, double xk, double yk) { int width = terrain.Width; int height = terrain.Height; int depth = terrain.Depth; var rockMaterials = Materials.GetMaterials(MaterialCategory.Rock).ToArray(); var layers = new MaterialID[20]; { int rep = 0; MaterialID mat = MaterialID.Undefined; for (int z = 0; z < layers.Length; ++z) { if (rep == 0) { rep = random.Next(4) + 1; mat = rockMaterials[random.Next(rockMaterials.Length - 1)].ID; } layers[z] = mat; rep--; } } Parallel.For(0, height, y => { for (int x = 0; x < width; ++x) { int surface = terrain.GetSurfaceLevel(x, y); for (int z = 0; z < surface; ++z) { var p = new IntVector3(x, y, z); int _z = MyMath.Round(z + x * xk + y * yk); _z = _z % layers.Length; if (_z < 0) _z += layers.Length; terrain.SetTileDataNoHeight(p, TileData.GetNaturalWall(layers[_z])); } } }); }
public static void CreateSoil(TerrainData data, int soilLimit) { int w = data.Width; int h = data.Height; for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { int z = data.GetSurfaceLevel(x, y); if (z < soilLimit) { var p = new IntVector3(x, y, z - 1); data.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Loam)); } } } }
static bool CreateOre(TerrainData terrain, IntVector3 p, MaterialID oreMaterialID) { if (!terrain.Contains(p)) { return(false); } var td = terrain.GetTileData(p); if (td.ID != TileID.NaturalWall) { return(false); } if (Materials.GetMaterial(td.MaterialID).Category != MaterialCategory.Rock) { return(false); } td.SecondaryMaterialID = oreMaterialID; terrain.SetTileDataNoHeight(p, td); return(true); }
public static void CreateVegetation(TerrainData terrain, Random random, int vegetationLimit) { var grassMaterials = Materials.GetMaterials(MaterialCategory.Grass).ToArray(); var woodMaterials = Materials.GetMaterials(MaterialCategory.Wood).ToArray(); var berryMaterials = Materials.GetMaterials(MaterialCategory.Berry).ToArray(); int baseSeed = random.Next(); if (baseSeed == 0) { baseSeed = 1; } terrain.Size.Plane.Range().AsParallel().ForAll(p2d => { int z = terrain.GetSurfaceLevel(p2d); var p = new IntVector3(p2d, z); if (z >= vegetationLimit) { return; } var td = terrain.GetTileData(p); if (td.WaterLevel > 0) { return; } if (terrain.GetMaterial(p.Down).Category != MaterialCategory.Soil) { return; } var r = new MWCRandom(p, baseSeed); int v = r.Next(100); if (v >= 95) { td.ID = TileID.Sapling; td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID; } else if (v >= 90) { td.ID = TileID.Tree; td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID; } else if (v >= 80) { td.ID = TileID.Shrub; td.MaterialID = berryMaterials[r.Next(berryMaterials.Length)].ID; } else { td.ID = TileID.Grass; td.MaterialID = grassMaterials[r.Next(grassMaterials.Length)].ID; } terrain.SetTileDataNoHeight(p, td); }); }
static void FillFromNoiseMap(TerrainData terrainData, SharpNoise.NoiseMap noiseMap) { var max = noiseMap.Data.Max(); var min = noiseMap.Data.Min(); Parallel.For(0, noiseMap.Data.Length, i => { var v = noiseMap.Data[i]; // [-1 .. 1] v -= min; v /= (max - min); // [0 .. 1] v *= terrainData.Depth * 8 / 10; v += terrainData.Depth * 2 / 10; noiseMap.Data[i] = v; }); Parallel.For(0, terrainData.Height, y => { for (int x = 0; x < terrainData.Width; ++x) { var v = noiseMap[x, y]; int iv = (int)v; for (int z = terrainData.Depth - 1; z >= 0; --z) { var p = new IntVector3(x, y, z); /* above ground */ if (z > iv) { terrainData.SetTileDataNoHeight(p, TileData.EmptyTileData); } /* surface */ else if (z == iv) { terrainData.SetTileDataNoHeight(p, TileData.EmptyTileData); } /* underground */ else if (z < iv) { terrainData.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Granite)); } else { throw new Exception(); } } } }); }
static bool CreateOre(TerrainData terrain, IntVector3 p, MaterialID oreMaterialID) { if (!terrain.Contains(p)) return false; var td = terrain.GetTileData(p); if (td.ID != TileID.NaturalWall) return false; if (Materials.GetMaterial(td.MaterialID).Category != MaterialCategory.Rock) return false; td.SecondaryMaterialID = oreMaterialID; terrain.SetTileDataNoHeight(p, td); return true; }
public static void CreateVegetation(TerrainData terrain, Random random, int vegetationLimit) { var grassMaterials = Materials.GetMaterials(MaterialCategory.Grass).ToArray(); var woodMaterials = Materials.GetMaterials(MaterialCategory.Wood).ToArray(); var berryMaterials = Materials.GetMaterials(MaterialCategory.Berry).ToArray(); int baseSeed = random.Next(); if (baseSeed == 0) baseSeed = 1; terrain.Size.Plane.Range().AsParallel().ForAll(p2d => { int z = terrain.GetSurfaceLevel(p2d); var p = new IntVector3(p2d, z); if (z >= vegetationLimit) return; var td = terrain.GetTileData(p); if (td.WaterLevel > 0) return; if (terrain.GetMaterial(p.Down).Category != MaterialCategory.Soil) return; var r = new MWCRandom(p, baseSeed); int v = r.Next(100); if (v >= 95) { td.ID = TileID.Sapling; td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID; } else if (v >= 90) { td.ID = TileID.Tree; td.MaterialID = woodMaterials[r.Next(woodMaterials.Length)].ID; } else if (v >= 80) { td.ID = TileID.Shrub; td.MaterialID = berryMaterials[r.Next(berryMaterials.Length)].ID; } else { td.ID = TileID.Grass; td.MaterialID = grassMaterials[r.Next(grassMaterials.Length)].ID; } terrain.SetTileDataNoHeight(p, td); }); }
public static void CreateSoil(TerrainData data, int soilLimit) { int w = data.Width; int h = data.Height; for (int y = 0; y < h; ++y) { for (int x = 0; x < w; ++x) { int z = data.GetSurfaceLevel(x, y); if (z < soilLimit) { var p = new IntVector3(x, y, z - 1); data.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Loam)); } } } }