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); }
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); }
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); }