GetSurfaceLevel() public method

public GetSurfaceLevel ( IntVector2 p ) : int
p IntVector2
return int
Example #1
0
        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);
                    }
                }
            });
        }
Example #3
0
        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));
        }
Example #4
0
        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]));
                    }
                }
            });
        }
Example #5
0
        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]));
                    }
                }
            });
        }
Example #6
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.GetSurfaceLevel(x, y);

                    if (z < soilLimit)
                    {
                        var p = new IntVector3(x, y, z - 1);

                        data.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Loam));
                    }
                }
            }
        }
Example #7
0
        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();
                        }
                    }
                }
            });
        }
Example #8
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);
            });
        }
Example #9
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();
        }
Example #10
0
        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);
        }
Example #11
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);
            });
        }
Example #12
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.GetSurfaceLevel(x, y);

                    if (z < soilLimit)
                    {
                        var p = new IntVector3(x, y, z - 1);

                        data.SetTileDataNoHeight(p, TileData.GetNaturalWall(MaterialID.Loam));
                    }
                }
            }
        }