public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit; if (!terrain.gameObject) { return; } Terrain terComponent = (Terrain) terrain.GetComponent(typeof(Terrain)); if (!terrain.guiSkin) { terrain.guiSkin = (GUISkin) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/TerrainErosionEditorSkin.guiskin", typeof(GUISkin)); terrain.createIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/createIcon.png", typeof(Texture2D)); terrain.erodeIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/erodeIcon.png", typeof(Texture2D)); terrain.textureIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/textureIcon.png", typeof(Texture2D)); terrain.mooreIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/mooreIcon.png", typeof(Texture2D)); terrain.vonNeumannIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/vonNeumannIcon.png", typeof(Texture2D)); terrain.mountainsIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/mountainsIcon.png", typeof(Texture2D)); terrain.hillsIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/hillsIcon.png", typeof(Texture2D)); terrain.plateausIcon = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/plateausIcon.png", typeof(Texture2D)); terrain.defaultTexture = (Texture2D) Resources.LoadAssetAtPath("Assets/TerrainToolkit/Textures/default.jpg", typeof(Texture2D)); } if (!terrain.presetsInitialised) { terrain.addPresets(); } if (terComponent == null) { EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("The GameObject that Terrain Toolkit is attached to", "errorText"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("does not have a Terrain component.", "errorText"); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Please attach a Terrain component.", "errorText"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); return; } if (terrain.heightBlendPoints == null) { terrain.heightBlendPoints = new List<float>(); } Rect buttonRect; EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUIContent[] toolbarOptions = new GUIContent[3]; toolbarOptions[0] = new GUIContent("Create", terrain.createIcon); toolbarOptions[1] = new GUIContent("Erode", terrain.erodeIcon); toolbarOptions[2] = new GUIContent("Texture", terrain.textureIcon); terrain.toolModeInt = GUILayout.Toolbar(terrain.toolModeInt, toolbarOptions); EditorGUILayout.EndHorizontal(); switch (terrain.toolModeInt) { // -------------------------------------------------------------------------------------------------------- GENERATOR TOOLS case 0: EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); string[] generatorOptions = new string[5]; generatorOptions[0] = "Voronoi"; generatorOptions[1] = "Fractal"; generatorOptions[2] = "Perlin"; generatorOptions[3] = "Smooth"; generatorOptions[4] = "Normalise"; terrain.generatorTypeInt = GUILayout.Toolbar(terrain.generatorTypeInt, generatorOptions); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); switch (terrain.generatorTypeInt) { case 0: // Voronoi... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] voronoiPresetNames = new string[terrain.voronoiPresets.Count + 1]; int[] voronoiPresetInts = new int[terrain.voronoiPresets.Count + 1]; voronoiPresetNames[0] = "None"; TerrainToolkit.voronoiPresetData voronoiPreset; for (i = 1; i <= terrain.voronoiPresets.Count; i++) { voronoiPreset = (TerrainToolkit.voronoiPresetData) terrain.voronoiPresets[i - 1]; voronoiPresetNames[i] = voronoiPreset.presetName; voronoiPresetInts[i] = i; } terrain.voronoiPresetId = EditorGUILayout.IntPopup(terrain.voronoiPresetId, voronoiPresetNames, voronoiPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.voronoiPresetId > 0) { voronoiPreset = (TerrainToolkit.voronoiPresetData) terrain.voronoiPresets[terrain.voronoiPresetId - 1]; terrain.setVoronoiPreset(voronoiPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; Rect featureRect = EditorGUILayout.BeginHorizontal(); featureRect.x = 110; featureRect.width = 120; featureRect.height = 20; EditorGUILayout.PrefixLabel("Feature type"); GUIContent[] featureStates = new GUIContent[3]; featureStates[0] = new GUIContent(terrain.mountainsIcon); featureStates[1] = new GUIContent(terrain.hillsIcon); featureStates[2] = new GUIContent(terrain.plateausIcon); terrain.voronoiTypeInt = GUI.Toolbar(featureRect, terrain.voronoiTypeInt, featureStates); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Cells"); terrain.voronoiCells = (int) EditorGUILayout.Slider(terrain.voronoiCells, 2, 100); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Features"); terrain.voronoiFeatures = EditorGUILayout.Slider(terrain.voronoiFeatures, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Scale"); terrain.voronoiScale = EditorGUILayout.Slider(terrain.voronoiScale, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Blend"); terrain.voronoiBlend = EditorGUILayout.Slider(terrain.voronoiBlend, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); if (GUI.changed) { terrain.voronoiPresetId = 0; } EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Generate Voronoi Features")) { // Undo... Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Generator"); TerrainToolkit.GeneratorProgressDelegate generatorProgressDelegate = new TerrainToolkit.GeneratorProgressDelegate(updateGeneratorProgress); terrain.generateTerrain(generatorProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); break; case 1: // Diamond square... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] fractalPresetNames = new string[terrain.fractalPresets.Count + 1]; int[] fractalPresetInts = new int[terrain.fractalPresets.Count + 1]; fractalPresetNames[0] = "None"; TerrainToolkit.fractalPresetData fractalPreset; for (i = 1; i <= terrain.fractalPresets.Count; i++) { fractalPreset = (TerrainToolkit.fractalPresetData) terrain.fractalPresets[i - 1]; fractalPresetNames[i] = fractalPreset.presetName; fractalPresetInts[i] = i; } terrain.fractalPresetId = EditorGUILayout.IntPopup(terrain.fractalPresetId, fractalPresetNames, fractalPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.fractalPresetId > 0) { fractalPreset = (TerrainToolkit.fractalPresetData) terrain.fractalPresets[terrain.fractalPresetId - 1]; terrain.setFractalPreset(fractalPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Delta"); terrain.diamondSquareDelta = EditorGUILayout.Slider(terrain.diamondSquareDelta, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Blend"); terrain.diamondSquareBlend = EditorGUILayout.Slider(terrain.diamondSquareBlend, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed) { terrain.fractalPresetId = 0; } buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Generate Fractal Terrain")) { // Undo... Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Generator"); TerrainToolkit.GeneratorProgressDelegate generatorProgressDelegate = new TerrainToolkit.GeneratorProgressDelegate(updateGeneratorProgress); terrain.generateTerrain(generatorProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); break; case 2: // Perlin... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] perlinPresetNames = new string[terrain.perlinPresets.Count + 1]; int[] perlinPresetInts = new int[terrain.perlinPresets.Count + 1]; perlinPresetNames[0] = "None"; TerrainToolkit.perlinPresetData perlinPreset; for (i = 1; i <= terrain.perlinPresets.Count; i++) { perlinPreset = (TerrainToolkit.perlinPresetData) terrain.perlinPresets[i - 1]; perlinPresetNames[i] = perlinPreset.presetName; perlinPresetInts[i] = i; } terrain.perlinPresetId = EditorGUILayout.IntPopup(terrain.perlinPresetId, perlinPresetNames, perlinPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.perlinPresetId > 0) { perlinPreset = (TerrainToolkit.perlinPresetData) terrain.perlinPresets[terrain.perlinPresetId - 1]; terrain.setPerlinPreset(perlinPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Frequency"); terrain.perlinFrequency = EditorGUILayout.IntSlider(terrain.perlinFrequency, 1, 16); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Amplitude"); terrain.perlinAmplitude = EditorGUILayout.Slider(terrain.perlinAmplitude, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Octaves"); terrain.perlinOctaves = EditorGUILayout.IntSlider(terrain.perlinOctaves, 1, 12); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Blend"); terrain.perlinBlend = EditorGUILayout.Slider(terrain.perlinBlend, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed) { terrain.perlinPresetId = 0; } buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Generate Perlin Terrain")) { // Undo... Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Generator"); TerrainToolkit.GeneratorProgressDelegate generatorProgressDelegate = new TerrainToolkit.GeneratorProgressDelegate(updateGeneratorProgress); terrain.generateTerrain(generatorProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); break; case 3: // Smooth... EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.smoothIterations = (int) EditorGUILayout.Slider(terrain.smoothIterations, 1, 5); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Blend"); terrain.smoothBlend = EditorGUILayout.Slider(terrain.smoothBlend, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Smooth Terrain")) { // Undo... Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Smooth Terrain"); TerrainToolkit.GeneratorProgressDelegate generatorProgressDelegate = new TerrainToolkit.GeneratorProgressDelegate(updateGeneratorProgress); terrain.generateTerrain(generatorProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); break; case 4: // Normalise... EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Minimum height"); terrain.normaliseMin = EditorGUILayout.Slider(terrain.normaliseMin, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Maximum height"); terrain.normaliseMax = EditorGUILayout.Slider(terrain.normaliseMax, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Blend"); terrain.normaliseBlend = EditorGUILayout.Slider(terrain.normaliseBlend, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Normalise Terrain")) { // Undo... Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Normalise Terrain"); TerrainToolkit.GeneratorProgressDelegate generatorProgressDelegate = new TerrainToolkit.GeneratorProgressDelegate(updateGeneratorProgress); terrain.generateTerrain(generatorProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); break; } EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); drawAdvancedSettingsGUI(); break; // -------------------------------------------------------------------------------------------------------- EROSION TOOLS case 1: EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); string[] erosionOptions = new string[4]; erosionOptions[0] = "Thermal"; erosionOptions[1] = "Hydraulic"; erosionOptions[2] = "Tidal"; erosionOptions[3] = "Wind"; terrain.erosionTypeInt = GUILayout.Toolbar(terrain.erosionTypeInt, erosionOptions); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Filters"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); switch (terrain.erosionTypeInt) { case 0: // Thermal... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] thermalErosionPresetNames = new string[terrain.thermalErosionPresets.Count + 1]; int[] thermalErosionPresetInts = new int[terrain.thermalErosionPresets.Count + 1]; thermalErosionPresetNames[0] = "None"; TerrainToolkit.thermalErosionPresetData thermalErosionPreset; for (i = 1; i <= terrain.thermalErosionPresets.Count; i++) { thermalErosionPreset = (TerrainToolkit.thermalErosionPresetData) terrain.thermalErosionPresets[i - 1]; thermalErosionPresetNames[i] = thermalErosionPreset.presetName; thermalErosionPresetInts[i] = i; } terrain.thermalErosionPresetId = EditorGUILayout.IntPopup(terrain.thermalErosionPresetId, thermalErosionPresetNames, thermalErosionPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.thermalErosionPresetId > 0) { thermalErosionPreset = (TerrainToolkit.thermalErosionPresetData) terrain.thermalErosionPresets[terrain.thermalErosionPresetId - 1]; terrain.setThermalErosionPreset(thermalErosionPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.thermalIterations = (int) EditorGUILayout.Slider(terrain.thermalIterations, 1, 250); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Minimum slope"); terrain.thermalMinSlope = EditorGUILayout.Slider(terrain.thermalMinSlope, 0.01f, 89.99f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Falloff"); terrain.thermalFalloff = EditorGUILayout.Slider(terrain.thermalFalloff, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed) { terrain.thermalErosionPresetId = 0; } buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Apply thermal erosion")) { // Undo Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Erosion"); // Start time... DateTime startTime = DateTime.Now; TerrainToolkit.ErosionProgressDelegate erosionProgressDelegate = new TerrainToolkit.ErosionProgressDelegate(updateErosionProgress); terrain.erodeAllTerrain(erosionProgressDelegate); EditorUtility.ClearProgressBar(); TimeSpan processTime = DateTime.Now - startTime; Debug.Log("Process complete in: "+processTime.ToString()); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); break; case 1: // Hydraulic... Rect toggleRect = EditorGUILayout.BeginHorizontal(); toggleRect.x = 110; toggleRect.width = 180; toggleRect.height = 20; EditorGUILayout.PrefixLabel("Type"); string[] toggleStates = new string[3]; toggleStates[0] = "Fast"; toggleStates[1] = "Full"; toggleStates[2] = "Velocity"; terrain.hydraulicTypeInt = GUI.Toolbar(toggleRect, terrain.hydraulicTypeInt, toggleStates); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); switch (terrain.hydraulicTypeInt) { case 0: // Fast... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] fastHydraulicErosionPresetNames = new string[terrain.fastHydraulicErosionPresets.Count + 1]; int[] fastHydraulicErosionPresetInts = new int[terrain.fastHydraulicErosionPresets.Count + 1]; fastHydraulicErosionPresetNames[0] = "None"; TerrainToolkit.fastHydraulicErosionPresetData fastHydraulicErosionPreset; for (i = 1; i <= terrain.fastHydraulicErosionPresets.Count; i++) { fastHydraulicErosionPreset = (TerrainToolkit.fastHydraulicErosionPresetData) terrain.fastHydraulicErosionPresets[i - 1]; fastHydraulicErosionPresetNames[i] = fastHydraulicErosionPreset.presetName; fastHydraulicErosionPresetInts[i] = i; } terrain.fastHydraulicErosionPresetId = EditorGUILayout.IntPopup(terrain.fastHydraulicErosionPresetId, fastHydraulicErosionPresetNames, fastHydraulicErosionPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.fastHydraulicErosionPresetId > 0) { fastHydraulicErosionPreset = (TerrainToolkit.fastHydraulicErosionPresetData) terrain.fastHydraulicErosionPresets[terrain.fastHydraulicErosionPresetId - 1]; terrain.setFastHydraulicErosionPreset(fastHydraulicErosionPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.hydraulicIterations = (int) EditorGUILayout.Slider(terrain.hydraulicIterations, 1, 250); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Maximum slope"); terrain.hydraulicMaxSlope = EditorGUILayout.Slider(terrain.hydraulicMaxSlope, 0.0f, 89.99f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Falloff"); terrain.hydraulicFalloff = EditorGUILayout.Slider(terrain.hydraulicFalloff, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); if (GUI.changed) { terrain.fastHydraulicErosionPresetId = 0; } break; case 1: // Full... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] fullHydraulicErosionPresetNames = new string[terrain.fullHydraulicErosionPresets.Count + 1]; int[] fullHydraulicErosionPresetInts = new int[terrain.fullHydraulicErosionPresets.Count + 1]; fullHydraulicErosionPresetNames[0] = "None"; TerrainToolkit.fullHydraulicErosionPresetData fullHydraulicErosionPreset; for (i = 1; i <= terrain.fullHydraulicErosionPresets.Count; i++) { fullHydraulicErosionPreset = (TerrainToolkit.fullHydraulicErosionPresetData) terrain.fullHydraulicErosionPresets[i - 1]; fullHydraulicErosionPresetNames[i] = fullHydraulicErosionPreset.presetName; fullHydraulicErosionPresetInts[i] = i; } terrain.fullHydraulicErosionPresetId = EditorGUILayout.IntPopup(terrain.fullHydraulicErosionPresetId, fullHydraulicErosionPresetNames, fullHydraulicErosionPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.fullHydraulicErosionPresetId > 0) { fullHydraulicErosionPreset = (TerrainToolkit.fullHydraulicErosionPresetData) terrain.fullHydraulicErosionPresets[terrain.fullHydraulicErosionPresetId - 1]; terrain.setFullHydraulicErosionPreset(fullHydraulicErosionPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.hydraulicIterations = (int) EditorGUILayout.Slider(terrain.hydraulicIterations, 1, 250); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Rainfall"); terrain.hydraulicRainfall = EditorGUILayout.Slider(terrain.hydraulicRainfall, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Evaporation"); terrain.hydraulicEvaporation = EditorGUILayout.Slider(terrain.hydraulicEvaporation, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Solubility"); terrain.hydraulicSedimentSolubility = EditorGUILayout.Slider(terrain.hydraulicSedimentSolubility, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Saturation"); terrain.hydraulicSedimentSaturation = EditorGUILayout.Slider(terrain.hydraulicSedimentSaturation, 0, 1); EditorGUILayout.EndHorizontal(); if (GUI.changed) { terrain.fullHydraulicErosionPresetId = 0; } break; case 2: // Velocity... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] velocityHydraulicErosionPresetNames = new string[terrain.velocityHydraulicErosionPresets.Count + 1]; int[] velocityHydraulicErosionPresetInts = new int[terrain.velocityHydraulicErosionPresets.Count + 1]; velocityHydraulicErosionPresetNames[0] = "None"; TerrainToolkit.velocityHydraulicErosionPresetData velocityHydraulicErosionPreset; for (i = 1; i <= terrain.velocityHydraulicErosionPresets.Count; i++) { velocityHydraulicErosionPreset = (TerrainToolkit.velocityHydraulicErosionPresetData) terrain.velocityHydraulicErosionPresets[i - 1]; velocityHydraulicErosionPresetNames[i] = velocityHydraulicErosionPreset.presetName; velocityHydraulicErosionPresetInts[i] = i; } terrain.velocityHydraulicErosionPresetId = EditorGUILayout.IntPopup(terrain.velocityHydraulicErosionPresetId, velocityHydraulicErosionPresetNames, velocityHydraulicErosionPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.velocityHydraulicErosionPresetId > 0) { velocityHydraulicErosionPreset = (TerrainToolkit.velocityHydraulicErosionPresetData) terrain.velocityHydraulicErosionPresets[terrain.velocityHydraulicErosionPresetId - 1]; terrain.setVelocityHydraulicErosionPreset(velocityHydraulicErosionPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.hydraulicIterations = (int) EditorGUILayout.Slider(terrain.hydraulicIterations, 1, 250); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Rainfall"); terrain.hydraulicVelocityRainfall = EditorGUILayout.Slider(terrain.hydraulicVelocityRainfall, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Evaporation"); terrain.hydraulicVelocityEvaporation = EditorGUILayout.Slider(terrain.hydraulicVelocityEvaporation, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Solubility"); terrain.hydraulicVelocitySedimentSolubility = EditorGUILayout.Slider(terrain.hydraulicVelocitySedimentSolubility, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Saturation"); terrain.hydraulicVelocitySedimentSaturation = EditorGUILayout.Slider(terrain.hydraulicVelocitySedimentSaturation, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Velocity"); terrain.hydraulicVelocity = EditorGUILayout.Slider(terrain.hydraulicVelocity, 0, 10); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Momentum"); terrain.hydraulicMomentum = EditorGUILayout.Slider(terrain.hydraulicMomentum, 0, 10); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Entropy"); terrain.hydraulicEntropy = EditorGUILayout.Slider(terrain.hydraulicEntropy, 0, 1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Downcutting"); terrain.hydraulicDowncutting = EditorGUILayout.Slider(terrain.hydraulicDowncutting, 0, 1); EditorGUILayout.EndHorizontal(); if (GUI.changed) { terrain.velocityHydraulicErosionPresetId = 0; } break; } EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Apply hydraulic erosion")) { // Undo Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Erosion"); // Start time... DateTime startTime = DateTime.Now; TerrainToolkit.ErosionProgressDelegate erosionProgressDelegate = new TerrainToolkit.ErosionProgressDelegate(updateErosionProgress); terrain.erodeAllTerrain(erosionProgressDelegate); EditorUtility.ClearProgressBar(); TimeSpan processTime = DateTime.Now - startTime; Debug.Log("Process complete in: "+processTime.ToString()); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); break; case 2: // Tidal... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] tidalErosionPresetNames = new string[terrain.tidalErosionPresets.Count + 1]; int[] tidalErosionPresetInts = new int[terrain.tidalErosionPresets.Count + 1]; tidalErosionPresetNames[0] = "None"; TerrainToolkit.tidalErosionPresetData tidalErosionPreset; for (i = 1; i <= terrain.tidalErosionPresets.Count; i++) { tidalErosionPreset = (TerrainToolkit.tidalErosionPresetData) terrain.tidalErosionPresets[i - 1]; tidalErosionPresetNames[i] = tidalErosionPreset.presetName; tidalErosionPresetInts[i] = i; } terrain.tidalErosionPresetId = EditorGUILayout.IntPopup(terrain.tidalErosionPresetId, tidalErosionPresetNames, tidalErosionPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.tidalErosionPresetId > 0) { tidalErosionPreset = (TerrainToolkit.tidalErosionPresetData) terrain.tidalErosionPresets[terrain.tidalErosionPresetId - 1]; terrain.setTidalErosionPreset(tidalErosionPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.tidalIterations = (int) EditorGUILayout.Slider(terrain.tidalIterations, 1, 250); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Sea level"); terrain.tidalSeaLevel = EditorGUILayout.FloatField(terrain.tidalSeaLevel); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Tidal range"); terrain.tidalRangeAmount = EditorGUILayout.FloatField(terrain.tidalRangeAmount); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Cliff limit"); terrain.tidalCliffLimit = EditorGUILayout.Slider(terrain.tidalCliffLimit, 0.0f, 90.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed) { terrain.tidalErosionPresetId = 0; } buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Apply tidal erosion")) { // Undo Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Erosion"); // Start time... DateTime startTime = DateTime.Now; TerrainToolkit.ErosionProgressDelegate erosionProgressDelegate = new TerrainToolkit.ErosionProgressDelegate(updateErosionProgress); terrain.erodeAllTerrain(erosionProgressDelegate); EditorUtility.ClearProgressBar(); TimeSpan processTime = DateTime.Now - startTime; Debug.Log("Process complete in: "+processTime.ToString()); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); break; case 3: // Wind... EditorGUILayout.BeginHorizontal(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.PrefixLabel("Preset"); string[] windErosionPresetNames = new string[terrain.windErosionPresets.Count + 1]; int[] windErosionPresetInts = new int[terrain.windErosionPresets.Count + 1]; windErosionPresetNames[0] = "None"; TerrainToolkit.windErosionPresetData windErosionPreset; for (i = 1; i <= terrain.windErosionPresets.Count; i++) { windErosionPreset = (TerrainToolkit.windErosionPresetData) terrain.windErosionPresets[i - 1]; windErosionPresetNames[i] = windErosionPreset.presetName; windErosionPresetInts[i] = i; } terrain.windErosionPresetId = EditorGUILayout.IntPopup(terrain.windErosionPresetId, windErosionPresetNames, windErosionPresetInts); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed && terrain.windErosionPresetId > 0) { windErosionPreset = (TerrainToolkit.windErosionPresetData) terrain.windErosionPresets[terrain.windErosionPresetId - 1]; terrain.setWindErosionPreset(windErosionPreset); } if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Iterations"); terrain.windIterations = (int) EditorGUILayout.Slider(terrain.windIterations, 1, 250); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windDirection = EditorGUILayout.Slider("Wind direction", terrain.windDirection, 0.0f, 360.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windForce = EditorGUILayout.Slider("Wind force", terrain.windForce, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windLift = EditorGUILayout.Slider("Lift", terrain.windLift, 0.0f, 0.01f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windGravity = EditorGUILayout.Slider("Gravity", terrain.windGravity, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windCapacity = EditorGUILayout.Slider("Capacity", terrain.windCapacity, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windEntropy = EditorGUILayout.Slider("Entropy", terrain.windEntropy, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); terrain.windSmoothing = EditorGUILayout.Slider("Smoothing", terrain.windSmoothing, 0.0f, 1.0f); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); if (GUI.changed) { terrain.windErosionPresetId = 0; } buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (GUI.Button(buttonRect, "Apply wind erosion")) { // Undo Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; Undo.RegisterUndo(terData, "Terrain Erosion"); // Start time... DateTime startTime = DateTime.Now; TerrainToolkit.ErosionProgressDelegate erosionProgressDelegate = new TerrainToolkit.ErosionProgressDelegate(updateErosionProgress); terrain.erodeAllTerrain(erosionProgressDelegate); EditorUtility.ClearProgressBar(); TimeSpan processTime = DateTime.Now - startTime; Debug.Log("Process complete in: "+processTime.ToString()); GUIUtility.ExitGUI(); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); break; } if (terrain.erosionTypeInt == 0 || terrain.erosionTypeInt == 2 || (terrain.erosionTypeInt == 1 && terrain.hydraulicTypeInt == 0)) { EditorGUILayout.Separator(); drawBrushToolsGUI(); } else { EditorGUILayout.Separator(); EditorGUILayout.Separator(); } EditorGUILayout.Separator(); drawAdvancedSettingsGUI(); break; // -------------------------------------------------------------------------------------------------------- TEXTURING TOOLS case 2: Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; terrain.splatPrototypes = terData.splatPrototypes; EditorGUILayout.Separator(); float mouseX; EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Texture Slope"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); Rect gradientRect = EditorGUILayout.BeginHorizontal(); float gradientWidth = gradientRect.width - 55; gradientRect.width = 15; gradientRect.height = 19; GUI.skin = terrain.guiSkin; // Slope stop 1... if (dragControl == "slopeStop1" && Event.current.type == EventType.MouseDrag) { mouseX = Event.current.mousePosition.x - 7; if (mouseX < 20) { mouseX = 20; } else if (mouseX > 19 + gradientWidth * (terrain.slopeBlendMaxAngle / 90)) { mouseX = 19 + gradientWidth * (terrain.slopeBlendMaxAngle / 90); } gradientRect.x = mouseX; terrain.slopeBlendMinAngle = ((mouseX - 20) / (gradientWidth + 1)) * 90; } else { gradientRect.x = 20 + gradientWidth * (terrain.slopeBlendMinAngle / 90); } if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) { dragControl = "slopeStop1"; } if (dragControl == "slopeStop1" && Event.current.type == EventType.MouseUp) { dragControl = ""; } GUI.Box(gradientRect, "", "slopeStop1"); // Slope stop 2... if (dragControl == "slopeStop2" && Event.current.type == EventType.MouseDrag) { mouseX = Event.current.mousePosition.x - 7; if (mouseX < 21 + gradientWidth * (terrain.slopeBlendMinAngle / 90)) { mouseX = 21 + gradientWidth * (terrain.slopeBlendMinAngle / 90); } else if (mouseX > 21 + gradientWidth) { mouseX = 21 + gradientWidth; } gradientRect.x = mouseX; terrain.slopeBlendMaxAngle = ((mouseX - 20) / (gradientWidth + 1)) * 90; } else { gradientRect.x = 20 + gradientWidth * (terrain.slopeBlendMaxAngle / 90); } if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) { dragControl = "slopeStop2"; } if (dragControl == "slopeStop2" && Event.current.type == EventType.MouseUp) { dragControl = ""; } GUI.Box(gradientRect, "", "slopeStop2"); gradientRect.y += 19; gradientRect.width = gradientWidth * (terrain.slopeBlendMinAngle / 90); gradientRect.x = 27; GUI.Box(gradientRect, "", "black"); gradientRect.width = gradientWidth * ((terrain.slopeBlendMaxAngle / 90) - (terrain.slopeBlendMinAngle / 90)); gradientRect.x = 27 + gradientWidth * (terrain.slopeBlendMinAngle / 90); GUI.Box(gradientRect, "", "blackToWhite"); gradientRect.width = gradientWidth - gradientWidth * (terrain.slopeBlendMaxAngle / 90); gradientRect.x = 27 + gradientWidth * (terrain.slopeBlendMaxAngle / 90); GUI.Box(gradientRect, "", "white"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Cliff start"); terrain.slopeBlendMinAngle = EditorGUILayout.FloatField(terrain.slopeBlendMinAngle); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Cliff end"); terrain.slopeBlendMaxAngle = EditorGUILayout.FloatField(terrain.slopeBlendMaxAngle); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Texture Height"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); gradientRect = EditorGUILayout.BeginHorizontal(); gradientWidth = gradientRect.width - 55; gradientRect.width = 15; gradientRect.height = 19; Rect gradientRect2 = gradientRect; gradientRect2.y += 19; GUI.skin = terrain.guiSkin; string[] gradientStyles = new string[9]; gradientStyles[0] = "red"; gradientStyles[1] = "redToYellow"; gradientStyles[2] = "yellow"; gradientStyles[3] = "yellowToGreen"; gradientStyles[4] = "green"; gradientStyles[5] = "greenToCyan"; gradientStyles[6] = "cyan"; gradientStyles[7] = "cyanToBlue"; gradientStyles[8] = "blue"; List<float> heightBlendPoints = terrain.heightBlendPoints; int numPoints = heightBlendPoints.Count; float firstLimit = 1; if (numPoints > 0) { firstLimit = (float) heightBlendPoints[0]; } else { gradientRect.x = 20; GUI.Box(gradientRect, "", "greyStop"); gradientRect.x = 20 + gradientWidth; GUI.Box(gradientRect, "", "greyStop"); } gradientRect2.width = gradientWidth * firstLimit; gradientRect2.x = 27; if (terrain.splatPrototypes.Length < 2) { GUI.Box(gradientRect2, "", "grey"); } else { GUI.Box(gradientRect2, "", "red"); } for (i = 0; i < numPoints; i++) { // Height stop... float lowerLimit = 0; float upperLimit = 1; if (i > 0) { lowerLimit = (float) heightBlendPoints[i - 1]; } if (i < numPoints - 1) { upperLimit = (float) heightBlendPoints[i + 1]; } if (dragControl == "heightStop"+i && Event.current.type == EventType.MouseDrag) { mouseX = Event.current.mousePosition.x - 7; if (mouseX < 20 + gradientWidth * lowerLimit) { mouseX = 20 + gradientWidth * lowerLimit; } else if (mouseX > 19 + gradientWidth * upperLimit) { mouseX = 19 + gradientWidth * upperLimit; } gradientRect.x = mouseX; heightBlendPoints[i] = (mouseX - 20) / (gradientWidth + 1); } else { gradientRect.x = 20 + gradientWidth * (float) heightBlendPoints[i]; } if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) { dragControl = "heightStop"+i; } if (dragControl == "heightStop"+i && Event.current.type == EventType.MouseUp) { dragControl = ""; } int stopNum = (int) Mathf.Ceil((float) i / 2) + 1; if (i % 2 == 0) { GUI.Box(gradientRect, ""+stopNum, "blackStop"); } else { GUI.Box(gradientRect, ""+stopNum, "whiteStop"); } gradientRect2.width = gradientWidth * (upperLimit - (float) heightBlendPoints[i]); gradientRect2.x = 27 + gradientWidth * (float) heightBlendPoints[i]; GUI.Box(gradientRect2, "", gradientStyles[i + 1]); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); string startOrEnd = "end"; for (i = 0; i < numPoints; i++) { EditorGUILayout.BeginHorizontal(); int floatFieldNum = (int) Mathf.Ceil((float) i / 2) + 1; EditorGUILayout.PrefixLabel("Texture "+floatFieldNum+" "+startOrEnd); heightBlendPoints[i] = EditorGUILayout.FloatField((float) heightBlendPoints[i]); EditorGUILayout.EndHorizontal(); if (startOrEnd == "end") { startOrEnd = "start"; } else { startOrEnd = "end"; } } terrain.heightBlendPoints = heightBlendPoints; EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Textures"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); int nTextures = 0; EditorGUILayout.Separator(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); foreach (SplatPrototype splatPrototype in terrain.splatPrototypes) { EditorGUIUtility.LookLikeControls(80, 0); Rect textureRect = EditorGUILayout.BeginHorizontal(); if (nTextures == 0) { splatPrototype.texture = EditorGUILayout.ObjectField("Cliff texture", splatPrototype.texture, typeof(Texture2D)) as Texture2D; } else { splatPrototype.texture = EditorGUILayout.ObjectField("Texture "+nTextures, splatPrototype.texture, typeof(Texture2D)) as Texture2D; } GUI.skin = terrain.guiSkin; textureRect.x += 146; textureRect.width = 18; textureRect.height = 18; if (GUI.Button(textureRect, "", "deleteButton")) { GUI.changed = true; terrain.deleteSplatPrototype(terrain.tempTexture, nTextures); EditorUtility.SetDirty(terrain); } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); if (nTextures % 2 == 1) { EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); } nTextures++; if (nTextures > 5) { break; } } EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); if (GUI.changed) { terData.splatPrototypes = terrain.splatPrototypes; } if (nTextures == 0 && !assignTexture) { EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("No textures have been assigned! Assign a texture.", "errorText"); GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); } if (nTextures < 6) { EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 50; buttonRect.width = 100; buttonRect.height = 18; if (GUI.Button(buttonRect, "Add texture")) { terrain.addSplatPrototype(terrain.defaultTexture, nTextures); terData.splatPrototypes = terrain.splatPrototypes; EditorUtility.SetDirty(terrain); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); } EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (nTextures < 2) { GUI.Box(buttonRect, "Apply procedural texture", "disabledButton"); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("This feature is disabled! You must assign at least 2 textures.", "errorText"); } else { if (GUI.Button(buttonRect, "Apply procedural texture")) { // Undo not supported! TerrainToolkit.TextureProgressDelegate textureProgressDelegate = new TerrainToolkit.TextureProgressDelegate(updateTextureProgress); terrain.textureTerrain(textureProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } } GUI.skin = null; EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); drawAdvancedSettingsGUI(); // If the user has added or removed textures in the Terrain component, correct the number of blend points... if (Event.current.type == EventType.Repaint) { if (numPoints % 2 != 0) { terrain.deleteAllBlendPoints(); } int correctNumPoints = (nTextures - 2) * 2; if (nTextures < 3) { correctNumPoints = 0; } if (numPoints < correctNumPoints) { terrain.addBlendPoints(); } else if (numPoints > correctNumPoints) { terrain.deleteBlendPoints(); } } break; } if (GUI.changed) { EditorUtility.SetDirty(terrain); } }
private void OnTexturingInspectorGUI(TerrainToolkit terrain) { Rect buttonRect; Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain)); if (ter == null) { return; } TerrainData terData = ter.terrainData; terrain.splatPrototypes = terData.splatPrototypes; EditorGUILayout.Separator(); float mouseX; EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Texture Slope"); GUI.skin = null; EditorGUILayout.EndHorizontal(); Rect gradientRect = EditorGUILayout.BeginHorizontal(); float gradientWidth = gradientRect.width - 55; gradientRect.width = 15; gradientRect.height = 19; GUI.skin = terrain.guiSkin; // Slope stop 1... if (dragControl == "slopeStop1" && Event.current.type == EventType.MouseDrag) { mouseX = Event.current.mousePosition.x - 7; if (mouseX < 20) { mouseX = 20; } else if (mouseX > 19 + gradientWidth * (terrain.slopeBlendMaxAngle / 90)) { mouseX = 19 + gradientWidth * (terrain.slopeBlendMaxAngle / 90); } gradientRect.x = mouseX; terrain.slopeBlendMinAngle = ((mouseX - 20) / (gradientWidth + 1)) * 90; } else { gradientRect.x = 20 + gradientWidth * (terrain.slopeBlendMinAngle / 90); } if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) { dragControl = "slopeStop1"; } if (dragControl == "slopeStop1" && Event.current.type == EventType.MouseUp) { dragControl = ""; } GUI.Box(gradientRect, "", "slopeStop1"); // Slope stop 2... if (dragControl == "slopeStop2" && Event.current.type == EventType.MouseDrag) { mouseX = Event.current.mousePosition.x - 7; if (mouseX < 21 + gradientWidth * (terrain.slopeBlendMinAngle / 90)) { mouseX = 21 + gradientWidth * (terrain.slopeBlendMinAngle / 90); } else if (mouseX > 21 + gradientWidth) { mouseX = 21 + gradientWidth; } gradientRect.x = mouseX; terrain.slopeBlendMaxAngle = ((mouseX - 20) / (gradientWidth + 1)) * 90; } else { gradientRect.x = 20 + gradientWidth * (terrain.slopeBlendMaxAngle / 90); } if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) { dragControl = "slopeStop2"; } if (dragControl == "slopeStop2" && Event.current.type == EventType.MouseUp) { dragControl = ""; } GUI.Box(gradientRect, "", "slopeStop2"); gradientRect.y += 19; gradientRect.width = gradientWidth * (terrain.slopeBlendMinAngle / 90); gradientRect.x = 27; GUI.Box(gradientRect, "", "black"); gradientRect.width = gradientWidth * ((terrain.slopeBlendMaxAngle / 90) - (terrain.slopeBlendMinAngle / 90)); gradientRect.x = 27 + gradientWidth * (terrain.slopeBlendMinAngle / 90); GUI.Box(gradientRect, "", "blackToWhite"); gradientRect.width = gradientWidth - gradientWidth * (terrain.slopeBlendMaxAngle / 90); gradientRect.x = 27 + gradientWidth * (terrain.slopeBlendMaxAngle / 90); GUI.Box(gradientRect, "", "white"); GUI.skin = null; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Cliff start"); terrain.slopeBlendMinAngle = EditorGUILayout.FloatField(terrain.slopeBlendMinAngle); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Cliff end"); terrain.slopeBlendMaxAngle = EditorGUILayout.FloatField(terrain.slopeBlendMaxAngle); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Texture Height"); GUI.skin = null; EditorGUILayout.EndHorizontal(); gradientRect = EditorGUILayout.BeginHorizontal(); gradientWidth = gradientRect.width - 55; gradientRect.width = 15; gradientRect.height = 19; Rect gradientRect2 = gradientRect; gradientRect2.y += 19; GUI.skin = terrain.guiSkin; string[] gradientStyles = new string[9]; gradientStyles[0] = "red"; gradientStyles[1] = "redToYellow"; gradientStyles[2] = "yellow"; gradientStyles[3] = "yellowToGreen"; gradientStyles[4] = "green"; gradientStyles[5] = "greenToCyan"; gradientStyles[6] = "cyan"; gradientStyles[7] = "cyanToBlue"; gradientStyles[8] = "blue"; List<float> heightBlendPoints = terrain.heightBlendPoints; int numPoints = heightBlendPoints.Count; float firstLimit = 1; if (numPoints > 0) { firstLimit = (float) heightBlendPoints[0]; } else { gradientRect.x = 20; GUI.Box(gradientRect, "", "greyStop"); gradientRect.x = 20 + gradientWidth; GUI.Box(gradientRect, "", "greyStop"); } gradientRect2.width = gradientWidth * firstLimit; gradientRect2.x = 27; if (terrain.splatPrototypes.Length < 2) { GUI.Box(gradientRect2, "", "grey"); } else { GUI.Box(gradientRect2, "", "red"); } for (i = 0; i < numPoints; i++) { // Height stop... float lowerLimit = 0; float upperLimit = 1; if (i > 0) { lowerLimit = (float) heightBlendPoints[i - 1]; } if (i < numPoints - 1) { upperLimit = (float) heightBlendPoints[i + 1]; } if (dragControl == "heightStop"+i && Event.current.type == EventType.MouseDrag) { mouseX = Event.current.mousePosition.x - 7; if (mouseX < 20 + gradientWidth * lowerLimit) { mouseX = 20 + gradientWidth * lowerLimit; } else if (mouseX > 19 + gradientWidth * upperLimit) { mouseX = 19 + gradientWidth * upperLimit; } gradientRect.x = mouseX; heightBlendPoints[i] = (mouseX - 20) / (gradientWidth + 1); } else { gradientRect.x = 20 + gradientWidth * (float) heightBlendPoints[i]; } if (Event.current.type == EventType.MouseDown && gradientRect.Contains(Event.current.mousePosition)) { dragControl = "heightStop"+i; } if (dragControl == "heightStop"+i && Event.current.type == EventType.MouseUp) { dragControl = ""; } int stopNum = (int) Mathf.Ceil((float) i / 2) + 1; if (i % 2 == 0) { GUI.Box(gradientRect, ""+stopNum, "blackStop"); } else { GUI.Box(gradientRect, ""+stopNum, "whiteStop"); } gradientRect2.width = gradientWidth * (upperLimit - (float) heightBlendPoints[i]); gradientRect2.x = 27 + gradientWidth * (float) heightBlendPoints[i]; GUI.Box(gradientRect2, "", gradientStyles[i + 1]); } GUI.skin = null; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); string startOrEnd = "end"; for (i = 0; i < numPoints; i++) { EditorGUILayout.BeginHorizontal(); int floatFieldNum = (int) Mathf.Ceil((float) i / 2) + 1; EditorGUILayout.PrefixLabel("Texture "+floatFieldNum+" "+startOrEnd); heightBlendPoints[i] = EditorGUILayout.FloatField((float) heightBlendPoints[i]); EditorGUILayout.EndHorizontal(); if (startOrEnd == "end") { startOrEnd = "start"; } else { startOrEnd = "end"; } } terrain.heightBlendPoints = heightBlendPoints; EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("Textures"); GUI.skin = null; EditorGUILayout.EndHorizontal(); int nTextures = 0; EditorGUILayout.Separator(); if (GUI.changed) { EditorUtility.SetDirty(terrain); } GUI.changed = false; EditorGUILayout.BeginHorizontal(); EditorGUIUtility.LookLikeControls(80, 0); foreach (SplatPrototype splatPrototype in terrain.splatPrototypes) { Rect textureRect = EditorGUILayout.BeginHorizontal(); if (nTextures == 0) { splatPrototype.texture = EditorGUILayout.ObjectField("Cliff texture", splatPrototype.texture, typeof(Texture2D), false) as Texture2D; } else { splatPrototype.texture = EditorGUILayout.ObjectField("Texture "+nTextures, splatPrototype.texture, typeof(Texture2D), false) as Texture2D; } GUI.skin = terrain.guiSkin; textureRect.x += 146; textureRect.width = 18; textureRect.height = 18; if (GUI.Button(textureRect, "", "deleteButton")) { GUI.changed = true; terrain.deleteSplatPrototype(terrain.tempTexture, nTextures); EditorUtility.SetDirty(terrain); } GUI.skin = null; EditorGUILayout.EndHorizontal(); if (nTextures % 2 == 1) { EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); } nTextures++; if (nTextures > 5) { break; } } EditorGUIUtility.LookLikeControls(); EditorGUILayout.EndHorizontal(); if (GUI.changed) { terData.splatPrototypes = terrain.splatPrototypes; } if (nTextures == 0 && !assignTexture) { EditorGUILayout.BeginHorizontal(); GUI.skin = terrain.guiSkin; GUILayout.Label("No textures have been assigned! Assign a texture.", "errorText"); GUI.skin = null; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); } if (nTextures < 6) { EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 50; buttonRect.width = 100; buttonRect.height = 18; if (GUI.Button(buttonRect, "Add texture")) { terrain.addSplatPrototype(terrain.defaultTexture, nTextures); terData.splatPrototypes = terrain.splatPrototypes; EditorUtility.SetDirty(terrain); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); } EditorGUILayout.Separator(); buttonRect = EditorGUILayout.BeginHorizontal(); buttonRect.x = buttonRect.width / 2 - 100; buttonRect.width = 200; buttonRect.height = 18; GUI.skin = terrain.guiSkin; if (nTextures < 2) { GUI.Box(buttonRect, "Apply procedural texture", "disabledButton"); EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("This feature is disabled! You must assign at least 2 textures.", "errorText"); } else { if (GUI.Button(buttonRect, "Apply procedural texture")) { // Undo not supported! TerrainToolkit.TextureProgressDelegate textureProgressDelegate = new TerrainToolkit.TextureProgressDelegate(updateTextureProgress); terrain.textureTerrain(textureProgressDelegate); EditorUtility.ClearProgressBar(); GUIUtility.ExitGUI(); } } GUI.skin = null; EditorGUILayout.EndHorizontal(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); EditorGUILayout.Separator(); drawAdvancedSettingsGUI(); // If the user has added or removed textures in the Terrain component, correct the number of blend points... if (Event.current.type == EventType.Repaint) { if (numPoints % 2 != 0) { terrain.deleteAllBlendPoints(); } int correctNumPoints = (nTextures - 2) * 2; if (nTextures < 3) { correctNumPoints = 0; } if (numPoints < correctNumPoints) { terrain.addBlendPoints(); } else if (numPoints > correctNumPoints) { terrain.deleteBlendPoints(); } } }