Beispiel #1
0
 public static bool ApplyTerrainFilters(
     this Transform transform,
     TerrainFilter[] filters,
     Vector3 pos,
     Quaternion rot,
     Vector3 scale,
     SpawnFilter globalFilter = null)
 {
     if (filters.Length == 0)
     {
         return(true);
     }
     for (int index = 0; index < filters.Length; ++index)
     {
         TerrainFilter filter    = filters[index];
         Vector3       vector3_1 = Vector3.Scale(filter.worldPosition, scale);
         Vector3       vector3_2 = Quaternion.op_Multiply(rot, vector3_1);
         Vector3       vector3_3 = Vector3.op_Addition(pos, vector3_2);
         if (TerrainMeta.OutOfBounds(vector3_3) || globalFilter != null && (double)globalFilter.GetFactor(vector3_3) == 0.0 || !filter.Check(vector3_3))
         {
             return(false);
         }
     }
     return(true);
 }
Beispiel #2
0
 public static bool ApplyTerrainFilters(this Transform transform, TerrainFilter[] filters, Vector3 pos, Quaternion rot, Vector3 scale, SpawnFilter globalFilter = null)
 {
     if (filters.Length == 0)
     {
         return(true);
     }
     for (int i = 0; i < (int)filters.Length; i++)
     {
         TerrainFilter terrainFilter = filters[i];
         Vector3       vector3       = Vector3.Scale(terrainFilter.worldPosition, scale);
         vector3 = rot * vector3;
         Vector3 vector31 = pos + vector3;
         if (TerrainMeta.OutOfBounds(vector31))
         {
             return(false);
         }
         if (globalFilter != null && globalFilter.GetFactor(vector31) == 0f)
         {
             return(false);
         }
         if (!terrainFilter.Check(vector31))
         {
             return(false);
         }
     }
     return(true);
 }
            // create a terrain map of ALL terrains, by using only their placement to fit them to a grid
            // the position and size of originTerrain defines the grid alignment and origin.  if NULL, we use the first active terrain
            static public TerrainMap CreateFromPlacement(Terrain originTerrain, TerrainFilter filter = null, bool fullValidation = true)
            {
                if ((Terrain.activeTerrains == null) || (Terrain.activeTerrains.Length == 0) || (originTerrain == null))
                {
                    return(null);
                }

                if (originTerrain.terrainData == null)
                {
                    return(null);
                }

                int   groupID     = originTerrain.groupingID;
                float gridOriginX = originTerrain.transform.position.x;
                float gridOriginZ = originTerrain.transform.position.z;
                float gridSizeX   = originTerrain.terrainData.size.x;
                float gridSizeZ   = originTerrain.terrainData.size.z;

                if (filter == null)
                {
                    filter = (x => (x.groupingID == groupID));
                }

                return(CreateFromPlacement(new Vector2(gridOriginX, gridOriginZ), new Vector2(gridSizeX, gridSizeZ), filter, fullValidation));
            }
            // create a terrain map of ALL terrains, by using only their placement to fit them to a grid
            // the position and size of originTerrain defines the grid alignment and origin.  if NULL, we use the first active terrain
            static public TerrainMap CreateFromPlacement(Vector2 gridOrigin, Vector2 gridSize, TerrainFilter filter = null, bool fullValidation = true)
            {
                if ((Terrain.activeTerrains == null) || (Terrain.activeTerrains.Length == 0))
                {
                    return(null);
                }

                TerrainMap terrainMap = new TerrainMap();

                float gridScaleX = 1.0f / gridSize.x;
                float gridScaleZ = 1.0f / gridSize.y;

                // iterate all active terrains
                foreach (Terrain terrain in Terrain.activeTerrains)
                {
                    // some integration tests just create a terrain component without terrain data
                    if (terrain.terrainData == null)
                    {
                        continue;
                    }

                    if ((filter == null) || filter(terrain))
                    {
                        // convert position to a grid index, with proper rounding
                        Vector3 pos   = terrain.transform.position;
                        int     tileX = Mathf.RoundToInt((pos.x - gridOrigin.x) * gridScaleX);
                        int     tileZ = Mathf.RoundToInt((pos.z - gridOrigin.y) * gridScaleZ);
                        // attempt to add the terrain at that grid position
                        terrainMap.TryToAddTerrain(tileX, tileZ, terrain);
                    }
                }

                // run validation to check alignment status
                if (fullValidation)
                {
                    terrainMap.Validate();
                }

                return((terrainMap.m_terrainTiles.Count > 0) ? terrainMap : null);
            }
Beispiel #5
0
            static public TerrainMap CreateFromConnectedNeighbors(Terrain originTerrain, TerrainFilter filter = null, bool fullValidation = true)
            {
                if (originTerrain == null)
                {
                    return(null);
                }

                if (originTerrain.terrainData == null)
                {
                    return(null);
                }

                TerrainMap terrainMap = new TerrainMap();

                Queue <QueueElement> todoQueue = new Queue <QueueElement>();

                todoQueue.Enqueue(new QueueElement(0, 0, originTerrain));

                int maxTerrains = Terrain.activeTerrains.Length;

                while (todoQueue.Count > 0)
                {
                    QueueElement cur = todoQueue.Dequeue();
                    if ((filter == null) || filter(cur.terrain))
                    {
                        if (terrainMap.TryToAddTerrain(cur.tileX, cur.tileZ, cur.terrain))
                        {
                            // sanity check to stop bad neighbors causing infinite iteration
                            if (terrainMap.m_terrainTiles.Count > maxTerrains)
                            {
                                break;
                            }

                            if (cur.terrain.leftNeighbor != null)
                            {
                                todoQueue.Enqueue(new QueueElement(cur.tileX - 1, cur.tileZ, cur.terrain.leftNeighbor));
                            }
                            if (cur.terrain.bottomNeighbor != null)
                            {
                                todoQueue.Enqueue(new QueueElement(cur.tileX, cur.tileZ - 1, cur.terrain.bottomNeighbor));
                            }
                            if (cur.terrain.rightNeighbor != null)
                            {
                                todoQueue.Enqueue(new QueueElement(cur.tileX + 1, cur.tileZ, cur.terrain.rightNeighbor));
                            }
                            if (cur.terrain.topNeighbor != null)
                            {
                                todoQueue.Enqueue(new QueueElement(cur.tileX, cur.tileZ + 1, cur.terrain.topNeighbor));
                            }
                        }
                    }
                }

                // run validation to check alignment status
                if (fullValidation)
                {
                    terrainMap.Validate();
                }

                return(terrainMap);
            }