- Home /
TerrainToolkit build errors
Hello everyone.
I'm using the TerrainToolkit from the unity website.
everything works fine.
But when I press "build all projects of all solutions" I get 62 errors in the TerrainToolkitEditor script.
All errors are the same: "the type or namespace name 'TerrainToolkit' could not be found".
I really need to get this fixed, I can't have any custom inspectors because of it.
Thanks.
I'm running 3.5.6f4, and the only problems I get are 2 warning from the TerrainToolkitEditor.cs script. Here's what I just did as a test :
Create a new project.
Download the package from sixtimesnothing : http://www.sixtimesnothing.com/terraintoolkit
Direct link : http://code.google.com/p/unityterraintoolkit/downloads/detail?name=Terrain%20Toolkit%201.0.2.zip&can=2&q=
Unzip, then in Unity navigate to Assets > Import Package > Custom Package...
When the package comes in, there are just 2 warnings :
Assets/TerrainToolkit/Editor/TerrainToolkitEditor.cs(1069,82): warning CS0618:
UnityEditor.EditorGUILayout.ObjectField(string, UnityEngine.Object, System.Type, params UnityEngine.GUILayoutOption[])' is obsolete:
Check the docs for the usage of the new parameter 'allowSceneObjects'.'Assets/TerrainToolkit/Editor/TerrainToolkitEditor.cs(1071,82): warning CS0618:
UnityEditor.EditorGUILayout.ObjectField(string, UnityEngine.Object, System.Type, params UnityEngine.GUILayoutOption[])' is obsolete:
Check the docs for the usage of the new parameter 'allowSceneObjects'.'
Double-click on the first warning. It brings you to line 1069. Replace that line with :
splatPrototype.texture = EditorGUILayout.ObjectField("Cliff texture", splatPrototype.texture, typeof(Texture2D), false) as Texture2D;
now double-click on the second warning. This will bring you to line 1071. Replace that line with :
splatPrototype.texture = EditorGUILayout.ObjectField("Texture "+nTextures, splatPrototype.texture, typeof(Texture2D), false) as Texture2D;
Note : the changes are the parameter false at the end of the command where it says typeof(Texture2D)
When the edited script is saved, the warnings disappear.
Then I created a new terrain, dragged and dropped TerrainToolkit.cs onto the terrain, and all was working as expected.
From your errors, it is possible that you don't have the full package. But the download site also states 'Terrain Toolkit Unity Package with Unity 3.x bug fixes', so maybe it is just the package you have. As stated above, I just downloaded this and tested this in Unity 3.5.6f4.
The warning fixes came from Graham Dunnett (many thanks) in a question I asked : http://answers.unity3d.com/questions/323286/warning-cs0618-with-unity-terrain-toolkit.html
I also have a video describing this fix : http://www.youtube.com/watch?v=XdfjO_hT$$anonymous$$$$anonymous$$g
Ok, I downloaded the 1.0.2 package.
Now I have 2 errors ins$$anonymous$$d of 62 :P
One is on line 864 saying: "A local variable named 'ter' cannot be declared in this scope because it would give a different meaning to 'ter', which is already used in a 'child' scope to denote something else (CS0136)
another error is at line 868, the errors is the same only with 'terData' ins$$anonymous$$d of 'ter'.
I also only get the 2 warnings in the editor console (didn't fix them yet), but when pressing "build all projects of all solutions" in $$anonymous$$onoDevelop I get the errors I stated above (inside mono, not unity).
wow, ok at least that is one step closer. I might suggest this before someone else does. Is it possible to update your version of Unity? I am the same so I understand, I am on 3.5.6 while the last Unity 3.x version is 3.5.7
Here is the link for all the Unity versions : http://unity3d.com/unity/download/archive
Of course if that doesn't fix your problem then I am in trouble. And I am not sure, but it looks like there is a conflict of namespaces, probably with some other scripts in your project.
The only fix I can suggest now, is to go through the script and change all those variable names to unique ones, so hopefully they don't conflict with other scripts you may have.
This may sound like a big long pain, but there are only approximately 4 of each of these names in the TerrainToolkitEditor script. So I have done these modifications myself, and uploaded the modified script for you to try here : http://www.alucardj.net16.net/unityanswers/TerrainToolkitFix/TerrainToolkitEditor.cs
I feel like I may have infringed some rule here, but in my defense the script is absolutely in its original form, all I have done is renamed the above 2 mentioned variables. So please anybody before I get into trouble, I'm only trying to help maintain the functionality of this excellent package for this user, and possibly other users with the same problem.
The offending variable names have been renamed to myTer , and myTerData
Edit : I had to change your title to errors ins$$anonymous$$d of erros , sorry !
Answer by AlucardJay · Mar 26, 2013 at 09:02 PM
It appears that the compilation of this script is having issues in that particular version of Unity. I have isolated the offending local variables, and renamed them to restore the compilation to working, thus bringing back the script to its original functionality. Thanks to sixtimesnothing for making this great editing tool =]
Here is the fixed editor script. I have replaced the local variable names at 864 and 868, and where they are used in those functions/methods. Names went from ter to myTer, and terData to myTerData :
/*
---------------------- Unity Terrain Toolkit ----------------------
--
-- Unity Summer of Code 2009
-- Terrain Toolkit for Unity (Version 1.0.2)
-- All code by Sándor Moldán.
--
-- TerrainToolkitEditor.cs
--
-------------------------------------------------------------------
*/
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;
// -------------------------------------------------------------------------------------------------------- EDITOR
[CustomEditor(typeof(TerrainToolkit))]
public class TerrainToolkitEditor : Editor {
private bool showAdvancedSettings;
private bool showInterfaceSettings;
private string dragControl = "";
private bool assignTexture = false;
int i;
int n;
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 myTer = (Terrain) terrain.GetComponent(typeof(Terrain));
if (myTer == null) {
return;
}
TerrainData myTerData = myTer.terrainData;
terrain.splatPrototypes = myTerData.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), 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;
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) {
myTerData.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);
myTerData.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);
}
}
public void OnSceneGUI() {
TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit;
if (Event.current.type == EventType.MouseDown) {
terrain.isBrushPainting = true;
}
if (Event.current.type == EventType.MouseUp) {
terrain.isBrushPainting = false;
}
if (Event.current.shift) {
if (!terrain.isBrushPainting) {
// Undo...
Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain));
if (ter == null) {
return;
}
TerrainData terData = ter.terrainData;
Undo.RegisterUndo(terData, "Terrain Erosion Brush");
}
terrain.isBrushPainting = true;
} else {
terrain.isBrushPainting = false;
}
terrain.isBrushHidden = false;
if (terrain.isBrushOn) {
Vector2 mouse = Event.current.mousePosition;
mouse.y = Camera.current.pixelHeight - mouse.y + 20;
Ray ray = Camera.current.ScreenPointToRay(mouse);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity)) {
if (hit.transform.GetComponent("TerrainToolkit")) {
terrain.brushPosition = hit.point;
if (terrain.isBrushPainting) {
// Paint...
terrain.paint();
}
}
} else {
terrain.isBrushHidden = true;
}
}
}
private void drawBrushToolsGUI() {
TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit;
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUI.skin = terrain.guiSkin;
GUILayout.Label("Brushes");
GUI.skin = null;
EditorGUIUtility.LookLikeControls();
EditorGUILayout.EndHorizontal();
Rect toggleRect = EditorGUILayout.BeginHorizontal();
toggleRect.x = 110;
toggleRect.width = 80;
toggleRect.height = 20;
EditorGUILayout.PrefixLabel("Brush");
string[] brushStates = new string[2];
brushStates[0] = "Off";
brushStates[1] = "On";
int brushInt = 0;
if (terrain.isBrushOn) {
brushInt = 1;
}
brushInt = GUI.Toolbar(toggleRect, brushInt, brushStates);
bool brushBool = false;
if (brushInt == 1) {
brushBool = true;
}
terrain.isBrushOn = brushBool;
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(" HINTS:");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(" 1. Hold down the SHIFT key to use the brush");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(" 2. Use the brush PRESET for best results");
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Brush size");
terrain.brushSize = EditorGUILayout.Slider(terrain.brushSize, 1, 100);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Opacity");
terrain.brushOpacity = EditorGUILayout.Slider(terrain.brushOpacity, 0, 1);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Softness");
terrain.brushSoftness = EditorGUILayout.Slider(terrain.brushSoftness, 0, 1);
EditorGUILayout.EndHorizontal();
}
private void drawAdvancedSettingsGUI() {
TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit;
EditorGUILayout.BeginHorizontal();
showAdvancedSettings = EditorGUILayout.Foldout(showAdvancedSettings, "Advanced settings");
EditorGUILayout.EndHorizontal();
if (showAdvancedSettings) {
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUILayout.Label("Cell neighbourhood");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUIContent[] neighbourhoodOptions = new GUIContent[2];
neighbourhoodOptions[0] = new GUIContent("Moore", terrain.mooreIcon);
neighbourhoodOptions[1] = new GUIContent("Von Neumann", terrain.vonNeumannIcon);
terrain.neighbourhoodInt = GUILayout.Toolbar(terrain.neighbourhoodInt, neighbourhoodOptions);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUILayout.Label("Use difference maps in brush mode");
EditorGUILayout.EndHorizontal();
Rect toggleRect = EditorGUILayout.BeginHorizontal();
toggleRect.x = 110;
toggleRect.width = 80;
toggleRect.height = 20;
string[] diffMapStates = new string[2];
diffMapStates[0] = "Off";
diffMapStates[1] = "On";
int diffMapInt = 0;
if (terrain.useDifferenceMaps) {
diffMapInt = 1;
}
diffMapInt = GUI.Toolbar(toggleRect, diffMapInt, diffMapStates);
bool diffMapBool = false;
if (diffMapInt == 1) {
diffMapBool = true;
}
terrain.useDifferenceMaps = diffMapBool;
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Reload Presets")) {
terrain.presetsInitialised = false;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
}
}
public void updateErosionProgress(string titleString, string displayString, int iteration, int nIterations, float percentComplete) {
EditorUtility.DisplayProgressBar(titleString, displayString+" Iteration "+iteration+" of "+nIterations+". Please wait.", percentComplete);
}
public void updateTextureProgress(string titleString, string displayString, float percentComplete) {
EditorUtility.DisplayProgressBar(titleString, displayString, percentComplete);
}
public void updateGeneratorProgress(string titleString, string displayString, float percentComplete) {
EditorUtility.DisplayProgressBar(titleString, displayString, percentComplete);
}
}
// -------------------------------------------------------------------------------------------------------- END
Answer by YousafGrewal · Jul 23, 2018 at 11:20 AM
**code is working**
/* http://www.cgsoso.com/forum-211-1.html
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
CGSOSO 主打游戏开发,影视设计等CG资源素材。
插件如若商用,请务必官网购买!
daily assets update for try.
U should buy the asset from home store if u use it in your project! */
using UnityEngine; using UnityEditor; using System; using System.Collections; using System.Collections.Generic;
// -------------------------------------------------------------------------------------------------------- EDITOR
[CustomEditor(typeof(TerrainToolkit))] public class TerrainToolkitEditor : Editor {
private bool showAdvancedSettings;
private bool showInterfaceSettings;
private string dragControl = "";
private bool assignTexture = false;
int i;
int n;
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) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/TerrainErosionEditorSkin.guiskin", typeof(GUISkin));
terrain.createIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/createIcon.png", typeof(Texture2D));
terrain.erodeIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/erodeIcon.png", typeof(Texture2D));
terrain.textureIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/textureIcon.png", typeof(Texture2D));
terrain.mooreIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/mooreIcon.png", typeof(Texture2D));
terrain.vonNeumannIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/vonNeumannIcon.png", typeof(Texture2D));
terrain.mountainsIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/mountainsIcon.png", typeof(Texture2D));
terrain.hillsIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/hillsIcon.png", typeof(Texture2D));
terrain.plateausIcon = (Texture2D) AssetDatabase.LoadAssetAtPath("Assets/TerrainToolkit/Editor/Resources/plateausIcon.png", typeof(Texture2D));
terrain.defaultTexture = (Texture2D) AssetDatabase.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 myter = (Terrain) terrain.GetComponent(typeof(Terrain));
if (myter == null)
{
return;
}
TerrainData myterData = myter.terrainData;
terrain.splatPrototypes = myterData.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) {
myterData.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);
myterData.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);
}
}
public void OnSceneGUI() {
TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit;
if (Event.current.type == EventType.MouseDown) {
terrain.isBrushPainting = true;
}
if (Event.current.type == EventType.MouseUp) {
terrain.isBrushPainting = false;
}
if (Event.current.shift) {
if (!terrain.isBrushPainting) {
// Undo...
Terrain ter = (Terrain) terrain.GetComponent(typeof(Terrain));
if (ter == null) {
return;
}
TerrainData terData = ter.terrainData;
Undo.RegisterUndo(terData, "Terrain Erosion Brush");
}
terrain.isBrushPainting = true;
} else {
terrain.isBrushPainting = false;
}
terrain.isBrushHidden = false;
if (terrain.isBrushOn) {
Vector2 mouse = Event.current.mousePosition;
mouse.y = Camera.current.pixelHeight - mouse.y + 20;
Ray ray = Camera.current.ScreenPointToRay(mouse);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity)) {
if (hit.transform.GetComponent("TerrainToolkit")) {
terrain.brushPosition = hit.point;
if (terrain.isBrushPainting) {
// Paint...
terrain.paint();
}
}
} else {
terrain.isBrushHidden = true;
}
}
}
private void drawBrushToolsGUI() {
TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit;
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUI.skin = terrain.guiSkin;
GUILayout.Label("Brushes");
GUI.skin = null;
EditorGUIUtility.LookLikeControls();
EditorGUILayout.EndHorizontal();
Rect toggleRect = EditorGUILayout.BeginHorizontal();
toggleRect.x = 110;
toggleRect.width = 80;
toggleRect.height = 20;
EditorGUILayout.PrefixLabel("Brush");
string[] brushStates = new string[2];
brushStates[0] = "Off";
brushStates[1] = "On";
int brushInt = 0;
if (terrain.isBrushOn) {
brushInt = 1;
}
brushInt = GUI.Toolbar(toggleRect, brushInt, brushStates);
bool brushBool = false;
if (brushInt == 1) {
brushBool = true;
}
terrain.isBrushOn = brushBool;
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(" HINTS:");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(" 1. Hold down the SHIFT key to use the brush");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.Label(" 2. Use the brush PRESET for best results");
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Brush size");
terrain.brushSize = EditorGUILayout.Slider(terrain.brushSize, 1, 100);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Opacity");
terrain.brushOpacity = EditorGUILayout.Slider(terrain.brushOpacity, 0, 1);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel("Softness");
terrain.brushSoftness = EditorGUILayout.Slider(terrain.brushSoftness, 0, 1);
EditorGUILayout.EndHorizontal();
}
private void drawAdvancedSettingsGUI() {
TerrainToolkit terrain = (TerrainToolkit) target as TerrainToolkit;
EditorGUILayout.BeginHorizontal();
showAdvancedSettings = EditorGUILayout.Foldout(showAdvancedSettings, "Advanced settings");
EditorGUILayout.EndHorizontal();
if (showAdvancedSettings) {
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUILayout.Label("Cell neighbourhood");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUIContent[] neighbourhoodOptions = new GUIContent[2];
neighbourhoodOptions[0] = new GUIContent("Moore", terrain.mooreIcon);
neighbourhoodOptions[1] = new GUIContent("Von Neumann", terrain.vonNeumannIcon);
terrain.neighbourhoodInt = GUILayout.Toolbar(terrain.neighbourhoodInt, neighbourhoodOptions);
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
GUILayout.Label("Use difference maps in brush mode");
EditorGUILayout.EndHorizontal();
Rect toggleRect = EditorGUILayout.BeginHorizontal();
toggleRect.x = 110;
toggleRect.width = 80;
toggleRect.height = 20;
string[] diffMapStates = new string[2];
diffMapStates[0] = "Off";
diffMapStates[1] = "On";
int diffMapInt = 0;
if (terrain.useDifferenceMaps) {
diffMapInt = 1;
}
diffMapInt = GUI.Toolbar(toggleRect, diffMapInt, diffMapStates);
bool diffMapBool = false;
if (diffMapInt == 1) {
diffMapBool = true;
}
terrain.useDifferenceMaps = diffMapBool;
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Reload Presets")) {
terrain.presetsInitialised = false;
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.Separator();
}
}
public void updateErosionProgress(string titleString, string displayString, int iteration, int nIterations, float percentComplete) {
EditorUtility.DisplayProgressBar(titleString, displayString+" Iteration "+iteration+" of "+nIterations+". Please wait.", percentComplete);
}
public void updateTextureProgress(string titleString, string displayString, float percentComplete) {
EditorUtility.DisplayProgressBar(titleString, displayString, percentComplete);
}
public void updateGeneratorProgress(string titleString, string displayString, float percentComplete) {
EditorUtility.DisplayProgressBar(titleString, displayString, percentComplete);
}
}
// -------------------------------------------------------------------------------------------------------- END