/// <summary> /// Get the number of active terrain tiles in this scene /// </summary> /// <returns>Number of terrains in the scene</returns> public static int GetActiveTerrainCount() { if (GaiaUtils.HasDynamicLoadedTerrains()) { //with terrain loading, we can simply count the loaded scenes, those should be the active terrains return(TerrainLoaderManager.TerrainScenes.Where(x => x.m_regularLoadState == LoadState.Loaded).Count() + TerrainLoaderManager.TerrainScenes.Where(x => x.m_impostorLoadState == LoadState.Loaded).Count()); } else { //For non-terrain loading we need to take a look at what we can find in the scene //Regular terrains Terrain terrain; int terrainCount = 0; for (int idx = 0; idx < Terrain.activeTerrains.Length; idx++) { terrain = Terrain.activeTerrains[idx]; if (terrain != null && terrain.isActiveAndEnabled) { terrainCount++; } } //Mesh Terrains from a terrain export GameObject exportContainer = GaiaUtils.GetTerrainExportObject(false); if (exportContainer != null) { //Iterate through the objects in here, if it is active and the name checks out we can assume it is a mesh terrain. foreach (Transform t in exportContainer.transform) { if (t.gameObject.GetComponent <MeshRenderer>() != null) { if (t.gameObject.activeInHierarchy && (t.name.StartsWith(GaiaConstants.MeshTerrainName) || t.name.StartsWith(GaiaConstants.MeshTerrainLODGroupPrefix))) { terrainCount++; } } } } return(terrainCount); } }
/// <summary> /// Get the bounds of the terrain at this location or fail with a null /// </summary> /// <param name="locationWU">Location to check and get terrain for</param> /// <returns>Bounds of selected terrain or null if invalid for some reason</returns> public static bool GetTerrainBounds(ref BoundsDouble bounds, bool activeTerrainsOnly = false) { //Terrain terrain = GetTerrain(locationWU); //if (terrain == null) //{ // return false; //} //bounds.center = terrain.transform.position; //bounds.size = terrain.terrainData.size; //bounds.center += bounds.extents; Vector3Double accumulatedCenter = new Vector3Double(); //Do we use dynamic loaded terrains in the scene? if (GaiaUtils.HasDynamicLoadedTerrains() && !activeTerrainsOnly) { #if GAIA_PRO_PRESENT //we do have dynamic terrains -> calculate the bounds according to the terrain scene data in the session GaiaSessionManager gsm = GaiaSessionManager.GetSessionManager(false); foreach (TerrainScene t in TerrainLoaderManager.TerrainScenes) { accumulatedCenter += t.m_bounds.center; } bounds.center = accumulatedCenter / TerrainLoaderManager.TerrainScenes.Count; foreach (TerrainScene t in TerrainLoaderManager.TerrainScenes) { bounds.Encapsulate(t.m_bounds); } #endif } else { //no placeholder -> calculate bounds according to the active terrains in the scene if (Terrain.activeTerrains.Length > 0) { foreach (Terrain t in Terrain.activeTerrains) { if (!TerrainHelper.IsWorldMapTerrain(t)) { if (t.terrainData != null) { accumulatedCenter += new Vector3Double(t.transform.position) + new Vector3Double(t.terrainData.bounds.extents); } else { Debug.LogWarning("Terrain " + t.name + " in the scene is missing the terrain data object!"); } } } bounds.center = accumulatedCenter / Terrain.activeTerrains.Length; foreach (Terrain t in Terrain.activeTerrains) { if (!TerrainHelper.IsWorldMapTerrain(t)) { if (t.terrainData != null) { Bounds newBounds = new Bounds(); newBounds.center = t.transform.position; newBounds.size = t.terrainData.size; newBounds.center += t.terrainData.bounds.extents; bounds.Encapsulate(newBounds); } } } } else { bounds = new BoundsDouble(Vector3Double.zero, Vector3Double.zero); //No active terrains? There might be mesh terrains we can use then GameObject meshTerrainExportObject = GaiaUtils.GetTerrainExportObject(false); if (meshTerrainExportObject != null) { foreach (Transform t in meshTerrainExportObject.transform) { MeshRenderer mr = t.GetComponent <MeshRenderer>(); if (mr != null) { bounds.Encapsulate(mr.bounds); } } } } } return(true); }