/// <summary> Draws an input and an output port on the same line </summary> public static void PortPair(AnimationBaker.StateMachine.XNode.NodePort input, AnimationBaker.StateMachine.XNode.NodePort output) { GUILayout.BeginHorizontal(); NodeEditorGUILayout.PortField(input, GUILayout.MinWidth(0)); NodeEditorGUILayout.PortField(output, GUILayout.MinWidth(0)); GUILayout.EndHorizontal(); }
/// <summary> Draws standard field editors for all public fields </summary> public virtual void OnBodyGUI() { string[] excludes = { "m_Script", "graph", "position", "ports", "Duration", "RulesToggles", "Input", "Output", "WrapMode", "FrameRate" }; portPositions = new Dictionary <AnimationBaker.StateMachine.XNode.NodePort, Vector2>(); SerializedProperty iterator = serializedObject.GetIterator(); bool enterChildren = true; EditorGUIUtility.labelWidth = 84; while (iterator.NextVisible(enterChildren)) { enterChildren = false; if (excludes.Contains(iterator.name)) { continue; } NodeEditorGUILayout.PropertyField(iterator, true); } }
/// <summary> Draw a connection as we are dragging it </summary> public void DrawDraggedConnection() { if (IsDraggingPort) { Color col = NodeEditorPreferences.GetTypeColor(draggedOutput.ValueType); if (!_portConnectionPoints.ContainsKey(draggedOutput)) { return; } col.a = 0.6f; Vector2 from = _portConnectionPoints[draggedOutput].center; Vector2 to = Vector2.zero; for (int i = 0; i < draggedOutputReroutes.Count; i++) { to = draggedOutputReroutes[i]; DrawConnection(from, to, col); from = to; } to = draggedOutputTarget != null ? portConnectionPoints[draggedOutputTarget].center : WindowToGridPosition(Event.current.mousePosition); DrawConnection(from, to, col); Color bgcol = Color.black; Color frcol = col; bgcol.a = 0.6f; frcol.a = 0.6f; // Loop through reroute points again and draw the points for (int i = 0; i < draggedOutputReroutes.Count; i++) { // Draw reroute point at position Rect rect = new Rect(draggedOutputReroutes[i], new Vector2(16, 16)); rect.position = new Vector2(rect.position.x - 8, rect.position.y - 8); rect = GridToWindowRect(rect); NodeEditorGUILayout.DrawPortHandle(rect, bgcol, frcol); } } }
/// <summary> Draw an editable list of instance ports. Port names are named as "[fieldName] [index]" </summary> /// <param name="fieldName">Supply a list for editable values</param> /// <param name="type">Value type of added instance ports</param> /// <param name="serializedObject">The serializedObject of the node</param> /// <param name="connectionType">Connection type of added instance ports</param> public static void InstancePortList(string fieldName, Type type, SerializedObject serializedObject, AnimationBaker.StateMachine.XNode.Node.ConnectionType connectionType = AnimationBaker.StateMachine.XNode.Node.ConnectionType.Multiple) { AnimationBaker.StateMachine.XNode.Node node = serializedObject.targetObject as AnimationBaker.StateMachine.XNode.Node; SerializedProperty arrayData = serializedObject.FindProperty(fieldName); bool hasArrayData = arrayData != null && arrayData.isArray; int arraySize = hasArrayData ? arrayData.arraySize : 0; List <AnimationBaker.StateMachine.XNode.NodePort> instancePorts = node.InstancePorts.Where(x => x.fieldName.StartsWith(fieldName)).OrderBy(x => x.fieldName).ToList(); for (int i = 0; i < instancePorts.Count(); i++) { GUILayout.BeginHorizontal(); if (GUILayout.Button("-", GUILayout.Width(30))) { // Clear the removed ports connections instancePorts[i].ClearConnections(); // Move following connections one step up to replace the missing connection for (int k = i + 1; k < instancePorts.Count(); k++) { for (int j = 0; j < instancePorts[k].ConnectionCount; j++) { AnimationBaker.StateMachine.XNode.NodePort other = instancePorts[k].GetConnectionPort(j); instancePorts[k].DisconnectPort(other); instancePorts[k - 1].Connect(other); } } // Remove the last instance port, to avoid messing up the indexing node.RemoveInstancePort(instancePorts[instancePorts.Count() - 1].fieldName); serializedObject.Update(); // EditorUtility.SetDirty(node); node.IsDirty = true; if (hasArrayData) { arrayData.DeleteArrayElementAtIndex(i); arraySize--; } i--; } else { if (hasArrayData) { if (i < arraySize) { SerializedProperty itemData = arrayData.GetArrayElementAtIndex(i); if (itemData != null) { EditorGUILayout.PropertyField(itemData, new GUIContent(ObjectNames.NicifyVariableName(fieldName) + " " + i)); } else { EditorGUILayout.LabelField("[Missing array data]"); } } else { EditorGUILayout.LabelField("[Out of bounds]"); } } else { EditorGUILayout.LabelField(instancePorts[i].fieldName); } NodeEditorGUILayout.PortField(new GUIContent(), node.GetPort(instancePorts[i].fieldName), GUILayout.Width(-4)); } GUILayout.EndHorizontal(); } GUILayout.BeginHorizontal(); EditorGUILayout.Space(); if (GUILayout.Button("+", GUILayout.Width(30))) { string newName = fieldName + " 0"; int i = 0; while (node.HasPort(newName)) { newName = fieldName + " " + (++i); } instancePorts.Add(node.AddInstanceOutput(type, connectionType, newName)); serializedObject.Update(); // EditorUtility.SetDirty(node); node.IsDirty = true; if (hasArrayData) { arrayData.InsertArrayElementAtIndex(arraySize); } } GUILayout.EndHorizontal(); }
/// <summary> Draws an input and an output port on the same line </summary> public static void VerticalPortPair(AnimationBaker.StateMachine.XNode.NodePort input, AnimationBaker.StateMachine.XNode.NodePort output) { NodeEditorGUILayout.VerticalPortField(input, GUILayout.MinWidth(0)); NodeEditorGUILayout.VerticalPortField(output, GUILayout.MinWidth(0)); }