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);
                        }
                    }
                }
            }
        }
Beispiel #3
0
        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);
            }