示例#1
0
        public TerrainTree(int level, int indexStartX, int indexEndX, int indexStartZ, int indexEndZ, Terrain t)
        {
            terrain = t;
            childs  = null;

            double minY = 99999999, maxY = -99999999;

            for (int i = indexStartX; i < indexEndX; i++)
            {
                for (int j = indexStartZ; j < indexEndZ; j++)
                {
                    double h = terrain.terrain[i, j] * terrain.ScaleY;
                    if (h < minY)
                    {
                        minY = h;
                    }
                    if (h > maxY)
                    {
                        maxY = h;
                    }
                }
            }

            boundingBox = new BoundingBox(indexEndX * terrain.ScaleXZ, maxY, indexEndZ * terrain.ScaleXZ,
                                          indexStartX * terrain.ScaleXZ, minY, indexStartZ * terrain.ScaleXZ);

            // Smallest Patch Size: 8x8
            if (indexEndX - indexStartX <= 8 || indexEndZ - indexStartZ <= 8)
            {
                this.indexStartX = indexStartX;
                this.indexEndX   = indexEndX;
                this.indexStartZ = indexStartZ;
                this.indexEndZ   = indexEndZ;
                return;
            }

            childs = new TerrainTree[4];
            level++;

            int midX = Convert.ToInt32((indexEndX - indexStartX) / 2 + indexStartX);
            int midZ = Convert.ToInt32((indexEndZ - indexStartZ) / 2 + indexStartZ);

            childs[0] = new TerrainTree(level, indexStartX, midX, indexStartZ, midZ, terrain);
            childs[1] = new TerrainTree(level, midX, indexEndX, indexStartZ, midZ, terrain);
            childs[2] = new TerrainTree(level, indexStartX, midX, midZ, indexEndZ, terrain);
            childs[3] = new TerrainTree(level, midX, indexEndX, midZ, indexEndZ, terrain);
        }
示例#2
0
        public Terrain(int sizeFactor, double scaleXZ, double scaleY)
        {
            size = Convert.ToInt32(System.Math.Pow(2, sizeFactor));
            int realSize = size + 1;

            terrain     = new byte[realSize, realSize];
            layersIndex = new int[realSize, realSize];

            for (int x = 0; x < realSize; x++)
            {
                for (int y = 0; y < realSize; y++)
                {
                    terrain[x, y] = 0;
                }
            }

            this.scaleXZ = scaleXZ;
            this.scaleY  = scaleY;
            terrainTree  = new TerrainTree(0, 0, size, 0, size, this);
        }
示例#3
0
        public Terrain(string heightMap, int sizeFactor, double scaleXZ, double scaleY)
        {
            size = Convert.ToInt32(System.Math.Pow(2, sizeFactor));
            int realSize = size + 1;

            terrain     = new byte[realSize, realSize];
            layersIndex = new int[realSize, realSize];

            BinaryReader binReader = new BinaryReader(File.Open(heightMap, FileMode.Open));

            for (int x = 0; x < realSize; x++)
            {
                for (int y = 0; y < realSize; y++)
                {
                    terrain[x, y] = binReader.ReadByte();
                }
            }
            binReader.Close();

            this.scaleXZ = scaleXZ;
            this.scaleY  = scaleY;
            terrainTree  = new TerrainTree(0, 0, size, 0, size, this);
        }