GetTileData() public method

public GetTileData ( IntVector3 p ) : TileData
p IntVector3
return TileData
示例#1
0
 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);
         }
     }
 }
示例#2
0
        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);
        }
示例#3
0
        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);
            });
        }
示例#4
0
        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);
                }
            });
        }
示例#5
0
        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);
                    }
                }
            }
        }
示例#6
0
        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();
        }
示例#7
0
        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();
        }
示例#8
0
        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();
        }
示例#9
0
        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;
        }
示例#10
0
        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));
 }