/// <summary> /// The Initializer for the <seealso cref="UtilityNode"/> when it is being loaded from an XML /// </summary> /// <param name="parent"></param> /// <param name="typeNumber"></param> /// <param name="posx"></param> /// <param name="posy"></param> /// <param name="subElem"></param> public void InitUtilityNodeFromXML(ClickableElement parent, utilityType type, fusionType fusionType, curveType curveType, float posx, float posy, string id, string name, float variableMax, float variableMin, float slope, float exp, float displX, float displY, List <Vector2> points, ClickableElement subElem = null) { InitBaseNode(parent, id); var foo = editor; this.type = type; this.fusionType = fusionType; this.curveType = curveType; if (subElem != null) { this.subElem = subElem; nodeName = this.subElem.elementName; windowRect = new Rect(posx, posy, ClickableElement.width, ClickableElement.height); } else { nodeName = parent.elementNamer.AddName(id, name); if (type == utilityType.Fusion) { windowRect = new Rect(posx, posy, width, height * 1.7f); } else if (type == utilityType.Curve) { baseHeight = height * 1.5f; windowRect = new Rect(posx, posy, width, baseHeight); } else { windowRect = new Rect(posx, posy, width, height); } } this.variableMax = variableMax; this.variableMin = variableMin; this.slope = slope; this.exp = exp; this.displX = displX; this.displY = displY; this.points = points; }
/// <summary> /// Draws all the elements inside the <see cref="UtilityNode"/> /// </summary> public override void DrawWindow() { switch (type) { case utilityType.Variable: nodeName = CleanName(EditorGUILayout.TextArea(nodeName, Styles.TitleText, GUILayout.ExpandWidth(true), GUILayout.Height(25))); GUILayout.Space(10); GUILayout.BeginHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Min:", Styles.NonEditable, GUILayout.Width(40), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(variableMin.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out variableMin); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Max:", Styles.NonEditable, GUILayout.Width(40), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(variableMax.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out variableMax); GUILayout.EndHorizontal(); GUILayout.EndHorizontal(); break; case utilityType.Fusion: nodeName = CleanName(EditorGUILayout.TextArea(nodeName, Styles.TitleText, GUILayout.ExpandWidth(true), GUILayout.Height(25))); GUILayout.BeginHorizontal(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.BeginVertical(GUILayout.Width(20)); if (GUILayout.Toggle(fusionType == fusionType.Weighted, fusionType.Weighted.ToString(), EditorStyles.radioButton)) { fusionType = fusionType.Weighted; } if (GUILayout.Toggle(fusionType == fusionType.GetMax, fusionType.GetMax.ToString(), EditorStyles.radioButton)) { fusionType = fusionType.GetMax; } if (GUILayout.Toggle(fusionType == fusionType.GetMin, fusionType.GetMin.ToString(), EditorStyles.radioButton)) { fusionType = fusionType.GetMin; } GUILayout.EndVertical(); GUILayout.EndHorizontal(); break; case utilityType.Action: nodeName = CleanName(EditorGUILayout.TextArea(nodeName, Styles.TitleText, GUILayout.ExpandWidth(true), GUILayout.Height(25))); break; case utilityType.Curve: nodeName = CleanName(EditorGUILayout.TextArea(nodeName, Styles.TitleText, GUILayout.ExpandWidth(true), GUILayout.Height(25))); // Type of curve selector GUILayout.BeginHorizontal(); GUILayout.Space(windowRect.width * 0.2f); if (GUILayout.Button(curveType.ToString(), EditorStyles.toolbarDropDown)) { GenericMenu toolsMenu = new GenericMenu(); foreach (string name in Enum.GetNames(typeof(curveType)).ToArray()) { toolsMenu.AddItem(new GUIContent(name), false, () => { curveType = (curveType)Enum.Parse(typeof(curveType), name); }); } toolsMenu.DropDown(new Rect(0, Event.current.mousePosition.y, 0, 0)); EditorGUIUtility.ExitGUI(); } GUILayout.Space(windowRect.width * 0.2f); GUILayout.EndHorizontal(); // Parameters switch (curveType) { case curveType.Linear: GUILayout.BeginHorizontal(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.BeginHorizontal(); // Linear curve formula GUILayout.Label("y = ", Styles.NonEditable, GUILayout.Width(20), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(slope.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out slope); GUILayout.Space(2); GUILayout.Label("x + ", Styles.NonEditable, GUILayout.Width(20), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(displY.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out displY); GUILayout.EndHorizontal(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.EndHorizontal(); // We reset the baseHeight in case the curveType was linearParts and then it came here baseHeight = height * 1.5f; break; case curveType.Exponential: GUILayout.BeginHorizontal(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.BeginHorizontal(); // Exponential curve formula GUILayout.Label("y = (x - ", Styles.NonEditable, GUILayout.Width(20), GUILayout.Height(25)); GUILayout.Space(15); float.TryParse(EditorGUILayout.TextArea(displX.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out displX); GUILayout.Label(")", Styles.NonEditable, GUILayout.Width(10), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(exp.ToString(), Styles.Exponent, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out exp); GUILayout.Space(2); GUILayout.Label(" + ", Styles.NonEditable, GUILayout.Width(20), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(displY.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out displY); GUILayout.EndHorizontal(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.EndHorizontal(); // We reset the baseHeight in case the curveType was linearParts and then it came here baseHeight = height * 1.5f; break; case curveType.LinearParts: GUILayout.BeginHorizontal(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.BeginVertical(); openPointsFoldout = EditorGUILayout.Foldout(openPointsFoldout, "Points"); if (openPointsFoldout) { List <Vector2> auxList = new List <Vector2>(); // 2D points in the current list foreach (Vector2 point in points) { GUILayout.BeginHorizontal(); // The point GUILayout.Label("• (", Styles.NonEditable, GUILayout.Width(20), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(point.x.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out float varX); GUILayout.Label(", ", Styles.NonEditable, GUILayout.Width(10), GUILayout.Height(25)); float.TryParse(EditorGUILayout.TextArea(point.y.ToString(), Styles.TitleText, GUILayout.ExpandWidth(false), GUILayout.Height(20)), out float varY); GUILayout.Label(")", Styles.NonEditable, GUILayout.Width(10), GUILayout.Height(25)); // The X button for deleting the point // If you don't press it it adds the element to the updated list, else it doesn't hence it will appear as it has been deleted if (!GUILayout.Button("-", new GUIStyle(GUI.skin.button) { padding = new RectOffset(2, 0, 0, 2), alignment = TextAnchor.MiddleCenter, fontSize = 15 }, GUILayout.Width(20), GUILayout.Height(20))) { auxList.Add(new Vector2(varX, varY)); } GUILayout.EndHorizontal(); } points = auxList; // The + button for adding a point GUILayout.BeginHorizontal(); if (GUILayout.Button("+", new GUIStyle(GUI.skin.button) { padding = new RectOffset(0, 0, 0, 3), alignment = TextAnchor.MiddleCenter, fontSize = 15 }, GUILayout.Width(20), GUILayout.Height(20))) { points.Add(new Vector2(0, 0)); } GUILayout.EndHorizontal(); baseHeight = height * 1.5f + (points.Count + 1) * 25; } else { baseHeight = height * 1.5f; } GUILayout.EndVertical(); GUILayout.Space(windowRect.width * 0.2f); GUILayout.EndHorizontal(); break; } // Create the curve visualization foldout arrow GUILayout.BeginHorizontal(); GUILayout.Space(10); GUILayout.BeginVertical(); try { openFoldout = EditorGUILayout.Foldout(openFoldout, "Visualize curve"); if (openFoldout) { windowRect.height = baseHeight + 110; Rect rect = new Rect(windowRect.width * 0.15f, windowRect.height - 110, windowRect.width * 0.7f, windowRect.width * 0.7f); EditorGUI.DrawRect(rect, new Color(0, 0, 1, 0.25f)); Event e = Event.current; if (e.type == EventType.ScrollWheel) { regularSize += e.delta.y * 0.02f * regularSize; } float yMin = -regularSize; float yMax = regularSize; float xMin = -regularSize; float xMax = regularSize; float step = 1 / editor.position.width; Handles.color = new Color(0.6f, 0.6f, 0.6f); DrawAxis(rect); Handles.color = Color.white; Vector3 prevPos = new Vector3(0, CurveFunc(xMin), 0); for (float t = xMin + step; t < xMax; t += step * regularSize * 5) { Vector3 pos = new Vector3((t + xMax) / (xMax - xMin), CurveFunc(t), 0); if (pos.y < yMax && pos.y > yMin) { Handles.DrawLine( new Vector3(rect.xMin + prevPos.x * rect.width, rect.yMax - ((prevPos.y - yMin) / (yMax - yMin)) * rect.height, 0), new Vector3(rect.xMin + pos.x * rect.width, rect.yMax - ((pos.y - yMin) / (yMax - yMin)) * rect.height, 0)); } prevPos = pos; } } else { windowRect.height = baseHeight; } } finally { GUILayout.EndHorizontal(); GUILayout.EndVertical(); } break; } }