From 7ec429ba77c6a8890cf75fcedaf2a00cd37442a0 Mon Sep 17 00:00:00 2001 From: Emre Dogan <48212096+EmreDogann@users.noreply.github.com> Date: Sun, 8 Oct 2023 07:05:11 +0100 Subject: [PATCH] Changed node rendering. Header and Body (and optionally ports) sections are separate images. Allows more customizability. Updated Node Editor Preferences window. Better separators. Added additional appearance options. Removed Rounding in GridToWindowPositionNoClipped() (and DrawGrid()) which was originally meant to fix UI Sharpness. But it did not have impact in my case and without it made panning feel much smoother. --- Scripts/Editor/NodeEditor.cs | 53 ++++++- Scripts/Editor/NodeEditorAction.cs | 21 +-- Scripts/Editor/NodeEditorGUI.cs | 26 +++- Scripts/Editor/NodeEditorPreferences.cs | 62 +++++++- Scripts/Editor/NodeEditorReflection.cs | 27 +++- Scripts/Editor/NodeEditorResources.cs | 58 ++++++-- Scripts/Editor/NodeEditorWindow.cs | 16 +- Scripts/Editor/NodeGroupEditor.cs | 39 +++-- Scripts/Editor/RenameTextField.cs | 4 +- Scripts/Editor/Resources/xnode_node.png | Bin 20191 -> 813 bytes Scripts/Editor/Resources/xnode_node.png.meta | 86 ++++++++--- Scripts/Editor/Resources/xnode_node_body.png | Bin 0 -> 1467 bytes .../Editor/Resources/xnode_node_body.png.meta | 140 ++++++++++++++++++ .../Editor/Resources/xnode_node_header.png | Bin 0 -> 438 bytes .../Resources/xnode_node_header.png.meta | 140 ++++++++++++++++++ .../Resources/xnode_node_highlight.png.meta | 77 ++++++++-- Scripts/Editor/Resources/xnode_node_ports.png | Bin 0 -> 1139 bytes .../Resources/xnode_node_ports.png.meta | 140 ++++++++++++++++++ .../Editor/Resources/xnode_node_workfile.psd | Bin 33269 -> 35439 bytes .../Resources/xnode_node_workfile_long.psd | Bin 0 -> 52960 bytes .../xnode_node_workfile_long.psd.meta | 140 ++++++++++++++++++ Scripts/Node.cs | 72 ++++++++- Scripts/NodeGroup.cs | 4 +- 23 files changed, 997 insertions(+), 108 deletions(-) create mode 100644 Scripts/Editor/Resources/xnode_node_body.png create mode 100644 Scripts/Editor/Resources/xnode_node_body.png.meta create mode 100644 Scripts/Editor/Resources/xnode_node_header.png create mode 100644 Scripts/Editor/Resources/xnode_node_header.png.meta create mode 100644 Scripts/Editor/Resources/xnode_node_ports.png create mode 100644 Scripts/Editor/Resources/xnode_node_ports.png.meta create mode 100644 Scripts/Editor/Resources/xnode_node_workfile_long.psd create mode 100644 Scripts/Editor/Resources/xnode_node_workfile_long.psd.meta diff --git a/Scripts/Editor/NodeEditor.cs b/Scripts/Editor/NodeEditor.cs index 6c73af4..ba5a7f2 100644 --- a/Scripts/Editor/NodeEditor.cs +++ b/Scripts/Editor/NodeEditor.cs @@ -31,7 +31,7 @@ namespace XNodeEditor public virtual void OnHeaderGUI() { - GUILayout.Label(target.name, NodeEditorResources.styles.nodeHeader, GUILayout.Height(30)); + GUILayout.Label(target.name, NodeEditorResources.styles.nodeHeaderLabel, GUILayout.Height(30)); } /// Draws standard field editors for all public fields @@ -119,6 +119,11 @@ namespace XNodeEditor #endif } + /// + /// Called after rendering. Used for additional controls specific to a node. + /// + public virtual void OnControlsGUI() {} + public virtual int GetWidth() { Type type = target.GetType(); @@ -131,7 +136,7 @@ namespace XNodeEditor return 208; } - /// Returns color for target node + /// Returns tint for target node public virtual Color GetTint() { // Try get color from [NodeTint] attribute @@ -146,9 +151,34 @@ namespace XNodeEditor return NodeEditorPreferences.GetSettings().tintColor; } - public virtual GUIStyle GetBodyStyle() + /// Returns header color for target node + public virtual Color GetHeaderColor() { - return NodeEditorResources.styles.nodeBody; + // Try get color from [NodeColorHeader] attribute + Type type = target.GetType(); + Color color; + if (type.TryGetAttributeHeader(out color)) + { + return color; + } + // Return default color (grey) + + return NodeEditorPreferences.GetSettings().bgHeaderColor; + } + + /// Returns body color for target node + public virtual Color GetBodyColor() + { + // Try get color from [NodeColorBody] attribute + Type type = target.GetType(); + Color color; + if (type.TryGetAttributeBody(out color)) + { + return color; + } + // Return default color (grey) + + return NodeEditorPreferences.GetSettings().bgBodyColor; } public virtual GUIStyle GetHeaderStyle() @@ -156,6 +186,21 @@ namespace XNodeEditor return NodeEditorResources.styles.nodeHeader; } + public virtual GUIStyle GetPortsStyle() + { + return NodeEditorResources.styles.nodePorts; + } + + public virtual GUIStyle GetBodyStyle() + { + return NodeEditorResources.styles.nodeBody; + } + + public virtual GUIStyle GetHeaderLabelStyle() + { + return NodeEditorResources.styles.nodeHeaderLabel; + } + public virtual GUIStyle GetBodyHighlightStyle() { return NodeEditorResources.styles.nodeHighlight; diff --git a/Scripts/Editor/NodeEditorAction.cs b/Scripts/Editor/NodeEditorAction.cs index 4b9ed62..1ee113f 100644 --- a/Scripts/Editor/NodeEditorAction.cs +++ b/Scripts/Editor/NodeEditorAction.cs @@ -135,7 +135,9 @@ namespace XNodeEditor Repaint(); } - else if (currentActivity == NodeActivity.HoldNode) + else if (IsHoveringNode && IsHoveringTitle(hoveredNode) && + currentActivity == NodeActivity.HoldNode) + { RecalculateDragOffsets(e); isDoubleClick = false; @@ -241,11 +243,11 @@ namespace XNodeEditor else if (e.button == 1 || e.button == 2) { //check drag threshold for larger screens - if (e.delta.magnitude > dragThreshold) - { - panOffset += e.delta * zoom; - isPanning = true; - } + // if (e.delta.magnitude > dragThreshold) + // { + // } + isPanning = true; + panOffset += e.delta * zoom; } break; @@ -425,7 +427,8 @@ namespace XNodeEditor } // If click node header, select it. - if ((currentActivity == NodeActivity.HoldNode || !IsSelectingRenamingObject) && + if (IsHoveringNode && IsHoveringTitle(hoveredNode) && + (currentActivity == NodeActivity.HoldNode || !IsSelectingRenamingObject) && !(e.control || e.shift)) { selectedReroutes.Clear(); @@ -459,7 +462,7 @@ namespace XNodeEditor Repaint(); } - else if (e.button == 1 || e.button == 2) + else if (e.button == 1) { if (!isPanning) { @@ -896,7 +899,7 @@ namespace XNodeEditor } } - private bool IsHoveringTitle(Node node) + public bool IsHoveringTitle(Node node) { Vector2 mousePos = Event.current.mousePosition; //Get node position diff --git a/Scripts/Editor/NodeEditorGUI.cs b/Scripts/Editor/NodeEditorGUI.cs index c19d276..0e91de1 100755 --- a/Scripts/Editor/NodeEditorGUI.cs +++ b/Scripts/Editor/NodeEditorGUI.cs @@ -113,8 +113,8 @@ namespace XNodeEditor Vector2 tileOffset = new Vector2(xOffset, yOffset); // Amount of tiles - float tileAmountX = Mathf.Round(rect.size.x * zoom) / gridTex.width; - float tileAmountY = Mathf.Round(rect.size.y * zoom) / gridTex.height; + float tileAmountX = rect.size.x * zoom / gridTex.width; + float tileAmountY = rect.size.y * zoom / gridTex.height; Vector2 tileAmount = new Vector2(tileAmountX, tileAmountY); @@ -694,9 +694,7 @@ namespace XNodeEditor } else { - GUIStyle style = new GUIStyle(nodeEditor.GetBodyStyle()); - GUI.color = nodeEditor.GetTint(); - GUILayout.BeginVertical(style); + GUILayout.BeginVertical(); } GUI.color = guiColor; @@ -709,10 +707,27 @@ namespace XNodeEditor } else { + GUI.color = nodeEditor.GetHeaderColor(); + GUIStyle style = new GUIStyle(nodeEditor.GetHeaderStyle()); + GUILayout.BeginVertical(style); + + GUI.color = guiColor; nodeEditor.OnHeaderGUI(); + + GUILayout.EndVertical(); } + GUI.color = nodeEditor.GetBodyColor(); + GUIStyle bodyStyle = new GUIStyle(nodeEditor.GetBodyStyle()); + GUILayout.BeginVertical(bodyStyle); + + GUI.color = guiColor; + GUIStyle bodyPaddingStyle = NodeEditorResources.styles.nodePadding; + GUILayout.BeginVertical(bodyPaddingStyle); nodeEditor.OnBodyGUI(); + GUILayout.EndVertical(); + + GUILayout.EndVertical(); //If user changed a value, notify other scripts through onUpdateNode if (EditorGUI.EndChangeCheck()) @@ -809,6 +824,7 @@ namespace XNodeEditor } GUILayout.EndArea(); + nodeEditor.OnControlsGUI(); } if (e.type != EventType.Layout && currentActivity == NodeActivity.DragGrid) diff --git a/Scripts/Editor/NodeEditorPreferences.cs b/Scripts/Editor/NodeEditorPreferences.cs index 535b861..3090676 100644 --- a/Scripts/Editor/NodeEditorPreferences.cs +++ b/Scripts/Editor/NodeEditorPreferences.cs @@ -67,6 +67,9 @@ namespace XNodeEditor public float maxZoom = 5f; public float minZoom = 1f; public Color32 tintColor = new Color32(90, 97, 105, 255); + public Color32 bgHeaderColor = new Color32(50, 51, 54, 255); + public Color32 bgPortsColor = new Color32(65, 67, 70, 255); + public Color32 bgBodyColor = new Color32(65, 67, 70, 255); public Color32 highlightColor = new Color32(255, 255, 255, 255); public bool gridSnap = true; public bool autoSave = true; @@ -190,6 +193,10 @@ namespace XNodeEditor VerifyLoaded(); Settings settings = NodeEditorPreferences.settings[lastKey]; + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.Space(5); + + EditorGUILayout.BeginVertical(); if (GUILayout.Button(new GUIContent("Documentation", "https://github.com/Siccity/xNode/wiki"), GUILayout.Width(100))) { @@ -206,12 +213,16 @@ namespace XNodeEditor { ResetPrefs(); } + + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); } private static void GridSettingsGUI(string key, Settings settings) { //Label - EditorGUILayout.LabelField("Grid", EditorStyles.boldLabel); + // EditorGUILayout.LabelField("Grid", EditorStyles.boldLabel); + Separator("Grid Appearance"); settings.gridSnap = EditorGUILayout.Toggle(new GUIContent("Snap", "Hold CTRL in editor to invert"), settings.gridSnap); settings.zoomToMouse = @@ -224,8 +235,8 @@ namespace XNodeEditor settings.minZoom = EditorGUILayout.FloatField(new GUIContent("Min", "Lower limit to zoom"), settings.minZoom); EditorGUI.indentLevel--; - settings.gridLineColor = EditorGUILayout.ColorField("Color", settings.gridLineColor); - settings.gridBgColor = EditorGUILayout.ColorField(" ", settings.gridBgColor); + settings.gridLineColor = EditorGUILayout.ColorField("Line Color", settings.gridLineColor); + settings.gridBgColor = EditorGUILayout.ColorField("Background Color", settings.gridBgColor); if (GUI.changed) { SavePrefs(key, settings); @@ -239,7 +250,8 @@ namespace XNodeEditor private static void SystemSettingsGUI(string key, Settings settings) { //Label - EditorGUILayout.LabelField("System", EditorStyles.boldLabel); + // EditorGUILayout.LabelField("System", EditorStyles.boldLabel); + Separator("System"); settings.autoSave = EditorGUILayout.Toggle(new GUIContent("Autosave", "Disable for better editor performance"), settings.autoSave); @@ -258,14 +270,20 @@ namespace XNodeEditor private static void NodeSettingsGUI(string key, Settings settings) { //Label - EditorGUILayout.LabelField("Node", EditorStyles.boldLabel); - settings.tintColor = EditorGUILayout.ColorField("Tint", settings.tintColor); + // EditorGUILayout.LabelField("Node", EditorStyles.boldLabel); + Separator("Node Appearance"); + settings.tintColor = EditorGUILayout.ColorField("Global Tint", settings.tintColor); + settings.bgHeaderColor = EditorGUILayout.ColorField("Header Background", settings.bgHeaderColor); + settings.bgPortsColor = EditorGUILayout.ColorField("Ports Background", settings.bgPortsColor); + settings.bgBodyColor = EditorGUILayout.ColorField("Body Background", settings.bgBodyColor); settings.highlightColor = EditorGUILayout.ColorField("Selection", settings.highlightColor); + EditorGUILayout.Space(); settings.noodlePath = (NoodlePath)EditorGUILayout.EnumPopup("Noodle path", settings.noodlePath); settings.noodleThickness = EditorGUILayout.FloatField( new GUIContent("Noodle thickness", "Noodle Thickness of the node connections"), settings.noodleThickness); settings.noodleStroke = (NoodleStroke)EditorGUILayout.EnumPopup("Noodle stroke", settings.noodleStroke); + EditorGUILayout.Space(); settings.portTooltips = EditorGUILayout.Toggle("Port Tooltips", settings.portTooltips); settings.dragToCreate = EditorGUILayout.Toggle( @@ -290,7 +308,8 @@ namespace XNodeEditor private static void TypeColorsGUI(string key, Settings settings) { //Label - EditorGUILayout.LabelField("Types", EditorStyles.boldLabel); + // EditorGUILayout.LabelField("Types", EditorStyles.boldLabel); + Separator("Types"); //Clone keys so we can enumerate the dictionary and make changes. var typeColorKeys = new List(typeColors.Keys); @@ -322,6 +341,35 @@ namespace XNodeEditor } } + private static void Separator(string label = "") + { + Rect labelRect = EditorGUILayout.BeginHorizontal(GUILayout.Height(25)); + labelRect.y += 10; + + GUIStyle labelStyle = new GUIStyle(GUI.skin.label); + labelStyle.fontStyle = FontStyle.Bold; + Vector2 textSize = labelStyle.CalcSize(new GUIContent(label)); + float separatorWidth = (labelRect.width - textSize.x) / 2 - 5; + + // Needed here otherwise BeginHorizontal group has 0 height. + GUILayout.Label(""); + Color initialColor = GUI.color; + Color lineColor = new Color(0.5f, 0.5f, 0.5f); + GUI.color = lineColor; + GUI.Box(new Rect(labelRect.xMin + 5, labelRect.yMin, separatorWidth - 5, 1), string.Empty); + + GUI.color = initialColor; + GUI.Label(new Rect(labelRect.xMin + separatorWidth + 5, labelRect.yMin - 10, textSize.x, 20), label, + labelStyle); + + GUI.color = lineColor; + GUI.Box(new Rect(labelRect.xMin + separatorWidth + 10 + textSize.x, labelRect.yMin, separatorWidth - 5, 1), + string.Empty); + + GUI.color = initialColor; + EditorGUILayout.EndHorizontal(); + } + /// Load prefs if they exist. Create if they don't private static Settings LoadPrefs() { diff --git a/Scripts/Editor/NodeEditorReflection.cs b/Scripts/Editor/NodeEditorReflection.cs index 74825ed..1fe34f3 100644 --- a/Scripts/Editor/NodeEditorReflection.cs +++ b/Scripts/Editor/NodeEditorReflection.cs @@ -16,6 +16,8 @@ namespace XNodeEditor public static class NodeEditorReflection { [NonSerialized] private static Dictionary nodeTint; + [NonSerialized] private static Dictionary nodeHeaderColor; + [NonSerialized] private static Dictionary nodeBodyColor; [NonSerialized] private static Dictionary nodeWidth; /// All available node types public static Type[] nodeTypes => _nodeTypes != null ? _nodeTypes : _nodeTypes = GetNodeTypes(); @@ -37,7 +39,7 @@ namespace XNodeEditor return GetDerivedTypes(typeof(Node)); } - /// Custom node tint colors defined with [NodeColor(r, g, b)] + /// Custom node tint colors defined with [NodeTint(r, g, b)] public static bool TryGetAttributeTint(this Type nodeType, out Color tint) { if (nodeTint == null) @@ -48,6 +50,29 @@ namespace XNodeEditor return nodeTint.TryGetValue(nodeType, out tint); } + /// Custom node header colors defined with [NodeColorHeader(r, g, b)] + public static bool TryGetAttributeHeader(this Type nodeType, out Color headerColor) + { + if (nodeHeaderColor == null) + { + CacheAttributes(ref nodeHeaderColor, x => x.color); + } + + return nodeHeaderColor.TryGetValue(nodeType, out headerColor); + } + + + /// Custom node body colors defined with [NodeColorBody(r, g, b)] + public static bool TryGetAttributeBody(this Type nodeType, out Color bodyColor) + { + if (nodeBodyColor == null) + { + CacheAttributes(ref nodeBodyColor, x => x.color); + } + + return nodeBodyColor.TryGetValue(nodeType, out bodyColor); + } + /// Get custom node widths defined with [NodeWidth(width)] public static bool TryGetAttributeWidth(this Type nodeType, out int width) { diff --git a/Scripts/Editor/NodeEditorResources.cs b/Scripts/Editor/NodeEditorResources.cs index cc963e8..7c7be4e 100644 --- a/Scripts/Editor/NodeEditorResources.cs +++ b/Scripts/Editor/NodeEditorResources.cs @@ -11,9 +11,17 @@ namespace XNodeEditor public static Texture2D dotOuter => _dotOuter != null ? _dotOuter : _dotOuter = Resources.Load("xnode_dot_outer"); private static Texture2D _dotOuter; + + public static Texture2D nodeHeader => + _nodeHeader != null ? _nodeHeader : _nodeHeader = Resources.Load("xnode_node_header"); + private static Texture2D _nodeHeader; + public static Texture2D nodePorts => + _nodePorts != null ? _nodePorts : _nodePorts = Resources.Load("xnode_node_ports"); + private static Texture2D _nodePorts; public static Texture2D nodeBody => - _nodeBody != null ? _nodeBody : _nodeBody = Resources.Load("xnode_node"); + _nodeBody != null ? _nodeBody : _nodeBody = Resources.Load("xnode_node_body"); private static Texture2D _nodeBody; + public static Texture2D nodeHighlight => _nodeHighlight != null ? _nodeHighlight : _nodeHighlight = Resources.Load("xnode_node_highlight"); @@ -25,7 +33,16 @@ namespace XNodeEditor public static GUIStyle OutputPort => new GUIStyle(EditorStyles.label) { alignment = TextAnchor.UpperRight }; public class Styles { - public GUIStyle inputPort, outputPort, nodeHeader, nodeHeaderRename, nodeBody, tooltip, nodeHighlight; + public GUIStyle inputPort, + outputPort, + nodeHeaderLabel, + nodeHeaderLabelRename, + nodeHeader, + nodePorts, + nodeBody, + nodePadding, + tooltip, + nodeHighlight; public Styles() { @@ -44,22 +61,37 @@ namespace XNodeEditor outputPort.active.background = dot; outputPort.normal.background = dotOuter; - nodeHeader = new GUIStyle(); - nodeHeader.alignment = TextAnchor.MiddleCenter; - nodeHeader.fontStyle = FontStyle.Bold; - nodeHeader.normal.textColor = Color.white; + nodeHeaderLabel = new GUIStyle(); + nodeHeaderLabel.alignment = TextAnchor.MiddleCenter; + nodeHeaderLabel.fontStyle = FontStyle.Bold; + nodeHeaderLabel.normal.textColor = Color.white; - nodeHeaderRename = new GUIStyle(GUI.skin.textField); - nodeHeaderRename.alignment = TextAnchor.MiddleCenter; - nodeHeaderRename.fontStyle = FontStyle.Bold; - nodeHeaderRename.normal.textColor = Color.white; - nodeHeaderRename.fixedHeight = 18; - nodeHeaderRename.margin = new RectOffset(5, 5, 10, 8); + nodeHeaderLabelRename = new GUIStyle(GUI.skin.textField); + nodeHeaderLabelRename.alignment = TextAnchor.MiddleCenter; + nodeHeaderLabelRename.fontStyle = FontStyle.Bold; + nodeHeaderLabelRename.normal.textColor = Color.white; + nodeHeaderLabelRename.fixedHeight = 18; + nodeHeaderLabelRename.margin = new RectOffset(5, 5, 10, 8); + + nodePadding = new GUIStyle(); + nodePadding.padding = new RectOffset(16, 16, 3, 16); + + nodeHeader = new GUIStyle(); + nodeHeader.normal.background = NodeEditorResources.nodeHeader; + nodeHeader.border = new RectOffset(32, 32, 16, 0); + // nodeHeader.fixedHeight = 27; + nodeHeader.padding = new RectOffset(0, 0, 1, 0); + // nodeHeader.padding = new RectOffset(16, 16, 3, 16); + + nodePorts = new GUIStyle(); + nodePorts.normal.background = NodeEditorResources.nodePorts; + nodePorts.border = new RectOffset(32, 32, 32, 32); + // nodePorts.padding = new RectOffset(16, 16, 3, 16); nodeBody = new GUIStyle(); nodeBody.normal.background = NodeEditorResources.nodeBody; nodeBody.border = new RectOffset(32, 32, 32, 32); - nodeBody.padding = new RectOffset(16, 16, 4, 16); + // nodeBody.padding = new RectOffset(16, 16, 3, 16); nodeHighlight = new GUIStyle(); nodeHighlight.normal.background = NodeEditorResources.nodeHighlight; diff --git a/Scripts/Editor/NodeEditorWindow.cs b/Scripts/Editor/NodeEditorWindow.cs index 2cec68d..d6075d8 100644 --- a/Scripts/Editor/NodeEditorWindow.cs +++ b/Scripts/Editor/NodeEditorWindow.cs @@ -96,23 +96,12 @@ namespace XNodeEditor { if (playModeStateChange == PlayModeStateChange.EnteredEditMode) { - // graph = EditorUtility.InstanceIDToObject(graphInstanceID) as NodeGraph; - // OnOpen(graphInstanceID, 0); - // Repaint(); editModeEntered = true; } else if (playModeStateChange == PlayModeStateChange.ExitingPlayMode) { - // OnOpen(graphInstanceID, 0); - // Repaint(); editModeEntered = false; } - - // if (!EditorApplication.isPlaying) - // { - // OnOpen(graphInstanceID, 0); - // Repaint(); - // } } public Dictionary nodeSizes { get; } = new Dictionary(); @@ -279,9 +268,8 @@ namespace XNodeEditor public Vector2 GridToWindowPositionNoClipped(Vector2 gridPosition) { Vector2 center = position.size * 0.5f; - // UI Sharpness complete fix - Round final offset not panOffset - float xOffset = Mathf.Round(center.x * zoom + (panOffset.x + gridPosition.x)); - float yOffset = Mathf.Round(center.y * zoom + (panOffset.y + gridPosition.y)); + float xOffset = center.x * zoom + (panOffset.x + gridPosition.x); + float yOffset = center.y * zoom + (panOffset.y + gridPosition.y); return new Vector2(xOffset, yOffset); } diff --git a/Scripts/Editor/NodeGroupEditor.cs b/Scripts/Editor/NodeGroupEditor.cs index f5a00c6..f23a1bf 100644 --- a/Scripts/Editor/NodeGroupEditor.cs +++ b/Scripts/Editor/NodeGroupEditor.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using UnityEditor; using UnityEngine; using XNode; @@ -14,11 +15,13 @@ namespace XNodeEditor.NodeGroups public static Texture2D corner => _corner != null ? _corner : _corner = Resources.Load("xnode_corner"); private static Texture2D _corner; - private bool _isDragging; + private bool _isResizing; private Vector2 _size; private float _currentHeight; private Vector2 _draggingOffset; + private List _childNodesDragOffsets; + private const int mouseRectPadding = 4; private const int mouseRectMargin = 30; @@ -27,7 +30,7 @@ namespace XNodeEditor.NodeGroups public override void OnCreate() { _currentHeight = group.height; - headerStyle = new GUIStyle(NodeEditorResources.styles.nodeHeader); + headerStyle = new GUIStyle(NodeEditorResources.styles.nodeHeaderLabel); headerStyle.fontSize = 18; } @@ -38,11 +41,12 @@ namespace XNodeEditor.NodeGroups public override void OnBodyGUI() { + NodeEditorWindow.current.wantsMouseMove = true; Event e = Event.current; switch (e.type) { case EventType.MouseDrag: - if (_isDragging) + if (_isResizing) { group.width = Mathf.Max(200, (int)e.mousePosition.x + (int)_draggingOffset.x + 16); group.height = Mathf.Max(100, (int)e.mousePosition.y + (int)_draggingOffset.y - 34); @@ -58,6 +62,14 @@ namespace XNodeEditor.NodeGroups return; } + _childNodesDragOffsets = new List(group.GetNodes().Count); + foreach (Node node in group.GetNodes()) + { + _childNodesDragOffsets.Add(node.position - + NodeEditorWindow.current.WindowToGridPosition( + e.mousePosition)); + } + if (NodeEditorWindow.current.nodeSizes.TryGetValue(target, out _size)) { // Mouse position checking is in node local space @@ -65,7 +77,7 @@ namespace XNodeEditor.NodeGroups _size.y - (mouseRectMargin + mouseRectPadding), mouseRectMargin, mouseRectMargin); if (lowerRight.Contains(e.mousePosition)) { - _isDragging = true; + _isResizing = true; _draggingOffset = _size - e.mousePosition - new Vector2(GetBodyStyle().padding.right, GetBodyStyle().padding.bottom); } @@ -73,9 +85,9 @@ namespace XNodeEditor.NodeGroups break; case EventType.MouseUp: - _isDragging = false; + _isResizing = false; // Select nodes inside the group - if (Selection.Contains(target)) + if (false && Selection.Contains(target)) { var selection = Selection.objects.ToList(); // Select Nodes @@ -159,9 +171,9 @@ namespace XNodeEditor.NodeGroups public override void OnRenameActive() { - _currentHeight += 30 - NodeEditorResources.styles.nodeHeaderRename.fixedHeight - - NodeEditorResources.styles.nodeHeaderRename.margin.top + - NodeEditorResources.styles.nodeHeaderRename.margin.bottom / 2; + _currentHeight += 30 - NodeEditorResources.styles.nodeHeaderLabelRename.fixedHeight - + NodeEditorResources.styles.nodeHeaderLabelRename.margin.top + + NodeEditorResources.styles.nodeHeaderLabelRename.margin.bottom / 2; } @@ -175,12 +187,7 @@ namespace XNodeEditor.NodeGroups return group.width; } - public override Color GetTint() - { - return group.color; - } - - public override GUIStyle GetHeaderStyle() + public override GUIStyle GetHeaderLabelStyle() { return headerStyle; } diff --git a/Scripts/Editor/RenameTextField.cs b/Scripts/Editor/RenameTextField.cs index 46ee6a3..95138f3 100644 --- a/Scripts/Editor/RenameTextField.cs +++ b/Scripts/Editor/RenameTextField.cs @@ -35,9 +35,9 @@ namespace XNodeEditor public void DrawRenameTextField() { GUI.SetNextControlName(inputControlName); - GUIStyle stylesNodeHeaderRename = NodeEditorResources.styles.nodeHeaderRename; + GUIStyle stylesNodeHeaderRename = NodeEditorResources.styles.nodeHeaderLabelRename; stylesNodeHeaderRename.fontSize = - NodeEditor.GetEditor((Node)target, NodeEditorWindow.current).GetHeaderStyle().fontSize; + NodeEditor.GetEditor((Node)target, NodeEditorWindow.current).GetHeaderLabelStyle().fontSize; input = GUILayout.TextField(input, stylesNodeHeaderRename); EditorGUI.FocusTextInControl(inputControlName); diff --git a/Scripts/Editor/Resources/xnode_node.png b/Scripts/Editor/Resources/xnode_node.png index 6f0b42ebf871065541423b686e18ba31cf24fb5e..78115aad7a925469244945fec2f9fcec492105c9 100644 GIT binary patch literal 813 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVEW?e;uumf=k09AY$->Hw)>Lh z$yZ{dqL-*1z0~wY!13kU=W}d4^ev}ch`-?E|C4#=SNclzwvv*JsGRx&@>6ST78W=`3o&-J1O zMMaag#Or}b8TI(`UR4^Vdoa20Z+kEBw$8H^k)BVmJMbLtE;Q`IxXBV z*+b>f$BI8*CQ`i8Z41B5JzRQs^WVRJ7bk7}QCC{}HFopOKWDnrA4@mPUu@5OaZ4BLM!Yd+Coadp}iKCa~bU*j427)=;!l5Wpu*fL{rAmgI{Y_|K3Kbs-H zSzq>}>T|<=A0n>$Sv(h(yRCCH?f?23na{KS&0zUo%Bp!kP3ZCD_M_IxNmsWzRqSED z;rjcayZe^RQ~rW2-3G^}%~`FJpzv@?fARk9_Ge=lADA2Xm5G^5EI1F$1`M9AelF{r G5}E+mT59hA literal 20191 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 GgeCx}HN0g2 literal 0 HcmV?d00001 diff --git a/Scripts/Editor/Resources/xnode_node_header.png.meta b/Scripts/Editor/Resources/xnode_node_header.png.meta new file mode 100644 index 0000000..4066d7f --- /dev/null +++ b/Scripts/Editor/Resources/xnode_node_header.png.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: 822c779e6791fd645a3aeb9593342a8d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Editor/Resources/xnode_node_highlight.png.meta b/Scripts/Editor/Resources/xnode_node_highlight.png.meta index 21b6034..755845e 100644 --- a/Scripts/Editor/Resources/xnode_node_highlight.png.meta +++ b/Scripts/Editor/Resources/xnode_node_highlight.png.meta @@ -1,15 +1,13 @@ fileFormatVersion: 2 guid: 2ab2b92d7e1771b47bba0a46a6f0f6d5 -timeCreated: 1516610730 -licenseType: Free TextureImporter: - fileIDToRecycleName: {} + internalIDToNameTable: [] externalObjects: {} - serializedVersion: 4 + serializedVersion: 12 mipmaps: mipMapMode: 0 enableMipMap: 0 - sRGBTexture: 0 + sRGBTexture: 1 linearTexture: 0 fadeOut: 0 borderMipMap: 0 @@ -22,7 +20,12 @@ TextureImporter: externalNormalMap: 0 heightScale: 0.25 normalMapFilter: 0 + flipGreenChannel: 0 isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 grayScaleToAlpha: 0 generateCubemap: 6 cubemapConvolution: 0 @@ -31,12 +34,12 @@ TextureImporter: maxTextureSize: 2048 textureSettings: serializedVersion: 2 - filterMode: -1 + filterMode: 1 aniso: 1 - mipBias: -1 + mipBias: 0 wrapU: 1 wrapV: 1 - wrapW: -1 + wrapW: 0 nPOTScale: 0 lightmap: 0 compressionQuality: 50 @@ -45,18 +48,40 @@ TextureImporter: spriteMeshType: 1 alignment: 0 spritePivot: {x: 0.5, y: 0.5} - spriteBorder: {x: 0, y: 0, z: 0, w: 0} spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 spriteTessellationDetail: -1 textureType: 2 textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 maxTextureSizeSet: 0 compressionQualitySet: 0 textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 1 + swizzle: 50462976 + cookieLightType: 1 platformSettings: - - buildTarget: DefaultTexturePlatform + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 @@ -65,8 +90,11 @@ TextureImporter: crunchedCompression: 0 allowsAlphaSplitting: 0 overridden: 0 + ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 - - buildTarget: Standalone + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL maxTextureSize: 2048 resizeAlgorithm: 0 textureFormat: -1 @@ -75,13 +103,38 @@ TextureImporter: crunchedCompression: 0 allowsAlphaSplitting: 0 overridden: 0 + ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] outline: [] physicsShape: [] - spritePackingTag: + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 userData: assetBundleName: assetBundleVariant: diff --git a/Scripts/Editor/Resources/xnode_node_ports.png b/Scripts/Editor/Resources/xnode_node_ports.png new file mode 100644 index 0000000000000000000000000000000000000000..51360a15a8c193b1fd8ee47883a1e3f9015de226 GIT binary patch literal 1139 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 Hv8I0j2Z#x# delta 2432 zcmeHGeN0nV6u;Sgn@ztoidCd z^unTM2{_r@rntFk5H|%JbASkx0tza0ICM-tbfwlp`|j?0t4sEgWq&N$AKSY*_uSt- zzkANP_nbFTP8tr8r5=t6_d_G1R&qFi`P|C_W|zgd%=PYE_`&=l$BB|}Wiuw;&!}N3 zUJN4)lpRR-kp+Z^lEoo%54j>BNG6v{<*#^1#6hw^ad2R;SR@G!lZwNn616L_niK{p zMB)&UBs2kUi}AMHUo3$KDaoH3nyG9rsX{K@EKx{BL7T-A(N=|2D%un*4H7Bj@-5O$ z$(y!p3=URr=8SUw7872zmGOU{14OpB)CG1^f$H3_yOcf0fw>%DUSXd)Ye@mYmEolg zT%~j+2&jp4fxDFU>O^IhllKhvG3*&S^%b57EJ~|103gOostQiVeD0zIN{a9Vq=29V z1bTqIbJVr5F+{#$scp(b>CKVjgm21~+S!`whUwmj=*;?U53?)l0{cS;e8v-fz0M{* zFOe5bt1M@VhYk#@RMDA*vENvRmMkC3Sl{{Rr0v03&b6AFjLNdtres%AO_x7Ipx)~& z>YQvpV{tP_w5%~*zTP_1&AaJcyTZE?1Tvnv52#L!_`B!7b<5Jxl)rC-RY&irKA(5U z-xw~ijJ(vo7tZgE8BtXB?zTiaTPiE2>))jf0cA<&ZnY&hg(|)XznB;mgER(t`rz@W ze$fHL_3pX^Rh%lytGrqj&1kQJujd9mM-iSbJ4g$R?^!`u0^TSb>L0%dH zo9K1I^0mF!KD^-U7le_@X|xtn+d809c2GVCw1wi{soW09>)2?+^(hfd`P_5(fbpyc`!N@Wh;S zLIOyvg;>g=Tf7)X^8`YGe+NaFI3!FG>hZGgVQPHw`gtb+n70$rn9a4yBCHnyE$jib5(7+nyLP9iA`prR&J2r*_*)-5Sd|t4cP5-7XS%`t%Grdi+Vk}Y zf((BOo8JsnSGXl78N!(QsOt zhmACiF=5tqXsEjOQ8SB--5A}d)fpKC^z9m|170g=@fu*OMXFlHSi{)FA8LmBVdG&P zY&a-RBF5$NE?DTXYuKWQ@FRMez^KJ^gOzfYy>|8+KJJk diff --git a/Scripts/Editor/Resources/xnode_node_workfile_long.psd b/Scripts/Editor/Resources/xnode_node_workfile_long.psd new file mode 100644 index 0000000000000000000000000000000000000000..96b942f837b825594b259cd3bb9d54dace4838ad GIT binary patch literal 52960 zcmeGl2VfM%cJ?k;l3aS|?FhYuTOXyq(#Z%gigU zBn;t?5V);{GlwXNlm~H^%)HXF5X2DDuPZZ!NW1hYzUW;-h(t#S&C`eGiEb>L`sLlP z#t%z8mT}~T`&-H=t~cVc&J7#cWYg*ES%1WpKvkVC%M}!S)%5E~-%&bGFZZexJ_UxwN2|9zdn$3nVf|C-|G>M~r zctS2B)RW4})%jMARi_V0PShtSYtS zusC#0i57b=o`^uFfVJy6qs?KoTGU8aS8a7Vh9@N8gFJ`3TxOf+K^FTETE-!It2wDj zXG_uyNlt1llR@vvV{>vQ%9=r+#F|($YjM~ipQhD(AkwljPu5l+XEwK*)9xs2fD*VR z(rQk7)eIY(RKeP zwVFoo^r(7CB-Qz(_ps^s)+ZEAK(`k-Wuhl*d?Ksr`~v1Ue_ zsCZNQ&@kw;Ypk4E=NO^0*-S>g4%IKI!D4VLl}E6{lDtWM@>Au=F16SlI*XnyEf@iS zAx5JiTa%(m&(x&q64UgVDT$dZgml$9T_USXNlQ&Lq@<*2cp;UQ`DVX>bb(dxMEwNP zd{Z`9^+4XkS9WH#UdvXeu!+f;snv-!si~QXndxb|#G16~47MgyUt>tgq_qJL@*#G? zgT``3urxZ8PZ}(X0Unl;TAi7irZXfar`2R7YPG4FM4cwpkjPfES=GAqG(#Gz6&}$F znF}6OVzh%c&hXJv&{b+nD%t7&Pyt~wQk!7YadsA)%SfE5)1A$DVRg1m1U!A8>=%DVV;yS=)_izUG}Xn4*sV2=MjglI)`Esy zq-AILwrrlNf3`sK!;;YYnvDN}im>Y%{#Z2_Qc~HB41+c?Jv}`mF)bZ5F;kPJPt<1V z^%|W%MX%9=vj354$jVMh%T7rVtk@;120sJamTK^7vA#}csbvi#l7x~8fd8eMYnwg% z?KOANp5qeKoK`bL`&(PjC95{R8TuPU!N^`{K!Ny_bx z%4%5HM^ltq94u>bnh}9vyyu%Zj7QPDmBuDak!N&Z9z^prS#FHZ%vKdnssa%IFg^n; z3b58xvJR(hZ1prfAXTKCaKs9KHAGD+2}>NrNo+`pgxNf)Ax6pMnH&~3N2+S4(c~~% zC`rJF($x87lSlC-9*QI+iE#0jIM%1cW9iyZJK#HD%6yx{A`}7&SFaCVg5ae@V6j9#a6^{`R~Xc4gVkA` zV{Jwb=~2vCE`a5kE=-rl8LGxx97VkXGe!~Dn3V81FMI{ zb+955*3Y`NqP(`;E@%aYF(urQZ8Dmz@sPo|a8y}stvnQSaJguV5Cg;0=|O6I|sK!nh$z7eC~IXaU2JDR33iAm0qZ zw&sRVnx`O6ur0ec0xkKm{*kTjIdEmye1;gwu6jY}AYrbWJyb8Ldq6r!Y% z&Ts{oB!@qdS~LQbgwKaH>Pr>VgVBNu=0`arMK~-@6BQ{RBnew$*g^XX*9Ol5WnZh zC=S4Ja4Kk|w7~tW{s^k&tWKK;ga$%xrK@}egIrjN)cGa5fQ@k4S+1D1upBOz1ppai zR;%5eLNsXt&9@Q*l>Hi?P&I`?d%y#i=DLZ8@x&2=m{N1C8g9QuUb7(mZ46u^FoL+h;E%v_VPR_N-Y z_`;V6U?_;fz}D!T)V7BLeF;!40ooS^pg*8}u@}+4I-4{d!&>WBVz`zM52k7Oa1MqIW(#RZXaH7X49Sz|* z4Mw&R!rLL-+vGGGA&hS(@n%*BJ$(qutha;J*FiWL!YZz+0^VgqhJmxLs`Uw1`-C0f z%0XI^Z?(;!&W*aiet;Ubrpi>8u#G0x;Ycip9k+Cx0rtZ(+jJK2X!$Z@E)sjerU(?w zUxFfi(gh1*-SYTj<7k~R?LYCtyg9uv>oRy(g112Fycl`L{@odU*z)0Ha0Oe#;+sCJo&Z_~0~Ju+7K4%QI%c%^ZF}KE;df^9p@2bNuOSe( z{5*-jW(bMi98aW&KOrG;;Y51nqkv&N^)@gUhg3cczX4_NbZ5C#BQYT zS0ulpO09Qt4SbRiyvbnfAd1A3PNX~OMf$^Azm{Z>p(KYCk}Jqq7~z;qu7)v>~%sQSu9EVHifi zL@;qoC#DC}hZ)3ZnM`H`Q^<^FDwxU4wM;EzVVunM%&p8kW&!gMvy@rIyvV%9yvuyV zY-M&bdzb^v&&(N#RHBl^OS(z=N|Gd*l3d9sNtNU(Nv&kMWTs@cl4X)-C95Ux zN;XP%NSY-FB`2gr8ZK=w?I}%^W=iv=W2IB1HBwG`qjauxk#w2#IqB=t4bpAWX6Yg6 z=@5BHT!=a(F=S{+NyzvReaQ5X8$<34c_`$mkkujUL$-zN2{{^aUKSziDjOurmX*pT z$!cYdvN^IvvK6vdWbey%$o9#8k;~=n<^ALt@)G%E`84@;@;l{^$e)+5m2Z{rm7h>3 z6rB`<6vGu`6*`4OF-Ngj@vPz<#b=6ric`vPWe=rRS)`nzv?y;;E>b?Nd|UaMa=)@A zG&;0TXm;q>P($d9(0f9chrS-VIdorWOIS=;zp&w9RbkV@ZVr1e?76V_!@deT79Jj+ z5S|r2F5DPCEBwLm7s5Xb-xGdX6{{Mk%2!>fa;olDtyHa5?Nl9$h=}MLkrOc`!Vz(I z#Hxt*BEE?@6&V*fB(gNp5P4JNlE~GOpG6*t3XSR$l^b<+)Xb?PIm0lF{dNjac;-wJMQRsrjxo;VW;{|^E<8S z^mXTu&I3D->)hD+(a!I8KGY??%g`?RE_1uQ)MZy!N!Nj0E4p6S^@*;ZbUo3nd$;0l zwr-2Nz1Qtf_x9a$x=-uAu>0HH5A=xZF`|dD$HE@(^!P#DPMxbZsUK9YS0C-!wP#6B zXV0ZQH}z~u=$9});g*Ew6Ta>h)+@7DO|ON$*7Z8tyGQS`-q-hjruVKsp?xy@)b)9w z&xSrH`}XTQvG47D*Yy3qU&nr>{bu%irr%fnBl?f*KfV95{@Vx02V@SYAMnV4EdwP3 z(+1WJTrzO;AjzQgLB>Ik4B9$aHaKgrW$?1WUnHs$a}yg9pGn*^r2UZ5Lv9(eX2_AG z-bquE<|l1PI-i`DY)W39yjv5ixk7V`=5@`_+JRcVc8PX-N<>Og%1tS+ru>vTD3wip zH1*50xU{mg+tb#iolDP1=hB}`KakNop1xzlo=%{`KroX6$8l6NvcJO76KwFT0G;)1yan+jtK#}__S_)SqlQEkyP zMMsO%imxkPTOunNRWiTii_&hT`qEXUN3Y1Z;)W~Mk5Y}Q9QDwsZ$}Rt&5eG&Oj345 z*?nbSjp;MSGG@(KGPZQ=ePh2a?^iy({Ecz)apmKdjQg%aQ*nL8hRV3gYbu|v{G}?d z>Yl3Iy!RyQ=A`kFM@~wdv}&u8F!vcg@S!%C4Pw?bFwu)s59H)19a;t$w)r zs6Jo+fc~H%$FR_FfE~^*VE5MyuUSy@eeLkt`)Uu=jjUT#cgUD;e8~9Iw32C$O*>gX zwti*3%QVsSyjf|!*8G|!)>3a-Z|!bvvTn5vvdytIPtTry|Ma8WC~k$Fv0r6>)e#TQ z)F;mV&fA=O8b&lMX*kt5q4DLWm?lfpCo=}lxMRltnME_7ye{NA{dMcE?|J>r*YCL@ z_lBi6GB;M=xbCK2H_g6j->l+UPu(1LbN$Vq-jaOFf?JN?I`P)mXLp-DYxdsTif?;n zPUIYJ&KI{2z5TJjh5XIoW%sRKs9rdC;qm*gx&Na@sf!+aAnXC>1I-VP ze(=@By%*oR`0PV<5A9fzx8(VUyFPr!!zUjxJo4G2IgdW~ShvUKJ$B}CI)go{&G$@Wgk^CoJFaWag8rR&-u5Z^gNlmX*yZNrrXTJR0Kl=RR;aB2bnY)@< zJ!AFJHFay6U!DBw*4M6hZQbibUw`F|A#bdFv*(*j-fH*OJ#UA-J^O9fJ2T%ovDUWs z(7Uzo?p=4yy4~+hdT;ysaqBm|KkEGtKPdX(y$!h=-uZC&hi`tA{n2Y5XMVh9WBSI` zpQL^A%BN|czOpHO)9TF`n_u0MwdM7#!?wQt*~rh{-Bz&egYBi;H|`j-W9#SRKmYQJ zE5B&|((vW?J54)(+SRbDW%sPFWM9qwI{NEH-*o+E**^#T^ZDlV=C}3~?D^!|%5Qh? z)$cv{FZ;jF?wkEx#CMDK_t?Mcd+qmc9w<7n<%g+1>^o>X*m7vj;h4h@AL)POA3x^& z_{q^pNB8~2{p9-j&SRa9tvsH3eBFui6W{z|{-x#Q+*6%SJ#{+s^oBDN&+Kn$JgYeS z;JE?kUOzwT{8uis%SGQc;;A=)&OjWEqX$hS55ooh34G(g5q0pTl{SFSA{`0i`qFin zsOV;)*W{N${0NDpF=ChnX&KjUGMlKBN@b{06&k9F2@ea8X&0qZMYZb~7uPN>u49af z9_||-3A{29;o%XH5z(eaUyk@0wmjOVk&w1t3cEs0SA^HEYJfk+zsuV!RNJDzY zYGk?Nba4sOZ`R7==P!LRuUGGO74KH3q;j`x%~$kUP<#>`vWW2Z1`gT$rvJ$0JkBOCxu*=Mp@{oi46e`rYFS7v^UR>M-JYt*m^Xjcl93b zmIe8h?ezB4pZds=0Y%@mb)NwfPjoO8j!$>6-+EZMI0yZ_EVy`7^otkg=w@iNH!19%@om5YI(rTLs zS6YWrBo~I;tfU$S-qhe6*Fo3;r=5mCb-~FEoTyJMh&Nkt6o5X9zH&fV zfpJVM9KyUI#2E|=aNoNC4-o>5R>VS{oU~t?p8cyEeL{{mzTGj!d zE#apqI6J7s#AOagzTYfn*cjOFyMZ0&)ENMcmXhSbr#bF9bZVjS^Bvzfe&XXBui`B9 zBO-io6l<<#4c;A6g>PWOa9hD6Bm>=%gN^UcJ#z3cw-3Aw@ z%tQ+=T9&`2WfANB^3*#TCHEm(@JnUE-2%l=ZbS<%w&csxl0`ZHHRUXrZ@7yV{1RJm z9HkX4xM*4anwCYZ_sdi7q6Mc5e*%U}{@^GI3YCtJFQwv5G{eXE5b};tg}7Ik;INSb zzWcYs@07WRmE1X((VR-NJr%x%!&wDwf0&{h>^cuInfrVL?n4O-mILS;2ouRJ907wX zj^*z{4lFS2ne=Q10Brq>u1Cm_!S}eB&&qg8Cdwn8R=D8^Q}M(CtJLw5!TCK zX>h%v+HaKYk}Q$KXPau8w1l)9j8B2%!sla;N&Hr*%?w*98$W(LfFsR1I}ENBO{#1( zI`nnIf(}x^Ro3~lix9|w)1rj6=&FUJ3LD45Iy$;?5=*Lr-(zenwGcNrkef;RRk5dpGqQq5(BVW6&+ZY~1 z#@h7!GCo|ESMCPF%~@;mEX5-xU9E{O8O*iR=3KSbld8b(uuyn;lPSjo1$OJrZlX;l zA26vlIXO>yI2ocPTw&;vz<_C`zq~8!Z26EJRMv07k%EjSMp$Ts zAK8QQ;gQcZsNGAUB>pt=xpHh^ltu|R6Mo6kSxvLJFB3S2-WT@kxqa7g3b}n?5hmRX zmV<8x^{kFxMvAo`ZM4AZsmeO|sm8`KSnOkTbIbTYuaws?x+qc5Fl5wM!!Z7*)v(-I z$R0fe4Wr8Mr(qLjxswp$r(xJ`-A9`=Of96w5$wN?hLN#cvB_U=5CX!ugnCn{=PW4R z|BTT_%6^u~M{kNvja42ySy)wwX)9~;M&rFrYS9%_^2f#0qO#5~=C5LqV72CQBJEa_(E#&JrXU8X(pm&x+2dCN-YyTrzuzE@;mowpXrp44y1v8b;URQ+IfiB& z!=wk!%F%`O_3DtdZkV59O?CqbiK*pu1|xLSzf$C4t_T^7z>Js11`9>L2xCw%ox$Cn zLrF38X*&3t#R&bI1-@dTM=@u>)`;$%@6ub9JM|1Qn5fA__}aw?Iarzns2Yldc7$Ps z=EI&4c*m^^sMub>7=J*82+N5B`%n`u_n;quwACI=`{BI~YM!pA+NK?}%V+U0Pqj_^ z=gGU=FrS4@_>>u#a=e|R{EpT;yk0QC%M3OluJyNskn^|lYHh|x(Zj>556r`>53Fsx z^8J}FulNw07;fEHK@SKL(COxj=}Oxr@!P1i&MWwXUdPa<+x9I#=vEb$YqW(^ye}4}lx*q>8??M-IJxHyo zu~KL@rNx!BNmO!r>g%!9)dAiuLO`S1qgws;9=Wd8R3G*{#=qF3FH$f zj};7(kJCl$hQ(3*9LBox^M{nl@Q0f&|mq&fO4zcR5!p@7Vd4KFpPNwUmN0{ zI?97>B@kC?;qvg_rgyv1I+KBl07n%@U^f1+bF~#7(fC+?ztIC9Cmt9n5SRo;>`0~5 zqE_Sm|76f0QU`k@=}bnQz1U>6d%Mrd8t(uM7T0|!VLuiaOR%wmT@C{P?n&b0JRp)^ zS2W4LBSi>MP$8Ay-i})9vINbAUabv7dv5OOt*x3X3=vVEq14hqy$Kre^N_r+HU5KH zK0b@zP=il;KeeMRfakN!R{Q@j9u*1A8-DcNSTh5@cr2Ra9!uuGaW_%lhq)69tiW+p zy_q_oIJbzy#RxKh>3~=YoD$wMg^+vT8A3|Z7Z!!klxC+%&5$Sjfkxl#!iXU5H^q-R z2V^Gxl;0O2;I^_ug9H8buMnwMXI8Fh%d|^gD*Pvg^1x57DR?Rk`ksCv^ zA&)2rIEBaH9SiBr1$g%%nKg@kVk*!R;O^Yk8hndRfRpagg=6o8q^7Q1xpOB_1F#V0 z(>Ivy^-u%-0YP5|`1fy!U3dsGy%2+fq-zx}Krw&;Zr*;6-jgAWalG@GEpCW#|2lUV zV8Rz3B;Nxj8cyFk11o)bh;Tn%A5T*-6uta}m$ z-?t+m3%?N-zVx`8559}Uc@PyW45c`6r8s@3=H5AXE#TqsNrF4wRlxXz(a$8ya7Y4G z1D_P{v=|)|bS5YL?%03s2bovG_Dyu_JHGRTmjGILz<`;gTypEWFTS%scGXmN{ zdJ}a*L$D?gZ?x1jx$!h!Z>h)mFKX9le!H#4FRrI=e%R9Jfobe@W_(5ooOB;Lz0;0@ z#3L0>uMR8CtV3sjts4P~42052hAN|(MUBhdS#nRo{C|z1eAq48a!7%EP?|MOoDITA z%kSXJ*nqA#ro9Eu960fq1!oRFd&r=s!|FJEDqJDPcr2KU!Ix$RcGsXsf3%BjITfRE zhD5EU9Pl*~4-{}(M+f^SVh!MOEWQ>jcFG}?m*YA1)QTMAfBsr&qU8vz19GwK`FZGjnJ$~Rxul!Bpobyf zywxSyq5x$#Z+0%h|3kSFMWA*$58d z<*eDi`m;ohyL=M(?`!tEuK(`epFjdz-~A(he^`E^1Vjno2nIj8Rt_6T2;rhKoO8g* zK^(=S2OXi)!$2pz$gBs5cRW(~u0IshP2lVnzd>OEi*pw;vu>J|^UOLS05&fc0GL8r zWAq)T4Yk?bL*H$q*^WNMhbE3#`q0F|&2Zf4703Kxh~Dq_8RQ)792@{6g%;1xHPA2+ zQ0igp-+U{_LO2qqPED}y1`l!1Ov`yF;1xBj4kuzE7~`L`xO{xD)KS7iDxEf)m2(Jb zc^-jWsNIb)KqOX34OB0dA0c1i!a@8tRO7(3env4fiq zou#pp=OK1>P4h{Nkz=2_B+IuSqv0PRy!g`}Y4`|)7k+$%h7Ut{!AFP1uqX#n2SgnZ zbwJbsQ3w7vbbvXGz5OY7@68-JhJJy&UuS;Y3$f?jJ-+1Fjw4%LA$xCHzJq!L(v!{a z9N6ZPeS7^px33^SduY>BukAUt)1^H1%?jJCE8HGM==qcTHmsO;9sF$Y*A|ym!Cg0R z#Rlqow73-KPVC#XX8GcUyB8=HE?&N7(?0Z2&bZ{~P9AFB{^`fNKazj^>GtMB=){}` z=jQCmpMN~E`>^cDk3Ul{$JYnKu;>T0Z|7;9rzRIfanK_<3ZvW z7L51(3EHB_gE*Ed>VT*Nq7Gbs9r(ZSgWv~jg}>88s<3?o-|@?iZ*)dVnHF+}Fx|Go z#Mq9(O37K$LKx*%m>Jut4wIZCXW=KvI2iM~tFw|hk1^>+i0#(INoh=pvt}(NJ(L(D zDi~>*I!Hys(GafDM$>Q%gzM8{XgC(a=JZ%GEXqOD0Z|7;9T0Uu)PesE9bjUyw?E_V zy_uM85ZmwW*O}TvrCa%r6As#gxQ zz|2_7p%3rBezM!62xXL=GbcM{-*xZ3U(a{ltGH{nV{#_-Jz9uD64qH$GPS0Dw^>nN zGqpt189kIUL@rUr^%$g0+np{?(+=tphhEHSB4eb=i0GKzv9g%x2qpSC=mGs3-VH~) literal 0 HcmV?d00001 diff --git a/Scripts/Editor/Resources/xnode_node_workfile_long.psd.meta b/Scripts/Editor/Resources/xnode_node_workfile_long.psd.meta new file mode 100644 index 0000000..bc8a59e --- /dev/null +++ b/Scripts/Editor/Resources/xnode_node_workfile_long.psd.meta @@ -0,0 +1,140 @@ +fileFormatVersion: 2 +guid: b5cc599cf52979248a326e2799d2f59e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Scripts/Node.cs b/Scripts/Node.cs index be8dd39..077414b 100644 --- a/Scripts/Node.cs +++ b/Scripts/Node.cs @@ -557,7 +557,7 @@ namespace XNode } } - /// Specify a color for this node type + /// Specify a color tint for this node type [AttributeUsage(AttributeTargets.Class)] public class NodeTintAttribute : Attribute { @@ -589,6 +589,76 @@ namespace XNode } } + + /// Specify a header color for this node type + [AttributeUsage(AttributeTargets.Class)] + public class NodeColorHeaderAttribute : Attribute + { + public Color color; + + /// Specify a color for this node type + /// Red [0.0f .. 1.0f] + /// Green [0.0f .. 1.0f] + /// Blue [0.0f .. 1.0f] + /// Alpha [0.0f .. 1.0f] + public NodeColorHeaderAttribute(float r, float g, float b, float a = 1.0f) + { + color = new Color(r, g, b, a); + } + + /// Specify a color for this node type + /// HEX color value + public NodeColorHeaderAttribute(string hex) + { + ColorUtility.TryParseHtmlString(hex, out color); + } + + /// Specify a color for this node type + /// Red [0 .. 255] + /// Green [0 .. 255] + /// Blue [0 .. 255] + /// Alpha [0 .. 255] + public NodeColorHeaderAttribute(byte r, byte g, byte b, byte a = byte.MaxValue) + { + color = new Color32(r, g, b, a); + } + } + + + /// Specify a body color for this node type + [AttributeUsage(AttributeTargets.Class)] + public class NodeColorBodyAttribute : Attribute + { + public Color color; + + /// Specify a color for this node type + /// Red [0.0f .. 1.0f] + /// Green [0.0f .. 1.0f] + /// Blue [0.0f .. 1.0f] + /// Alpha [0.0f .. 1.0f] + public NodeColorBodyAttribute(float r, float g, float b, float a = 1.0f) + { + color = new Color(r, g, b, a); + } + + /// Specify a color for this node type + /// HEX color value + public NodeColorBodyAttribute(string hex) + { + ColorUtility.TryParseHtmlString(hex, out color); + } + + /// Specify a color for this node type + /// Red [0 .. 255] + /// Green [0 .. 255] + /// Blue [0 .. 255] + /// Alpha [0 .. 255] + public NodeColorBodyAttribute(byte r, byte g, byte b, byte a = byte.MaxValue) + { + color = new Color32(r, g, b, a); + } + } + /// Specify a width for this node type [AttributeUsage(AttributeTargets.Class)] public class NodeWidthAttribute : Attribute diff --git a/Scripts/NodeGroup.cs b/Scripts/NodeGroup.cs index a227b10..85d68bd 100644 --- a/Scripts/NodeGroup.cs +++ b/Scripts/NodeGroup.cs @@ -1,14 +1,14 @@ using System.Collections.Generic; -using UnityEngine; namespace XNode { + [NodeColorHeader(0.2f, 0.2f, 0.2f, 0.5f)] + [NodeColorBody(0.25f, 0.25f, 0.25f, 0.35f)] [CreateNodeMenu("Group")] public class NodeGroup : Node { public int width = 400; public int height = 400; - public Color color = new Color(1f, 1f, 1f, 0.1f); public override object GetValue(NodePort port) {