Exemplo n.º 1
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);
            }
            public static TerrainUtility.TerrainMap CreateFromPlacement(Terrain originTerrain, TerrainUtility.TerrainMap.TerrainFilter filter = null, bool fullValidation = true)
            {
                bool flag = Terrain.activeTerrains == null || Terrain.activeTerrains.Length == 0 || originTerrain == null;

                TerrainUtility.TerrainMap result;
                if (flag)
                {
                    result = null;
                }
                else
                {
                    bool flag2 = originTerrain.terrainData == null;
                    if (flag2)
                    {
                        result = null;
                    }
                    else
                    {
                        int   groupID = originTerrain.groupingID;
                        float x3      = originTerrain.transform.position.x;
                        float z       = originTerrain.transform.position.z;
                        float x2      = originTerrain.terrainData.size.x;
                        float z2      = originTerrain.terrainData.size.z;
                        bool  flag3   = filter == null;
                        if (flag3)
                        {
                            filter = ((Terrain x) => x.groupingID == groupID);
                        }
                        result = TerrainUtility.TerrainMap.CreateFromPlacement(new Vector2(x3, z), new Vector2(x2, z2), filter, fullValidation);
                    }
                }
                return(result);
            }