public static void SetTextures(Rect terrainRect, Texture2D[] textures, int[] maskGroupNums, VegetationPackagePro package) { for (int i = 0; i < textures.Length; i++) { Texture2D tex = textures[i]; if (tex == null) { continue; } TextureMaskGroup maskGroup = package.TextureMaskGroupList[maskGroupNums[i]]; //creating new mask only if the mask with the same rect doesn't exist TextureMask mask = maskGroup.TextureMaskList.Find(m => m.TextureRect == terrainRect); if (mask == null) { mask = new TextureMask { TextureRect = terrainRect }; maskGroup.TextureMaskList.Add(mask); } mask.MaskTexture = tex; } //VegetationSystemPro system = GameObject.FindObjectOfType<VegetationSystemPro>(); //if (system != null) // system.ClearCache(); //clearing cache causes flickering system.ClearCache(new Bounds(terrainRect.center.V3(), terrainRect.size.V3())); VegetationStudioManager.RefreshTerrainHeightMap(); }
/// <summary> /// Sets a new persistentVegetationStoragePackage. Will refresh the VegetationSystem component. /// </summary> /// <param name="persistentVegetationStoragePackage"></param> public void SetPersistentVegetationStoragePackage( PersistentVegetationStoragePackage persistentVegetationStoragePackage) { PersistentVegetationStoragePackage = persistentVegetationStoragePackage; if (VegetationSystemPro) { VegetationSystemPro.ClearCache(); } }
public static void RefreshVegetation() { VegetationStudioManager VegetationStudioInstance = FindVegetationStudioInstance(); List <VegetationSystemPro> VegetationSystemList = VegetationStudioInstance.VegetationSystemList; for (int i = 0; i <= VegetationSystemList.Count - 1; i++) { VegetationSystemPro vegetationSystemPro = VegetationSystemList[i]; vegetationSystemPro.ClearCache(); vegetationSystemPro.RefreshTerrainHeightmap(); SceneView.RepaintAll(); SetSceneDirty(vegetationSystemPro); } }
/// <summary> /// Iterate through all items of the selected biome /// </summary> /// <param name="selectedBiomeTypes"></param> /// <returns></returns> public int Process(BiomeType[] selectedBiomeTypes) { int itemChangeCount = 0; List <VegetationSystemPro> VegetationSystemList = VegetationStudioInstance.VegetationSystemList; for (int i = 0; i <= VegetationSystemList.Count - 1; i++) { VegetationSystemPro vegetationSystemPro = VegetationSystemList[i]; foreach (VegetationPackagePro vegetationPackagePro in vegetationSystemPro.VegetationPackageProList) { // filter biome type if (!ArrayUtility.Contains(selectedBiomeTypes, vegetationPackagePro.BiomeType)) { continue; } // note: the delete mechanism operates on the list itself => we have to use a clone => using ToArray() on the list foreach (VegetationItemInfoPro vegetationItemInfoPro in vegetationPackagePro.VegetationInfoList.ToArray()) { // perform the actual action OnActionPerformed(vegetationPackagePro, vegetationItemInfoPro); // clear cache vegetationSystemPro.ClearCache(vegetationItemInfoPro.VegetationItemID); itemChangeCount++; } EditorUtility.SetDirty(vegetationPackagePro); } vegetationSystemPro.RefreshVegetationSystem(); VegetationStudioProUtils.SetSceneDirty(vegetationSystemPro); } return(itemChangeCount); }
void BakeVegetationItemColliders(ColliderManager colliderManager, VegetationItemInfoPro vegetationItemInfoPro) { GC.Collect(); GameObject rootItem = new GameObject("Baked colliders_" + vegetationItemInfoPro.Name + "_" + vegetationItemInfoPro.VegetationItemID); #if UNITY_EDITOR if (!Application.isPlaying) { EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell", 0); } #endif int colliderCount = 0; for (int i = 0; i <= VegetationSystemPro.VegetationCellList.Count - 1; i++) { VegetationCell vegetationCell = VegetationSystemPro.VegetationCellList[i]; #if UNITY_EDITOR if (i % 10 == 0) { if (!Application.isPlaying) { EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell " + i + "/" + (VegetationSystemPro.VegetationCellList.Count - 1), i / ((float)VegetationSystemPro.VegetationCellList.Count - 1)); } } #endif VegetationSystemPro.SpawnVegetationCell(vegetationCell, vegetationItemInfoPro.VegetationItemID); NativeList <MatrixInstance> vegetationInstanceList = VegetationSystemPro.GetVegetationItemInstances(vegetationCell, vegetationItemInfoPro.VegetationItemID); for (int j = 0; j <= vegetationInstanceList.Length - 1; j++) { Matrix4x4 vegetationItemMatrix = vegetationInstanceList[j].Matrix; Vector3 position = MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix); Vector3 scale = MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix); Quaternion rotation = MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix); ItemSelectorInstanceInfo itemSelectorInstanceInfo = new ItemSelectorInstanceInfo { Position = position, Scale = scale, Rotation = rotation }; GameObject newCollider = colliderManager.ColliderPool.GetObject(itemSelectorInstanceInfo); newCollider.hideFlags = HideFlags.None; newCollider.transform.SetParent(rootItem.transform, true); SetNavmeshArea(newCollider, vegetationItemInfoPro.NavMeshArea); if (SetBakedCollidersStatic) { SetStatic(newCollider); } if (ConvertBakedCollidersToMesh) { CreateNavMeshColliderMeshes(newCollider); } colliderCount++; } vegetationCell.ClearCache(); } VegetationSystemPro.ClearCache(vegetationItemInfoPro.VegetationItemID); #if UNITY_EDITOR if (!Application.isPlaying) { EditorUtility.ClearProgressBar(); } #endif if (colliderCount == 0) { DestroyImmediate(rootItem); } }
public void GenerateSplatMap(bool clearLockedTextures, IVegetationStudioTerrain iVegetationStudioTerrain) { if (!VegetationSystemPro) { return; } VegetationSystemPro.ClearCache(iVegetationStudioTerrain.TerrainBounds); PrepareTextureCurves(); float worldspaceMinHeight = VegetationSystemPro.VegetationSystemBounds.center.y - VegetationSystemPro.VegetationSystemBounds.extents.y; float worldspaceSeaLevel = worldspaceMinHeight + VegetationSystemPro.SeaLevel; float worldspaceMaxHeight = VegetationSystemPro.VegetationSystemBounds.center.y + VegetationSystemPro.VegetationSystemBounds.extents.y; float heightCurveSampleHeight = worldspaceMaxHeight - worldspaceSeaLevel; VegetationPackagePro defaultBiomeVegetationPackagePro = VegetationSystemPro.GetVegetationPackageFromBiome(BiomeType.Default); if (defaultBiomeVegetationPackagePro == null) { Debug.LogWarning("You need a default biome in order to generate splatmaps. "); return; } iVegetationStudioTerrain.PrepareSplatmapGeneration(clearLockedTextures); iVegetationStudioTerrain.GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds, BiomeType.Default, null, defaultBiomeVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures); List <BiomeType> additionalBiomeList = VegetationSystemPro.GetAdditionalBiomeList(); List <VegetationPackagePro> additionalVegetationPackageList = new List <VegetationPackagePro>(); for (int i = 0; i <= additionalBiomeList.Count - 1; i++) { additionalVegetationPackageList.Add( VegetationSystemPro.GetVegetationPackageFromBiome(additionalBiomeList[i])); } BiomeSortOrderComparer biomeSortOrderComparer = new BiomeSortOrderComparer(); additionalVegetationPackageList.Sort(biomeSortOrderComparer); for (int i = 0; i <= additionalVegetationPackageList.Count - 1; i++) { VegetationPackagePro currentVegetationPackagePro = additionalVegetationPackageList[i]; if (!currentVegetationPackagePro.GenerateBiomeSplamap) { continue; } List <PolygonBiomeMask> biomeMaskList = VegetationStudioManager.GetBiomeMasks(currentVegetationPackagePro.BiomeType); iVegetationStudioTerrain.GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds, currentVegetationPackagePro.BiomeType, biomeMaskList, currentVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures); } JobHandle.ScheduleBatchedJobs(); iVegetationStudioTerrain.CompleteSplatmapGeneration(); DisposeTextureCurves(); }
public void GenerateSplatMap(bool clearLockedTextures) { if (!VegetationSystemPro) { return; } VegetationSystemPro.ClearCache(); List <IVegetationStudioTerrain> overlapTerrainList = GetOverlapTerrainList(VegetationSystemPro.VegetationSystemBounds); PrepareTextureCurves(); float worldspaceMinHeight = VegetationSystemPro.VegetationSystemBounds.center.y - VegetationSystemPro.VegetationSystemBounds.extents.y; float worldspaceSeaLevel = worldspaceMinHeight + VegetationSystemPro.SeaLevel; float worldspaceMaxHeight = VegetationSystemPro.VegetationSystemBounds.center.y + VegetationSystemPro.VegetationSystemBounds.extents.y; float heightCurveSampleHeight = worldspaceMaxHeight - worldspaceSeaLevel; VegetationPackagePro defaultBiomeVegetationPackagePro = VegetationSystemPro.GetVegetationPackageFromBiome(BiomeType.Default); if (defaultBiomeVegetationPackagePro == null) { Debug.LogWarning("You need a default biome in order to generate splatmaps. "); return; } int terrainCount = overlapTerrainList.Count; for (int i = 0; i <= overlapTerrainList.Count - 1; i++) { overlapTerrainList[i].PrepareSplatmapGeneration(clearLockedTextures); #if UNITY_EDITOR EditorUtility.DisplayProgressBar("Prepare generation", "Terrain " + (i + 1) + "/" + terrainCount, (i + 1) / (float)terrainCount); #endif } for (int i = 0; i <= overlapTerrainList.Count - 1; i++) { overlapTerrainList[i].GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds, BiomeType.Default, null, defaultBiomeVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures); #if UNITY_EDITOR EditorUtility.DisplayProgressBar("Generating default biome", "Terrain " + (i + 1) + "/" + terrainCount, (i + 1) / (float)terrainCount); #endif } List <BiomeType> additionalBiomeList = VegetationSystemPro.GetAdditionalBiomeList(); List <VegetationPackagePro> additionalVegetationPackageList = new List <VegetationPackagePro>(); for (int i = 0; i <= additionalBiomeList.Count - 1; i++) { additionalVegetationPackageList.Add( VegetationSystemPro.GetVegetationPackageFromBiome(additionalBiomeList[i])); } BiomeSortOrderComparer biomeSortOrderComparer = new BiomeSortOrderComparer(); additionalVegetationPackageList.Sort(biomeSortOrderComparer); for (int i = 0; i <= additionalVegetationPackageList.Count - 1; i++) { VegetationPackagePro currentVegetationPackagePro = additionalVegetationPackageList[i]; List <PolygonBiomeMask> biomeMaskList = VegetationStudioManager.GetBiomeMasks(currentVegetationPackagePro.BiomeType); for (int j = 0; j <= overlapTerrainList.Count - 1; j++) { overlapTerrainList[j].GenerateSplatMapBiome(VegetationSystemPro.VegetationSystemBounds, currentVegetationPackagePro.BiomeType, biomeMaskList, currentVegetationPackagePro.TerrainTextureSettingsList, heightCurveSampleHeight, worldspaceSeaLevel, clearLockedTextures); } } JobHandle.ScheduleBatchedJobs(); for (int i = 0; i <= overlapTerrainList.Count - 1; i++) { #if UNITY_EDITOR EditorUtility.DisplayProgressBar("Updating terrain", "Terrain " + (i + 1) + "/" + terrainCount, (i + 1) / (float)terrainCount); #endif overlapTerrainList[i].CompleteSplatmapGeneration(); } #if UNITY_EDITOR EditorUtility.ClearProgressBar(); #endif DisposeTextureCurves(); }