protected virtual void UpdateResolutionChange() { #if UNITY_EDITOR UnityEditor.EditorUtility.DisplayProgressBar("uNature Foliage", "uNature is recalculating the new Foliage area resolution \nThat might take awhile...", 0.2f); #endif // recreate sectors. DestroyImmediate(sector.gameObject); // update world map worldMap = UNMapGenerators.GenerateWorldMap(this); // update & clean grass maps DisposeExistingGrassMaps(); _grassMaps = null; UpdateGrassMapsForMaterials(); PoolMeshInstances(); UNSettings.Log("uNature finished updating the area resolution successfully!! New resolution : " + _foliageAreaResolutionIntegral); #if UNITY_EDITOR UnityEditor.EditorUtility.ClearProgressBar(); #endif }
public static void ApplyAreaSizeChange(FoliageManagerInstance mInstance) { FoliageGrassMap grassMap; for (int i = 0; i < FoliageDB.unSortedPrototypes.Count; i++) { grassMap = mInstance.grassMaps[FoliageDB.unSortedPrototypes[i]]; grassMap.Resize(mInstance.foliageAreaResolutionIntegral); } UNSettings.Log("Grass maps updated succesfully after modifying resolution."); }
/// <summary> /// On terrain changed. /// </summary> /// <param name="changedFlags"></param> protected virtual void OnTerrainChanged(int changedFlags) { TerrainChangedFlags flag = (TerrainChangedFlags)changedFlags; if (flag == TerrainChangedFlags.TreeInstances) { if (sector == null) { GenerateSector(sectorResolution); } #if UNITY_EDITOR UNEditorUtility.StartSceneScrollbar("Fetching tree instances...", 1); #endif sector.FetchTreeInstances(true, () => { #if UNITY_EDITOR UNSettings.Log("Trees Updated."); UNEditorUtility.currentProgressIndex = 1; #endif }); } else if (flag == TerrainChangedFlags.TreePrototypesChanged) { CreatePool(PoolItemType); } else if (flag == TerrainChangedFlags.DelayedHeightmapUpdate) { if (FoliageCore_MainManager.instance == null || !updateGrassOnHeightsChange || !manageGrass) { return; } TerrainData tData = terrain.terrainData; float[,] heights = tData.GetHeights(0, 0, tData.heightmapWidth, tData.heightmapHeight); bool changed = false; float cordX; float cordY; FoliageCore_MainManager manager = FoliageCore_MainManager.instance; int mChunkID; FoliageCore_Chunk mChunk; FoliageManagerInstance mInstance; Vector3 position = transform.position; Vector3 managerPosition = manager.transform.position; FoliageWorldMap worldMap; int transformedSize; for (int x = 0; x < tData.heightmapWidth; x++) { for (int y = 0; y < tData.heightmapHeight; y++) { if (heights[y, x] != terrainData.multiThreaded_terrainHeights[y, x]) // change on cord. { changed = true; cordX = ((x * tData.size.x) / tData.heightmapWidth) + position.x; cordY = ((y * tData.size.z) / tData.heightmapHeight) + position.z; mChunkID = manager.GetChunkID(cordX - managerPosition.x, cordY - managerPosition.z); if (manager.CheckChunkInBounds(mChunkID)) { mChunk = manager.sector.foliageChunks[mChunkID]; if (!mChunk.isFoliageInstanceAttached) { continue; } mInstance = mChunk.GetOrCreateFoliageManagerInstance(); worldMap = mInstance.worldMap; cordX = mInstance.TransformCord(cordX, mInstance.transform.position.x); cordY = mInstance.TransformCord(cordY, mInstance.transform.position.z); transformedSize = mInstance.TransformCord(2, 0); worldMap.UpdateHeight_RANGE(cordX, cordY, transformedSize, transformedSize, false); worldMap.SetPixels32Delayed(); } } } } if (changed) { FoliageCore_MainManager.SaveDelayedMaps(); } terrainData.multiThreaded_terrainHeights = heights; } }
public static void ApplyAreaSizeChange(FoliageManagerInstance mInstance) { mInstance.worldMap.Resize(mInstance.foliageAreaResolutionIntegral); UNSettings.Log("World map updated succesfully after modifying resolution."); }