예제 #1
0
    /// <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;
    }
예제 #2
0
    /// <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;
        }
    }