public void Generate(Map map) { int w = map.Width; int h = map.Height; int faces = 0; // face count needed int vCount = 0; // total vertices int index = 0; int[, ,] indexMap = new int[w + 1, h + 1, 2]; for (int x = 0; x < w + 1; ++x) { for (int y = 0; y < h + 1; ++y) { if (map.IsSquareOnLevel(x, y, 1)) { ++vCount; if (map.IsSquareOnLevel(x, y, 0)) { ++vCount; } } } } vertices = new Vector3[vCount]; index = 0; for (int x = 0; x < w + 1; ++x) { for (int y = 0; y < h + 1; ++y) { if (map.IsSquareOnLevel(x, y, 1)) { vertices[index] = new Vector3(x, 1, y); indexMap[x, y, 1] = index; ++index; if (map.IsSquareOnLevel(x, y, 0)) { vertices[index] = new Vector3(x, 0, y); indexMap[x, y, 0] = index; ++index; } } } } for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { int t = map.GetHeight(x, y); if (t > 0) { if (map.GetHeight(x + 1, y) < 1) { ++faces; } if (map.GetHeight(x - 1, y) < 1) { ++faces; } if (map.GetHeight(x, y + 1) < 1) { ++faces; } if (map.GetHeight(x, y - 1) < 1) { ++faces; } ++faces; } } } triangles = new int[faces * 3 * 2]; index = 0; for (int x = 0; x < w; ++x) { for (int y = 0; y < h; ++y) { if (map.IsLevel(x, y, 1)) { // top triangles[index++] = indexMap[x, y, 1]; triangles[index++] = indexMap[x, y + 1, 1]; triangles[index++] = indexMap[x + 1, y + 1, 1]; triangles[index++] = indexMap[x, y, 1]; triangles[index++] = indexMap[x + 1, y + 1, 1]; triangles[index++] = indexMap[x + 1, y, 1]; if (map.GetHeight(x + 1, y) < 1) { // East triangles[index++] = indexMap[x + 1, y + 1, 1]; triangles[index++] = indexMap[x + 1, y, 0]; triangles[index++] = indexMap[x + 1, y, 1]; triangles[index++] = indexMap[x + 1, y, 0]; triangles[index++] = indexMap[x + 1, y + 1, 1]; triangles[index++] = indexMap[x + 1, y + 1, 0]; } if (map.GetHeight(x - 1, y) < 1) { // West triangles[index++] = indexMap[x, y, 1]; triangles[index++] = indexMap[x, y + 1, 0]; triangles[index++] = indexMap[x, y + 1, 1]; triangles[index++] = indexMap[x, y, 0]; triangles[index++] = indexMap[x, y + 1, 0]; triangles[index++] = indexMap[x, y, 1]; } if (map.GetHeight(x, y + 1) < 1) { // North triangles[index++] = indexMap[x + 1, y + 1, 1]; triangles[index++] = indexMap[x, y + 1, 1]; triangles[index++] = indexMap[x + 1, y + 1, 0]; triangles[index++] = indexMap[x + 1, y + 1, 0]; triangles[index++] = indexMap[x, y + 1, 1]; triangles[index++] = indexMap[x, y + 1, 0]; } if (map.GetHeight(x, y - 1) < 1) { // South triangles[index++] = indexMap[x + 1, y, 1]; triangles[index++] = indexMap[x, y, 0]; triangles[index++] = indexMap[x, y, 1]; triangles[index++] = indexMap[x + 1, y, 0]; triangles[index++] = indexMap[x, y, 0]; triangles[index++] = indexMap[x + 1, y, 1]; } } } } }