private void OnEnable() { tree = (MtreeComponent)target; tree.UpdateTreeFunctions(); if (tree.tree == null) { UpdateTree(); } rectHeightMultiplier = TreeFunction.height + TreeFunction.margin; Undo.undoRedoPerformed += UndoCallback; }
private void DisplayFunctionsTab() { EditorGUIUtility.labelWidth = 135; int functionCount = tree.treeFunctions.Count; // Used in multiple for loops if (GUILayout.Button("Add function")) { GenericMenu addFunctionMenu = new GenericMenu(); addFunctionMenu.AddItem(new GUIContent("Add branch"), false, tree.AddBranchFunction); addFunctionMenu.AddItem(new GUIContent("Add Leafs"), false, tree.AddLeafFunction); addFunctionMenu.AddItem(new GUIContent("Split"), false, tree.AddSplitFunction); addFunctionMenu.AddItem(new GUIContent("Grow"), false, tree.AddGrowFunction); addFunctionMenu.ShowAsContext(); } int rectHeight = functionCount * rectHeightMultiplier; // get the height of the drawing window inside inspector Rect rect = GUILayoutUtility.GetRect(10, 1000, rectHeight, rectHeight); // Create drawing window Event e = Event.current; // Get current event if (e.type == EventType.MouseDown && e.button == 0) // If mouse button is pressed, get button pressed and act accordingly { for (int i = 0; i < functionCount; i++) { TreeFunction tf = tree.treeFunctions[i]; if (tf.rect.Contains(e.mousePosition - rect.position)) { if (tf.type != FunctionType.Trunk && tf.deleteRect.Contains(e.mousePosition - rect.position)) { tree.RemoveFunction(i); UpdateTree(); } else { Undo.RecordObject(target, "Selected function"); tree.selectedFunctionIndex = i; } GUIUtility.ExitGUI(); break; } } } GUI.BeginClip(rect); // Set origin of coordinates to origin of drawing window for (int i = 0; i < functionCount; i++) // Draw each node { TreeFunction tf = tree.treeFunctions[i]; if (tf.type != FunctionType.Trunk && tf.parent == null) { tree.UpdateTreeFunctions(); } tf.Draw(i == tree.selectedFunctionIndex); } GUI.EndClip(); EditorGUI.BeginChangeCheck(); EditorGUILayout.BeginVertical(EditorStyles.helpBox); TreeFunction f = tree.treeFunctions[tree.selectedFunctionIndex]; if (GUILayout.Button("Randomize tree")) { tree.RandomizeTree(); } if (f.type == FunctionType.Trunk) { f.seed = EditorGUILayout.IntField("Seed", f.seed); f.Tlength = EditorGUILayout.FloatField("Length", f.Tlength); f.Tlength = Mathf.Max(0.01f, f.Tlength); f.TradiusMultiplier = EditorGUILayout.FloatField("Radius", f.TradiusMultiplier); f.Tresolution = EditorGUILayout.FloatField("Resolution", f.Tresolution); f.Tresolution = Mathf.Max(.01f, f.Tresolution); f.ToriginAttraction = EditorGUILayout.Slider("Axis attraction", f.ToriginAttraction, 0, 1); f.Tradius = EditorGUILayout.CurveField("Shape", f.Tradius); f.TradiusMultiplier = Mathf.Max(0.0001f, f.TradiusMultiplier); f.Trandomness = EditorGUILayout.Slider("Randomness", f.Trandomness, 0f, 0.5f); f.TdisplacementStrength = EditorGUILayout.FloatField("Displacement strength", f.TdisplacementStrength); f.TdisplacementSize = EditorGUILayout.FloatField("Displacement size", f.TdisplacementSize); f.TspinAmount = EditorGUILayout.FloatField("Spin amount", f.TspinAmount); f.TheightOffset = EditorGUILayout.FloatField("Height Offset", f.TheightOffset); EditorGUILayout.BeginVertical(EditorStyles.helpBox); EditorGUILayout.LabelField("Root"); f.TrootShape = EditorGUILayout.CurveField("Root shape", f.TrootShape); f.TrootHeight = EditorGUILayout.FloatField("Height", f.TrootHeight); f.TrootHeight = Mathf.Max(.01f, f.TrootHeight); f.TrootRadius = EditorGUILayout.Slider("Root Radius", f.TrootRadius, 0, 2); f.TrootResolution = EditorGUILayout.FloatField("Additional Resolution", f.TrootResolution); f.TrootResolution = Mathf.Max(1, f.TrootResolution); f.TflareNumber = EditorGUILayout.IntSlider("Flare Number", f.TflareNumber, 0, 10); EditorGUILayout.EndVertical(); } else if (f.type == FunctionType.Grow) { f.seed = EditorGUILayout.IntField("Seed", f.seed); EditorGUILayout.BeginHorizontal(); f.Glength = EditorGUILayout.FloatField("Length", f.Glength); f.GlengthCurve = EditorGUILayout.CurveField(f.GlengthCurve); EditorGUILayout.EndHorizontal(); f.Glength = Mathf.Max(.001f, f.Glength); f.Gresolution = EditorGUILayout.FloatField("Resolution", f.Gresolution); f.Gresolution = Mathf.Max(f.Gresolution, .01f); EditorGUILayout.BeginHorizontal(); f.GsplitProba = EditorGUILayout.Slider("Split proba", f.GsplitProba, 0, 1); f.GsplitProbaCurve = EditorGUILayout.CurveField(f.GsplitProbaCurve); EditorGUILayout.EndHorizontal(); f.GsplitAngle = EditorGUILayout.Slider("Split angle", f.GsplitAngle, 0, 2); f.Gradius = EditorGUILayout.CurveField("Shape", f.Gradius); f.GsplitRadius = EditorGUILayout.Slider("Split radius", f.GsplitRadius, .5f, .999f); f.GmaxSplits = EditorGUILayout.IntSlider("Max splits at a time", f.GmaxSplits, 2, 4); f.Grandomness = EditorGUILayout.Slider("Randomness", f.Grandomness, 0, 1); f.GupAttraction = EditorGUILayout.Slider("Up attraction", f.GupAttraction, 0, 1f); f.GgravityStrength = EditorGUILayout.FloatField("Gravity strength", f.GgravityStrength); } else if (f.type == FunctionType.Split) { f.seed = EditorGUILayout.IntField("Seed", f.seed); f.Snumber = EditorGUILayout.IntField("Number", f.Snumber); f.Snumber = Mathf.Max(0, f.Snumber); f.SsplitAngle = EditorGUILayout.Slider("Split angle", f.SsplitAngle, 0, 2); f.SmaxSplits = EditorGUILayout.IntSlider("Max splits at a time", f.SmaxSplits, 1, 10); f.SsplitRadius = EditorGUILayout.Slider("split radius", f.SsplitRadius, 0.001f, 1); f.Sstart = EditorGUILayout.Slider("Start", f.Sstart, 0f, 1f); f.Sspread = EditorGUILayout.Slider("Height spread", f.Sspread, 0, 1); } else if (f.type == FunctionType.Branch) { f.seed = EditorGUILayout.IntField("Seed", f.seed); f.Bnumber = EditorGUILayout.IntField("Number", f.Bnumber); f.Bnumber = Mathf.Max(0, f.Bnumber); EditorGUILayout.BeginHorizontal(); f.Blength = EditorGUILayout.FloatField("Length", f.Blength); f.Blength = Mathf.Max(f.Blength, .001f); f.BlengthCurve = EditorGUILayout.CurveField(f.BlengthCurve); EditorGUILayout.EndHorizontal(); f.Bresolution = EditorGUILayout.FloatField("Resolution", f.Bresolution); f.Bresolution = Mathf.Max(f.Bresolution, .01f); f.Brandomness = EditorGUILayout.Slider("Randomness", f.Brandomness, 0, 1); f.Bradius = EditorGUILayout.Slider("Radius", f.Bradius, 0.001f, 1); EditorGUILayout.BeginHorizontal(); f.BsplitProba = EditorGUILayout.Slider("Split proba", f.BsplitProba, 0, 1); f.BsplitProbaCurve = EditorGUILayout.CurveField(f.BsplitProbaCurve); EditorGUILayout.EndHorizontal(); f.BmaxSplits = EditorGUILayout.IntSlider("Max splits number", f.BmaxSplits, 1, 5); f.Bangle = EditorGUILayout.Slider("Angle", f.Bangle, 0, 2); f.BupAttraction = EditorGUILayout.Slider("Up attraction", f.BupAttraction, 0, 1); f.BgravityStrength = EditorGUILayout.FloatField("Gravity strength", f.BgravityStrength); f.Bstart = EditorGUILayout.Slider("Start", f.Bstart, 0f, 1f); } else if (f.type == FunctionType.Leaf) { if (f.LleafTypesNames == null || f.LleafTypesNames.Length == 5) { f.LleafTypesNames = new string[6] { "cross", "diamond cross", "diamond", "long", "plane", "custom" } } ; f.LleafType = EditorGUILayout.Popup(f.LleafType, f.LleafTypesNames); Mesh[] leafMesh = null; switch (f.LleafType) { case 0: leafMesh = new Mesh[] { Resources.LoadAll <Mesh>("Mtree/branches")[0] }; break; case 1: leafMesh = new Mesh[] { Resources.LoadAll <Mesh>("Mtree/branches")[1] }; break; case 2: leafMesh = new Mesh[] { Resources.LoadAll <Mesh>("Mtree/branches")[2], Resources.LoadAll <Mesh>("Mtree/branches")[3] }; break; case 3: leafMesh = new Mesh[] { Resources.LoadAll <Mesh>("Mtree/branches")[4], Resources.LoadAll <Mesh>("Mtree/branches")[5] }; break; case 4: leafMesh = new Mesh[] { Resources.LoadAll <Mesh>("Mtree/branches")[6] }; break; case 5: leafMesh = new Mesh[] { (Mesh)EditorGUILayout.ObjectField("Mesh: ", f.LleafMesh[0], typeof(Mesh), false) }; break; } f.LleafMesh = leafMesh; f.Lnumber = EditorGUILayout.IntField("number", f.Lnumber); f.Lnumber = Mathf.Max(f.Lnumber, 0); f.Lsize = EditorGUILayout.FloatField("Size", f.Lsize); f.Lsize = Mathf.Max(0, f.Lsize); f.LmaxRadius = EditorGUILayout.Slider("Max branch radius", f.LmaxRadius, 0, 1); f.LmaxRadius = Mathf.Max(0.001f, f.LmaxRadius); EditorGUILayout.MinMaxSlider("leafs weight", ref f.LminWeight, ref f.LmaxWeight, -1, 1); f.LoverrideNormals = EditorGUILayout.Toggle("Override Normals", f.LoverrideNormals); } EditorGUILayout.EndVertical(); if (EditorGUI.EndChangeCheck()) { UpdateTree(); } }