IntVector3 FindStartLoc(Random r, SideEdge edge) { int side = m_terrain.Width; int yo = r.Next(0, side); int zo = m_terrain.GetSurfaceLevel(MapCoord(yo, edge)); int yu = yo; int zu = zo; for (int y = yo - 1; y >= 0; --y) { int z = m_terrain.GetSurfaceLevel(MapCoord(y, edge)); if (z < zu) { zu = z; yu = y; } if (z - 2 > zu) { break; } } int yd = yo; int zd = zo; for (int y = yo + 1; y < side; ++y) { int z = m_terrain.GetSurfaceLevel(MapCoord(y, edge)); if (z < zd) { zd = z; yd = y; } if (z - 2 > zd) { break; } } int yf = zd < zu ? yd : yu; var p2 = MapCoord(yf, edge); return(m_terrain.GetSurfaceLocation(p2)); }
void CreateBaseGrid() { int width = m_size.Width; int height = m_size.Height; int depth = m_size.Depth; Parallel.For(0, height, y => { for (int x = 0; x < width; ++x) { int surface = m_data.GetSurfaceLevel(x, y); for (int z = 0; z < depth; ++z) { var p = new IntVector3(x, y, z); TileData td; if (z < surface) { td = TileData.GetNaturalWall(MaterialID.Granite); } else { td = TileData.EmptyTileData; } SetTileData(p, td); } } }); }
static IntVector3 GetRandomSubterraneanLocation(TerrainData data, Random random) { int x = random.Next(data.Width); int y = random.Next(data.Height); int maxZ = data.GetSurfaceLevel(x, y); int z = random.Next(maxZ); return(new IntVector3(x, y, 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 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)); } } } }
void FillMap() { var terrainData = m_data; Parallel.For(0, terrainData.Height, y => { for (int x = 0; x < terrainData.Width; ++x) { int iv = m_data.GetSurfaceLevel(x, y); 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 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); }); }
void RenderTerrain(TerrainData terrain) { int w = m_size.Width; int h = m_size.Height; TileData[,,] tileGrid; byte[,] levelMap; terrain.GetData(out tileGrid, out levelMap); int min = levelMap.Min(); int max = levelMap.Max(); m_sliceBmpXY.Lock(); unsafe { var pBackBuffer = (uint*)m_sliceBmpXY.BackBuffer; int stride = m_sliceBmpXY.BackBufferStride / 4; Parallel.For(0, h, y => { for (int x = 0; x < w; ++x) { int z = terrain.GetSurfaceLevel(x, y); TileData td; while (true) { var p = new IntVector3(x, y, z); td = terrain.GetTileData(p); if (td.IsEmptyNoWater) { z--; continue; } if (this.ShowWaterEnabled && td.WaterLevel > 0) { var wl = terrain.GetWaterLevel(p + Direction.Up); if (wl > 0) { z++; continue; } } break; } int m = MyMath.Round(MyMath.LinearInterpolation(min, max, 100, 255, z)); var cv = GetTileColor(td); int r = cv.X; int g = cv.Y; int b = cv.Z; r = r * m / 255; g = g * m / 255; b = b * m / 255; var ptr = pBackBuffer + y * stride + x; *ptr = (uint)((r << 16) | (g << 8) | (b << 0)); } }); } m_sliceBmpXY.AddDirtyRect(new Int32Rect(0, 0, m_sliceBmpXY.PixelWidth, m_sliceBmpXY.PixelHeight)); m_sliceBmpXY.Unlock(); }
static IntVector3 GetRandomSubterraneanLocation(TerrainData data, Random random) { int x = random.Next(data.Width); int y = random.Next(data.Height); int maxZ = data.GetSurfaceLevel(x, y); int z = random.Next(maxZ); return new IntVector3(x, y, z); }
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); }); }