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