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