void DoAddPersistentStorage(VegetationSystem _vegetationSystem) { _vegetationSystem.AutomaticWakeup = true; // NB seems redundant to recurse into parent object - but this is needed to get the terrain name GameObject parentTerrainGo = _vegetationSystem.gameObject.transform.parent.gameObject; PersistentVegetationStorage _persistentVegetationStorage = parentTerrainGo.GetComponentInChildren <PersistentVegetationStorage>(); PersistentVegetationStoragePackage newPersistentVegetationStoragePackage = ScriptableObject.CreateInstance <PersistentVegetationStoragePackage>(); AssetDatabase.CreateAsset(newPersistentVegetationStoragePackage, _assetsPath + "/" + parentTerrainGo.name + _DEFAULT_SUFFIX + ".asset"); _persistentVegetationStorage.PersistentVegetationStoragePackage = newPersistentVegetationStoragePackage; // initialize _persistentVegetationStorage.InitializePersistentStorage(); if (_debugToLog) { Debug.Log("Added storage asset for " + parentTerrainGo.name); } if (_autoBake) { if (_debugToLog) { Debug.Log("Auto Baking " + parentTerrainGo.name); } //if (_vegetationSystem.GetSleepMode()) //{ _vegetationSystem.SetSleepMode(false); // wake up VegetationSystem, needed for prefab //} // now bake List <string> vegetationItemIdList = VegetationPackageEditorTools.CreateVegetationInfoIdList(_persistentVegetationStorage.VegetationSystem.CurrentVegetationPackage); for (int i = 0; i <= vegetationItemIdList.Count - 1; i++) { _persistentVegetationStorage.BakeVegetationItem(vegetationItemIdList[i]); } _persistentVegetationStorage.VegetationSystem.DelayedClearVegetationCellCache(); EditorUtility.SetDirty(_persistentVegetationStorage.PersistentVegetationStoragePackage); EditorUtility.SetDirty(_persistentVegetationStorage.VegetationSystem.CurrentVegetationPackage); if (_debugToLog) { Debug.Log("Finished Baking for " + parentTerrainGo.name); } } }
public override void OnInspectorGUI() { _vegetationPackagePro = (VegetationPackagePro)target; base.OnInspectorGUI(); //EditorUtility.SetDirty(target); for (int i = 0; i <= _vegetationPackagePro.VegetationInfoList.Count - 1; i++) { bool changed = false; VegetationItemInfoPro vegetationItemInfo = _vegetationPackagePro.VegetationInfoList[i]; if (vegetationItemInfo.VegetationItemID == "") { vegetationItemInfo.VegetationItemID = System.Guid.NewGuid().ToString(); changed = true; } if (changed) { EditorUtility.SetDirty(_vegetationPackagePro); } } GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox( "To edit an vegetation package add it to a vegetation system pro component", MessageType.Info); GUILayout.EndVertical(); GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Biome", LabelStyle); EditorGUI.BeginDisabledGroup(true); _vegetationPackagePro.BiomeType = (BiomeType)EditorGUILayout.EnumPopup("Select biome", _vegetationPackagePro.BiomeType); EditorGUI.EndDisabledGroup(); GUILayout.EndVertical(); if (_vegetationPackagePro.VegetationInfoList.Count > 0) { List <string> vegetationItemIdList = VegetationPackageEditorTools.CreateVegetationInfoIdList(_vegetationPackagePro); VegetationPackageEditorTools.DrawVegetationItemSelector(_vegetationPackagePro, vegetationItemIdList, 60, ref _selectedVegetationItem); VegetationItemInfoPro vegetationItemInfoPro = _vegetationPackagePro.GetVegetationInfo(_selectedVegetationItem); GUILayout.BeginHorizontal(); EditorGUILayout.LabelField("VegetationItemID", LabelStyle); EditorGUILayout.SelectableLabel(vegetationItemInfoPro.VegetationItemID); GUILayout.EndHorizontal(); } else { GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox( "Vegetation package has no vegetation items configured", MessageType.Info); GUILayout.EndVertical(); } if (_vegetationPackagePro.TerrainTextureCount > 0) { EditorGUILayout.LabelField("Terrain textures", LabelStyle); GUIContent[] textureImageButtons = new GUIContent[_vegetationPackagePro.TerrainTextureList.Count]; for (int i = 0; i <= _vegetationPackagePro.TerrainTextureList.Count - 1; i++) { var textureItemTexture = AssetPreview.GetAssetPreview(_vegetationPackagePro.TerrainTextureList[i].Texture); Texture2D convertedTexture = new Texture2D(2, 2, TextureFormat.ARGB32, true, true); if (textureItemTexture) { convertedTexture.LoadImage(textureItemTexture.EncodeToPNG()); } textureImageButtons[i] = new GUIContent { image = convertedTexture }; } int imageWidth = 60; int columns = Mathf.FloorToInt((EditorGUIUtility.currentViewWidth - imageWidth / 2f) / imageWidth); int rows = Mathf.CeilToInt((float)textureImageButtons.Length / columns); int gridHeight = (rows) * imageWidth; _currentTextureItem = GUILayout.SelectionGrid(_currentTextureItem, textureImageButtons, columns, GUILayout.MaxWidth(columns * imageWidth), GUILayout.MaxHeight(gridHeight)); GUIStyle variantStyle = new GUIStyle(EditorStyles.helpBox); GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Terrain layer: " + (_currentTextureItem + 1).ToString(), LabelStyle); EditorGUI.BeginDisabledGroup(true); _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].Enabled = EditorGUILayout.Toggle("Enable", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].Enabled); EditorGUILayout.BeginHorizontal(variantStyle); EditorGUILayout.LabelField("Texture " + (_currentTextureItem + 1).ToString() + " Height", LabelStyle, GUILayout.Width(150)); _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureHeightCurve = EditorGUILayout.CurveField(_vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureHeightCurve, Color.green, new Rect(0, 0, 1, 1), GUILayout.Height(75)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(variantStyle); EditorGUILayout.LabelField("Texture " + (_currentTextureItem + 1).ToString() + " Steepness", LabelStyle, GUILayout.Width(150)); _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureSteepnessCurve = EditorGUILayout.CurveField(_vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureSteepnessCurve, Color.green, new Rect(0, 0, 1, 1), GUILayout.Height(75)); EditorGUILayout.EndHorizontal(); _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].UseNoise = EditorGUILayout.Toggle("Use perlin noise", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].UseNoise); if (_vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].UseNoise) { _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].InverseNoise = EditorGUILayout.Toggle("Inverse noise", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].InverseNoise); _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseScale = EditorGUILayout.Slider("Noise scale", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseScale, 1, 50f); _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseOffset = EditorGUILayout.Vector2Field("Noise offset", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].NoiseOffset); } _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureWeight = EditorGUILayout.Slider("Texture weight", _vegetationPackagePro.TerrainTextureSettingsList[_currentTextureItem].TextureWeight, 0, 5f); EditorGUI.EndDisabledGroup(); GUILayout.EndVertical(); } else { GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox( "Vegetation package has no textures configured", MessageType.Info); GUILayout.EndVertical(); } }
private void DrawSettingsInspector() { VegetationSystemPro vegetationSystemPro = _runtimePrefabSpawner.VegetationSystemPro; if (vegetationSystemPro.VegetationPackageProList.Count == 0) { EditorGUILayout.HelpBox( "There is no vegetation package/biome in the vegetation system", MessageType.Warning); return; } GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle); string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count]; for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++) { if (vegetationSystemPro.VegetationPackageProList[i]) { packageNameList[i] = (i + 1).ToString() + " " + vegetationSystemPro.VegetationPackageProList[i].PackageName; } else { packageNameList[i] = "Not found"; } } EditorGUI.BeginChangeCheck(); _runtimePrefabSpawner.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package", _runtimePrefabSpawner.VegetationPackageIndex, packageNameList); if (EditorGUI.EndChangeCheck()) { SetSceneDirty(); } GUILayout.EndVertical(); VegetationPackagePro vegetationPackagePro = vegetationSystemPro.VegetationPackageProList[_runtimePrefabSpawner.VegetationPackageIndex]; if (vegetationPackagePro == null) { return; } if (vegetationPackagePro.VegetationInfoList.Count == 0) { return; } GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Select Vegetation Item", LabelStyle); EditorGUI.BeginChangeCheck(); _selectedVegetationTypeIndex = GUILayout.SelectionGrid(_selectedVegetationTypeIndex, VegetationTypeNames, 3, EditorStyles.toolbarButton); if (EditorGUI.EndChangeCheck()) { _selectedGridIndex = 0; } VegetationPackageEditorTools.VegetationItemTypeSelection vegetationItemTypeSelection = VegetationPackageEditorTools.GetVegetationItemTypeSelection(_selectedVegetationTypeIndex); int selectionCount = 0; VegetationPackageEditorTools.DrawVegetationItemSelector(vegetationSystemPro, vegetationPackagePro, ref _selectedGridIndex, ref _vegIndex, ref selectionCount, vegetationItemTypeSelection, 70); if (_lastVegIndex != _vegIndex) { GUI.FocusControl(null); } _lastVegIndex = _vegIndex; GUILayout.EndVertical(); VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[_vegIndex]; if (vegetationItemInfoPro == null) { return; } GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Selected item", vegetationItemInfoPro.Name); if (GUILayout.Button("Add run-time prefab rule")) { RuntimePrefabRule newRuntimePrefabRule = new RuntimePrefabRule(); newRuntimePrefabRule.SetSeed(); vegetationItemInfoPro.RuntimePrefabRuleList.Add(newRuntimePrefabRule); _runtimePrefabSpawner.RefreshRuntimePrefabs(); EditorUtility.SetDirty(vegetationPackagePro); SetSceneDirty(); } GUILayout.EndVertical(); for (int i = 0; i <= vegetationItemInfoPro.RuntimePrefabRuleList.Count - 1; i++) { RuntimePrefabRule runtimePrefabRule = vegetationItemInfoPro.RuntimePrefabRuleList[i]; EditorGUI.BeginChangeCheck(); GUILayout.BeginVertical("box"); runtimePrefabRule.RuntimePrefab = EditorGUILayout.ObjectField("Runtime prefab", runtimePrefabRule.RuntimePrefab, typeof(GameObject), true) as GameObject; var prefabTexture = AssetPreview.GetAssetPreview(runtimePrefabRule.RuntimePrefab); Texture2D convertedPrefabTexture = new Texture2D(2, 2, TextureFormat.ARGB32, true, true); if (Application.isPlaying) { convertedPrefabTexture = prefabTexture; } else { if (prefabTexture) { convertedPrefabTexture.LoadImage(prefabTexture.EncodeToPNG()); } } if (convertedPrefabTexture) { Rect space = GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.Height(convertedPrefabTexture.height)); float width = space.width; space.xMin = (width - convertedPrefabTexture.width); if (space.xMin < 0) { space.xMin = 0; } space.width = convertedPrefabTexture.width; space.height = convertedPrefabTexture.height; EditorGUI.DrawPreviewTexture(space, convertedPrefabTexture); } runtimePrefabRule.SpawnFrequency = EditorGUILayout.Slider("Spawn frequency", runtimePrefabRule.SpawnFrequency, 0, 1f); runtimePrefabRule.PrefabScale = EditorGUILayout.Vector3Field("Scale", runtimePrefabRule.PrefabScale); runtimePrefabRule.UseVegetationItemScale = EditorGUILayout.Toggle("Add vegetation item scale", runtimePrefabRule.UseVegetationItemScale); runtimePrefabRule.PrefabRotation = EditorGUILayout.Vector3Field("Rotation", runtimePrefabRule.PrefabRotation); runtimePrefabRule.PrefabOffset = EditorGUILayout.Vector3Field("Offset", runtimePrefabRule.PrefabOffset); runtimePrefabRule.PrefabLayer = EditorGUILayout.LayerField("Prefab layer", runtimePrefabRule.PrefabLayer); runtimePrefabRule.Seed = EditorGUILayout.IntSlider("Seed", runtimePrefabRule.Seed, 0, 99); runtimePrefabRule.UsePool = EditorGUILayout.Toggle("Use pooling system", runtimePrefabRule.UsePool); runtimePrefabRule.DistanceFactor = EditorGUILayout.Slider("Distance factor", runtimePrefabRule.DistanceFactor, 0, 1f); float currentDistance = vegetationSystemPro.VegetationSettings.GetVegetationDistance() * runtimePrefabRule.DistanceFactor; EditorGUILayout.LabelField("Current distance: " + currentDistance.ToString("F2") + " meters", LabelStyle); EditorGUILayout.HelpBox( "The distance from the camera where prefabs are instantiated. Distance is a factor of the current vegetation item draw distance.", MessageType.Info); if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(vegetationPackagePro); _runtimePrefabSpawner.RefreshRuntimePrefabs(); SetSceneDirty(); } if (GUILayout.Button("Remove run-time prefab rule")) { vegetationItemInfoPro.RuntimePrefabRuleList.Remove(runtimePrefabRule); _runtimePrefabSpawner.RefreshRuntimePrefabs(); GUILayout.EndVertical(); return; } GUILayout.EndVertical(); } }
private void DrawEditBiomeSplatmapsInspector() { VegetationSystemPro vegetationSystemPro = _terrainSystemPro.VegetationSystemPro; GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle); if (vegetationSystemPro.VegetationPackageProList.Count == 0) { EditorGUILayout.HelpBox("You need to add a biome/vegetation package in order to edit splatmap rules.", MessageType.Warning); GUILayout.EndVertical(); return; } string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count]; for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++) { if (vegetationSystemPro.VegetationPackageProList[i]) { packageNameList[i] = (i + 1).ToString() + " " + vegetationSystemPro.VegetationPackageProList[i].PackageName; } else { packageNameList[i] = "Not found"; } } EditorGUI.BeginChangeCheck(); _terrainSystemPro.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package", _terrainSystemPro.VegetationPackageIndex, packageNameList); if (EditorGUI.EndChangeCheck()) { } EditorGUILayout.HelpBox( "Select the biome to edit. Press the Generate Splatmap button to apply settings to the terrains. Only unity terrains are affected by this.", MessageType.Info); GUILayout.EndVertical(); GUILayout.BeginVertical("box"); if (GUILayout.Button("Generate biome splatmaps")) { _terrainSystemPro.GenerateSplatMap(false); _terrainSystemPro.ShowTerrainHeatmap(false); SetAllVegetationPackagesDirty(); SetSceneDirty(); } EditorGUILayout.HelpBox( "You can lock textures. These will not be not be removed when generating the splat.", MessageType.Info); if (GUILayout.Button("Generate biome splatmaps - clear locked textures")) { _terrainSystemPro.GenerateSplatMap(true); _terrainSystemPro.ShowTerrainHeatmap(false); SetAllVegetationPackagesDirty(); SetSceneDirty(); } GUILayout.EndVertical(); GUILayout.BeginVertical("box"); EditorGUI.BeginChangeCheck(); _terrainSystemPro.VegetationSystemPro.ShowHeatMap = EditorGUILayout.Toggle("Show heatmap", _terrainSystemPro.VegetationSystemPro.ShowHeatMap); if (EditorGUI.EndChangeCheck()) { _terrainSystemPro.ShowTerrainHeatmap(_terrainSystemPro.VegetationSystemPro.ShowHeatMap); SceneView.RepaintAll(); } EditorGUILayout.HelpBox( "Enable to show the terrain distribution for the selected texture. Noise is an estimate and will not be the same as when generated.", MessageType.Info); GUILayout.EndVertical(); VegetationPackagePro vegetationPackagePro = _terrainSystemPro.VegetationSystemPro.VegetationPackageProList[ _terrainSystemPro.VegetationPackageIndex]; GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox("Automatic terrain texture distribution is done based on the curve settings for height over water level and steepness(angle) of the terrain", MessageType.Info); GUILayout.EndVertical(); GUILayout.BeginVertical("box"); _terrainSystemPro.VegetationSystemPro.ShowTerrainTextures = EditorGUILayout.Toggle("Show terrain textures", _terrainSystemPro.VegetationSystemPro.ShowTerrainTextures); EditorGUILayout.HelpBox("The textures on the first terrain, not in the package will show in the list below. These are the actual textures used.", MessageType.Info); GUILayout.EndVertical(); //GUILayout.BeginVertical("box"); //EditorGUILayout.LabelField("Terrain height", LabelStyle); //_terrainSystem.GetVegetationPackage().AutomaticMaxCurveHeight = // EditorGUILayout.Toggle("Use max height in terrain", _terrainSystem.GetVegetationPackage().AutomaticMaxCurveHeight); //if (!_terrainSystem.GetVegetationPackage().AutomaticMaxCurveHeight) //{ // _terrainSystem.GetVegetationPackage().MaxCurveHeight = EditorGUILayout.FloatField("Max curve height", _terrainSystem.GetVegetationPackage().MaxCurveHeight); // EditorGUILayout.LabelField("Max possible terrain height: " + _terrainSystem.VegetationSystem.UnityTerrainData.size.y.ToString(CultureInfo.InvariantCulture) + " meters", LabelStyle); // if (GUILayout.Button("Calculate max height in terrain.")) // { // _terrainSystem.GetVegetationPackage().MaxCurveHeight = _terrainSystem.VegetationSystem.UnityTerrainData.MaxTerrainHeight; // EditorUtility.SetDirty(_terrainSystem.GetVegetationPackage()); // } // if (_terrainSystem.GetVegetationPackage().MaxCurveHeight < 1) // { // EditorGUILayout.HelpBox("You need to set or calculate terrain max height in order to set the max height value for the curves.", MessageType.Error); // } //} //EditorGUILayout.HelpBox("Max curve height sets the height at max curve value. For easiest control of the curves it should be set to just above max height in current terrain.", MessageType.Info); //GUILayout.EndVertical(); if (vegetationPackagePro.TerrainTextureCount > 0) { if (_terrainSystemPro.VegetationPackageTextureIndex > vegetationPackagePro.TerrainTextureCount) { _terrainSystemPro.VegetationPackageTextureIndex = 0; } EditorGUI.BeginChangeCheck(); GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Select terrain texture", LabelStyle); GUIContent[] textureImageButtons = new GUIContent[vegetationPackagePro.TerrainTextureSettingsList.Count]; for (int i = 0; i <= vegetationPackagePro.TerrainTextureSettingsList.Count - 1; i++) { if (_terrainSystemPro.VegetationSystemPro.ShowTerrainTextures) { textureImageButtons[i] = new GUIContent { image = AssetPreviewCache.GetAssetPreview(_terrainSystemPro.GetTerrainTexture(i)) }; } else { textureImageButtons[i] = new GUIContent { image = AssetPreviewCache.GetAssetPreview(vegetationPackagePro.TerrainTextureList[i].Texture) }; } } int imageWidth = 80; int columns = Mathf.FloorToInt((EditorGUIUtility.currentViewWidth - 50) / imageWidth); int rows = Mathf.CeilToInt((float)textureImageButtons.Length / columns); int gridHeight = (rows) * imageWidth; _terrainSystemPro.VegetationPackageTextureIndex = GUILayout.SelectionGrid(_terrainSystemPro.VegetationPackageTextureIndex, textureImageButtons, columns, GUILayout.MaxWidth(columns * imageWidth), GUILayout.MaxHeight(gridHeight)); GUILayout.EndVertical(); if (EditorGUI.EndChangeCheck()) { _terrainSystemPro.UpdateTerrainHeatmap(); } //if (_terrainSystem.VegetationSystem) //{ // GUILayout.BeginVertical("box"); // EditorGUILayout.LabelField("Visualize height/steepness in terrain", LabelStyle); // EditorGUI.BeginChangeCheck(); // bool overrideMaterial = EditorGUILayout.Toggle("Show heatmap", _terrainSystem.VegetationSystem.TerrainMaterialOverridden); // EditorGUILayout.HelpBox("Enabling heatmap will show the spawn area of the selected texture based on the current height and steepness curves.", MessageType.Info); // if (EditorGUI.EndChangeCheck()) // { // if (overrideMaterial) // { // _terrainSystem.UpdateHeatmapMaterial(_currentTextureItem); // _terrainSystem.VegetationSystem.OverrideTerrainMaterial(_terrainSystem.TerrainHeatMapMaterial); // EditorUtility.SetDirty(_terrainSystem.VegetationSystem); // } // else // { // _terrainSystem.VegetationSystem.RestoreTerrainMaterial(); // } // } // GUILayout.EndVertical(); // _terrainSystem.UpdateHeatmapMaterial(_currentTextureItem); //} GUILayout.BeginVertical("box"); TerrainTextureSettings terrainTextureSettings = vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex]; EditorGUI.BeginChangeCheck(); vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].Enabled = EditorGUILayout.Toggle("Use with auto splat generation", vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].Enabled); EditorGUI.BeginDisabledGroup( vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].Enabled); vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].LockTexture = EditorGUILayout.Toggle("Lock texture", vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].LockTexture); EditorGUI.EndDisabledGroup(); EditorGUILayout.HelpBox("Locked textures are kept while generating splatmaps", MessageType.Info); _terrainSystemPro.ShowCurvesMenu = VegetationPackageEditorTools.DrawHeader("Height/Steepness rules", _terrainSystemPro.ShowCurvesMenu); if (_terrainSystemPro.ShowCurvesMenu) { EditorGUILayout.LabelField("Texture " + (_terrainSystemPro.VegetationPackageTextureIndex + 1).ToString() + " Height", LabelStyle, GUILayout.Width(150)); float height = vegetationSystemPro.VegetationSystemBounds.size.y - vegetationSystemPro.SeaLevel; _heightCurveEditor.MaxValue = height; if (_heightCurveEditor.EditCurve(vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].TextureHeightCurve, this)) { _terrainSystemPro.UpdateTerrainHeatmap(); EditorUtility.SetDirty(vegetationPackagePro); } EditorGUILayout.LabelField("Texture " + (_terrainSystemPro.VegetationPackageTextureIndex + 1).ToString() + " Steepness", LabelStyle, GUILayout.Width(150)); if (_steepnessCurveEditor.EditCurve(vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].TextureSteepnessCurve, this)) { _terrainSystemPro.UpdateTerrainHeatmap(); EditorUtility.SetDirty(vegetationPackagePro); } } ; _terrainSystemPro.ShowNoiseMenu = VegetationPackageEditorTools.DrawHeader("Noise/Concave/convex rules", _terrainSystemPro.ShowNoiseMenu); if (_terrainSystemPro.ShowNoiseMenu) { vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .UseNoise = EditorGUILayout.Toggle("Use perlin noise", vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .UseNoise); if (vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .UseNoise) { vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .InverseNoise = EditorGUILayout.Toggle("Inverse noise", vegetationPackagePro .TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .InverseNoise); vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .NoiseScale = EditorGUILayout.Slider("Noise scale", vegetationPackagePro .TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex].NoiseScale, 1, 200f); vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .NoiseOffset = EditorGUILayout.Vector2Field("Noise offset", vegetationPackagePro .TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .NoiseOffset); } vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .TextureWeight = EditorGUILayout.Slider("Texture weight", vegetationPackagePro.TerrainTextureSettingsList[_terrainSystemPro.VegetationPackageTextureIndex] .TextureWeight, 0, 5f); terrainTextureSettings.ConcaveEnable = EditorGUILayout.Toggle("Use concave rules", terrainTextureSettings.ConcaveEnable); terrainTextureSettings.ConvexEnable = EditorGUILayout.Toggle("Use convex rules", terrainTextureSettings.ConvexEnable); if (terrainTextureSettings.ConcaveEnable || terrainTextureSettings.ConvexEnable) { terrainTextureSettings.ConcaveMode = (ConcaveMode)EditorGUILayout.EnumPopup("Blend mode", terrainTextureSettings.ConcaveMode); EditorGUILayout.HelpBox( "Additive will add convex/concave areas in additon to areas selected by heigh/streepness. Blend will show areas that have all characteristics.", MessageType.Info); terrainTextureSettings.ConcaveAverage = EditorGUILayout.Toggle("Average samples", terrainTextureSettings.ConcaveAverage); terrainTextureSettings.ConcaveMinHeightDifference = EditorGUILayout.Slider( "Min height difference", terrainTextureSettings.ConcaveMinHeightDifference, 0.1f, 10f); terrainTextureSettings.ConcaveDistance = EditorGUILayout.Slider("Distance", terrainTextureSettings.ConcaveDistance, 0f, 20f); } } if (EditorGUI.EndChangeCheck()) { _terrainSystemPro.UpdateTerrainHeatmap(); EditorUtility.SetDirty(vegetationPackagePro); } GUILayout.EndVertical(); } else { GUILayout.BeginVertical("box"); EditorGUILayout.HelpBox( "Vegetation package has no textures", MessageType.Warning); GUILayout.EndVertical(); } }
public override void OnInspectorGUI() { HelpTopic = "scene-vegetation-baker"; _sceneVegetationBaker = (SceneVegetationBaker)target; ShowLogo = false; base.OnInspectorGUI(); if (!_sceneVegetationBaker.VegetationSystemPro) { EditorGUILayout.HelpBox( "The SceneVegetationBaker Component needs to be added to a GameObject with a VegetationSystemPro Component.", MessageType.Error); return; } VegetationSystemPro vegetationSystemPro = _sceneVegetationBaker.VegetationSystemPro; GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Select biome/vegetation package", LabelStyle); string[] packageNameList = new string[vegetationSystemPro.VegetationPackageProList.Count]; for (int i = 0; i <= vegetationSystemPro.VegetationPackageProList.Count - 1; i++) { if (vegetationSystemPro.VegetationPackageProList[i]) { packageNameList[i] = (i + 1).ToString() + " " + vegetationSystemPro.VegetationPackageProList[i].PackageName + " (" + vegetationSystemPro.VegetationPackageProList[i].BiomeType.ToString() + ")";; } else { packageNameList[i] = "Not found"; } } EditorGUI.BeginChangeCheck(); _sceneVegetationBaker.VegetationPackageIndex = EditorGUILayout.Popup("Selected vegetation package", _sceneVegetationBaker.VegetationPackageIndex, packageNameList); if (EditorGUI.EndChangeCheck()) { SetSceneDirty(); } GUILayout.EndVertical(); VegetationPackagePro vegetationPackagePro = vegetationSystemPro.VegetationPackageProList[_sceneVegetationBaker.VegetationPackageIndex]; if (vegetationPackagePro == null) { return; } if (vegetationPackagePro.VegetationInfoList.Count == 0) { return; } GUILayout.BeginVertical("box"); EditorGUILayout.LabelField("Select Vegetation Item", LabelStyle); EditorGUI.BeginChangeCheck(); _selectedVegetationTypeIndex = GUILayout.SelectionGrid(_selectedVegetationTypeIndex, VegetationTypeNames, 3, EditorStyles.toolbarButton); if (EditorGUI.EndChangeCheck()) { _selectedGridIndex = 0; } VegetationPackageEditorTools.VegetationItemTypeSelection vegetationItemTypeSelection = VegetationPackageEditorTools.GetVegetationItemTypeSelection(_selectedVegetationTypeIndex); int selectionCount = 0; VegetationPackageEditorTools.DrawVegetationItemSelector(vegetationSystemPro, vegetationPackagePro, ref _selectedGridIndex, ref _vegIndex, ref selectionCount, vegetationItemTypeSelection, 70); if (_lastVegIndex != _vegIndex) { GUI.FocusControl(null); } _lastVegIndex = _vegIndex; GUILayout.EndVertical(); VegetationItemInfoPro vegetationItemInfoPro = vegetationPackagePro.VegetationInfoList[_vegIndex]; if (vegetationItemInfoPro == null) { return; } GUILayout.BeginVertical("box"); _sceneVegetationBaker.ExportStatic = EditorGUILayout.Toggle("Export as static objects", _sceneVegetationBaker.ExportStatic); GUILayout.EndVertical(); GUILayout.BeginVertical("box"); if (GUILayout.Button("Bake VegetationItem to scene")) { BakeVegetationToScene(vegetationItemInfoPro); } GUILayout.EndVertical(); }