public IEnumerable <Direction> GetValidDirs(IntVector3 p) { foreach (var d in DirectionExtensions.CardinalUpDownDirections.ToArray()) { var dst = p + d; if (m_terrain.Contains(dst) && m_terrain.GetTileData(dst).IsWaterPassable) { yield return(d); } } }
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 CreateSlopes(TerrainData data, int baseSeed) { var plane = data.Size.Plane; plane.Range().AsParallel().ForAll(p => { int z = data.GetHeight(p); int count = 0; Direction dir = Direction.None; var r = new MWCRandom(p, baseSeed); int offset = r.Next(8); // Count the tiles around this tile which are higher. Create slope to a random direction, but skip // the slope if all 8 tiles are higher. // Count to 10. If 3 successive slopes, create one in the middle int successive = 0; for (int i = 0; i < 10; ++i) { var d = DirectionExtensions.PlanarDirections[(i + offset) % 8]; var t = p + d; if (plane.Contains(t) && data.GetHeight(t) > z) { if (i < 8) count++; successive++; if (successive == 3) { dir = DirectionExtensions.PlanarDirections[((i - 1) + offset) % 8]; } else if (dir == Direction.None) { dir = d; } } else { successive = 0; } } if (count > 0 && count < 8) { var p3d = new IntPoint3(p, z); var td = data.GetTileData(p3d); td.TerrainID = dir.ToSlope(); data.SetTileData(p3d, 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.GetHeight(x, y); var p = new IntPoint3(x, y, z); if (z < soilLimit) { var td = data.GetTileData(p); td.TerrainMaterialID = MaterialID.Loam; data.SetTileData(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(); }
void RenderSliceYZ(TerrainData terrain, int x) { int w = m_size.Width; int h = m_size.Height; int d = m_size.Depth; m_sliceBmpYZ.Lock(); unsafe { var pBackBuffer = (uint*)m_sliceBmpYZ.BackBuffer; int stride = m_sliceBmpYZ.BackBufferStride / 4; Parallel.For(0, d, z => { for (int y = 0; y < h; ++y) { int mz = d - z - 1; var p = new IntVector3(x, y, mz); var td = terrain.GetTileData(p); uint c; if (td.IsEmpty && td.WaterLevel == 0) c = ColorToRaw(Colors.SkyBlue); else c = IntVector3ToRaw(GetTileColor(td)); var ptr = pBackBuffer + y * stride + z; *ptr = c; } }); } m_sliceBmpYZ.AddDirtyRect(new Int32Rect(0, 0, m_sliceBmpYZ.PixelWidth, m_sliceBmpYZ.PixelHeight)); m_sliceBmpYZ.Unlock(); }
void RenderSliceXY(TerrainData terrain, int level) { int w = m_size.Width; int h = m_size.Height; 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) { var p = new IntVector3(x, y, level); var td = terrain.GetTileData(p); uint c; if (td.IsEmpty && td.WaterLevel == 0) c = ColorToRaw(Colors.SkyBlue); else c = IntVector3ToRaw(GetTileColor(td)); var ptr = pBackBuffer + y * stride + x; *ptr = c; } }); } m_sliceBmpXY.AddDirtyRect(new Int32Rect(0, 0, m_sliceBmpXY.PixelWidth, m_sliceBmpXY.PixelHeight)); m_sliceBmpXY.Unlock(); }
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); }); }
TileData GetTileData(IntVector3 p) { return(m_data.GetTileData(p)); }