internal static TerrainUtility.TerrainGroups CollectTerrains(bool onlyAutoConnectedTerrains = true) { bool flag = !TerrainUtility.HasValidTerrains(); TerrainUtility.TerrainGroups result; if (flag) { result = null; } else { TerrainUtility.TerrainGroups terrainGroups = new TerrainUtility.TerrainGroups(); Terrain[] activeTerrains = Terrain.activeTerrains; for (int i = 0; i < activeTerrains.Length; i++) { Terrain t = activeTerrains[i]; bool flag2 = onlyAutoConnectedTerrains && !t.allowAutoConnect; if (!flag2) { bool flag3 = !terrainGroups.ContainsKey(t.groupingID); if (flag3) { TerrainUtility.TerrainMap terrainMap = TerrainUtility.TerrainMap.CreateFromPlacement(t, (Terrain x) => x.groupingID == t.groupingID && (!onlyAutoConnectedTerrains || x.allowAutoConnect), true); bool flag4 = terrainMap != null; if (flag4) { terrainGroups.Add(t.groupingID, terrainMap); } } } } result = ((terrainGroups.Count != 0) ? terrainGroups : null); } return(result); }
public static void AutoConnect() { bool flag = !TerrainUtility.HasValidTerrains(); if (!flag) { TerrainUtility.ClearConnectivity(); TerrainUtility.TerrainGroups terrainGroups = TerrainUtility.CollectTerrains(true); bool flag2 = terrainGroups == null; if (!flag2) { foreach (KeyValuePair <int, TerrainUtility.TerrainMap> current in terrainGroups) { TerrainUtility.TerrainMap value = current.Value; foreach (KeyValuePair <TerrainUtility.TerrainMap.TileCoord, Terrain> current2 in value.m_terrainTiles) { TerrainUtility.TerrainMap.TileCoord key = current2.Key; Terrain terrain = value.GetTerrain(key.tileX, key.tileZ); Terrain terrain2 = value.GetTerrain(key.tileX - 1, key.tileZ); Terrain terrain3 = value.GetTerrain(key.tileX + 1, key.tileZ); Terrain terrain4 = value.GetTerrain(key.tileX, key.tileZ + 1); Terrain terrain5 = value.GetTerrain(key.tileX, key.tileZ - 1); terrain.SetNeighbors(terrain2, terrain4, terrain3, terrain5); } } } } }
private void FindTerrainTilesUnlimited() { // pixel rect bounds (in world space) float minX = originTerrain.transform.position.x + pixelSize.x * pixelRect.xMin; float minZ = originTerrain.transform.position.z + pixelSize.y * pixelRect.yMin; float maxX = originTerrain.transform.position.x + pixelSize.x * (pixelRect.xMax - 1); float maxZ = originTerrain.transform.position.z + pixelSize.y * (pixelRect.yMax - 1); m_HeightWorldSpaceMin = originTerrain.GetPosition().y; m_HeightWorldSpaceMax = m_HeightWorldSpaceMin + originTerrain.terrainData.size.y; // this filter limits the search to Terrains that overlap the pixel rect bounds TerrainUtility.TerrainMap.TerrainFilter filterOverlap = t => { // terrain bounds (in world space) float tminX = t.transform.position.x; float tminZ = t.transform.position.z; float tmaxX = t.transform.position.x + t.terrainData.size.x; float tmaxZ = t.transform.position.z + t.terrainData.size.z; // test overlap return((tminX <= maxX) && (tmaxX >= minX) && (tminZ <= maxZ) && (tmaxZ >= minZ)); }; // gather Terrains that pass the filter TerrainUtility.TerrainMap terrainMap = TerrainUtility.TerrainMap.CreateFromConnectedNeighbors(originTerrain, filterOverlap, false); // convert those Terrains into the TerrainTile list m_TerrainTiles = new List <TerrainTile>(); if (terrainMap != null) { foreach (var cur in terrainMap.m_terrainTiles) { var coord = cur.Key; Terrain terrain = cur.Value; int minPixelX = coord.tileX * (targetTextureWidth - 1); int minPixelZ = coord.tileZ * (targetTextureHeight - 1); RectInt terrainPixelRect = new RectInt(minPixelX, minPixelZ, targetTextureWidth, targetTextureHeight); if (pixelRect.Overlaps(terrainPixelRect)) { m_TerrainTiles.Add( TerrainTile.Make( terrain, minPixelX, minPixelZ, pixelRect, targetTextureWidth, targetTextureHeight)); m_HeightWorldSpaceMin = Mathf.Min(m_HeightWorldSpaceMin, terrain.GetPosition().y); m_HeightWorldSpaceMax = Mathf.Max(m_HeightWorldSpaceMax, terrain.GetPosition().y + terrain.terrainData.size.y); } } } }
public static TerrainUtility.TerrainMap CreateFromPlacement(Vector2 gridOrigin, Vector2 gridSize, TerrainUtility.TerrainMap.TerrainFilter filter = null, bool fullValidation = true) { bool flag = Terrain.activeTerrains == null || Terrain.activeTerrains.Length == 0; TerrainUtility.TerrainMap result; if (flag) { result = null; } else { TerrainUtility.TerrainMap terrainMap = new TerrainUtility.TerrainMap(); float num = 1f / gridSize.x; float num2 = 1f / gridSize.y; Terrain[] activeTerrains = Terrain.activeTerrains; for (int i = 0; i < activeTerrains.Length; i++) { Terrain terrain = activeTerrains[i]; bool flag2 = terrain.terrainData == null; if (!flag2) { bool flag3 = filter == null || filter(terrain); if (flag3) { Vector3 position = terrain.transform.position; int tileX = Mathf.RoundToInt((position.x - gridOrigin.x) * num); int tileZ = Mathf.RoundToInt((position.z - gridOrigin.y) * num2); terrainMap.TryToAddTerrain(tileX, tileZ, terrain); } } } if (fullValidation) { terrainMap.Validate(); } result = ((terrainMap.m_terrainTiles.Count > 0) ? terrainMap : null); } return(result); }
public static TerrainUtility.TerrainMap CreateFromConnectedNeighbors(Terrain originTerrain, TerrainUtility.TerrainMap.TerrainFilter filter = null, bool fullValidation = true) { bool flag = originTerrain == null; TerrainUtility.TerrainMap result; if (flag) { result = null; } else { bool flag2 = originTerrain.terrainData == null; if (flag2) { result = null; } else { TerrainUtility.TerrainMap terrainMap = new TerrainUtility.TerrainMap(); Queue <TerrainUtility.TerrainMap.QueueElement> queue = new Queue <TerrainUtility.TerrainMap.QueueElement>(); queue.Enqueue(new TerrainUtility.TerrainMap.QueueElement(0, 0, originTerrain)); int num = Terrain.activeTerrains.Length; while (queue.Count > 0) { TerrainUtility.TerrainMap.QueueElement queueElement = queue.Dequeue(); bool flag3 = filter == null || filter(queueElement.terrain); if (flag3) { bool flag4 = terrainMap.TryToAddTerrain(queueElement.tileX, queueElement.tileZ, queueElement.terrain); if (flag4) { bool flag5 = terrainMap.m_terrainTiles.Count > num; if (flag5) { break; } bool flag6 = queueElement.terrain.leftNeighbor != null; if (flag6) { queue.Enqueue(new TerrainUtility.TerrainMap.QueueElement(queueElement.tileX - 1, queueElement.tileZ, queueElement.terrain.leftNeighbor)); } bool flag7 = queueElement.terrain.bottomNeighbor != null; if (flag7) { queue.Enqueue(new TerrainUtility.TerrainMap.QueueElement(queueElement.tileX, queueElement.tileZ - 1, queueElement.terrain.bottomNeighbor)); } bool flag8 = queueElement.terrain.rightNeighbor != null; if (flag8) { queue.Enqueue(new TerrainUtility.TerrainMap.QueueElement(queueElement.tileX + 1, queueElement.tileZ, queueElement.terrain.rightNeighbor)); } bool flag9 = queueElement.terrain.topNeighbor != null; if (flag9) { queue.Enqueue(new TerrainUtility.TerrainMap.QueueElement(queueElement.tileX, queueElement.tileZ + 1, queueElement.terrain.topNeighbor)); } } } } if (fullValidation) { terrainMap.Validate(); } result = terrainMap; } } return(result); }