private void DrawInspector() { var inspectorPos = new Rect(position.width - InspectorWidth, 16, InspectorWidth, position.height - 32); var bg = NodePreferences.Instance.InsepctorTexture2D; GUI.DrawTexture(inspectorPos, bg); GUILayout.BeginArea(inspectorPos); if (LoadedGraph != null) { var style = NodeStyles.Instance.InspectorTitleLabel; var content = new GUIContent(LoadedGraph.name); var size = style.CalcSize(content); EditorGUILayout.LabelField(content, style, GUILayout.Height(size.y)); if (SelectedNodes != null && SelectedNodes.Count > 0) { EditorGUILayout.LabelField("Selected Nodes:"); for (var i = 0; i < SelectedNodes.Count; i++) { var nodeData = LoadedGraph.FindNodeData(SelectedNodes[i]); if (nodeData != null) { EditorGUILayout.LabelField(nodeData.NodeName); } } } } GUILayout.EndArea(); }
private void DestroyNode(NodeData node) { LoadedGraph.RemoveNodeById(node.Id); Repaint(); AssetDatabase.SaveAssets(); }
public void ClearAllNodes() { var nodeIds = LoadedGraph.Nodes.Select(x => x.Key); for (var i = nodeIds.Count() - 1; i >= 0; i--) { LoadedGraph.RemoveNodeById(nodeIds.ElementAt(i)); } AssetDatabase.SaveAssets(); }
private void ShowNodeContextMenu(string hoverNode) { var menu = new GenericMenu(); var node = LoadedGraph.FindNodeData(hoverNode); foreach (var nodeContextMethod in NodeCache.NodeContextMethods) { var methodInfo = nodeContextMethod.Value; if (methodInfo != null) { menu.AddItem(new GUIContent(nodeContextMethod.Key.MethodName), false, () => { methodInfo.Invoke(this, new object[] { node }); }); } } menu.ShowAsContext(); }
private void CreateNewNode(Type type, Vector2 graphPosition) { if (LoadedGraph == null) { return; } var newNode = CreateInstance(type) as Node; if (newNode == null) { Debug.LogError("Can't create node instance :" + type); return; } AssetDatabase.AddObjectToAsset(newNode, LoadedGraph); newNode.Graph = LoadedGraph; var newNodeData = new NodeData(newNode.NodeName, newNode); var editor = GetNodeEditor(newNodeData); var nodePos = graphPosition; var headerPos = new Rect(nodePos, new Vector2(editor.GetNodeWidth(), editor.GetNodeHeaderHeight())); var bodyPos = new Rect(nodePos + Vector2.up * editor.GetNodeHeaderHeight(), new Vector2(editor.GetNodeWidth(), 1000)); newNodeData.HeaderRect = headerPos; newNodeData.BodyRect = bodyPos; LoadedGraph.Nodes.Add(newNodeData.Id, newNodeData); LoadedGraph.RefreshPortDatas(); EditorUtility.SetDirty(LoadedGraph); AssetDatabase.SaveAssets(); Repaint(); }
private void ControlActions() { var evt = Event.current; switch (evt.type) { case EventType.MouseDown: if (evt.button == 0) { SelectActions(); } else if (evt.button == 1) { var node = MouseOverNode(); if (node != null) { ShowNodeContextMenu(node); } else { ShowGraphContextMenu(); } } break; case EventType.MouseUp: if (_hoverPort != null) { var targetPort = MouseOverPort(); if (targetPort != null) { var sourcePortData = LoadedGraph.Ports[_hoverPort]; var targetPortData = LoadedGraph.Ports[targetPort]; if (sourcePortData.VerifyConnection(targetPortData)) { if (_hoveringConnection != null) { var inPort = sourcePortData.Direction == PortDirection.In ? sourcePortData.PortId : targetPortData.PortId; var outPort = sourcePortData.Direction == PortDirection.Out ? sourcePortData.PortId : targetPortData.PortId; _hoveringConnection.Connection.InPortId = inPort; _hoveringConnection.Connection.OutPortId = outPort; _hoveringConnection.Hovering = false; } else { var connectionType = LoadedGraph.DefaultConnectionType; if (sourcePortData.OverrideConnectionType != null) { connectionType = sourcePortData.OverrideConnectionType; } CreateNewConnection(connectionType, sourcePortData, targetPortData); } } } else { if (_hoveringConnection != null) { LoadedGraph.RemoveConnectionById(_hoveringConnection.ConnectionId); AssetDatabase.SaveAssets(); } } } _hoveringConnection = null; _hoverNode = null; _hoverPort = null; Repaint(); break; case EventType.MouseDrag: if (evt.alt) { PanBackground(evt); } else { if (_hoverNode != null) { if (SelectedNodes != null && SelectedNodes.Count > 0) { for (var i = 0; i < SelectedNodes.Count; i++) { var selection = SelectedNodes[i]; var selectNode = LoadedGraph.FindNodeData(selection); var headerPos = selectNode.HeaderRect; var bodyPos = selectNode.BodyRect; headerPos.position += evt.delta * _zoom.x; bodyPos.position += evt.delta * _zoom.x; selectNode.HeaderRect = headerPos; selectNode.BodyRect = bodyPos; } } evt.Use(); } } Repaint(); break; case EventType.ScrollWheel: Zoom(evt.delta.y); Repaint(); break; } }
private void DrawConnections() { // Draw Temporary Connection if (_hoverPort != null) { var portData = LoadedGraph.FindPortData(_hoverPort); if (portData == null) { return; } if (portData.Connections.Count > 0 && portData.Direction == PortDirection.In) { var connectionId = portData.Connections[portData.Connections.Count - 1]; var connectionData = LoadedGraph.Connections[connectionId]; connectionData.Hovering = true; _hoverPort = portData.Direction == PortDirection.In ? connectionData.OutputPortId : connectionData.InputPortId; portData = LoadedGraph.Ports[_hoverPort]; _hoveringConnection = connectionData; } var startPos = GraphToScreenSpace(portData.ConnectPoint); var endPos = Event.current.mousePosition; var direction = portData.Direction == PortDirection.Out ? 1 : -1; var mnog = Vector3.Distance(startPos, endPos); var startTan = startPos + Vector2.right * (NodePreferences.Instance.StartTanOff * mnog * direction); var endTan = endPos + Vector2.left * (NodePreferences.Instance.EndTanOff * mnog * direction); DrawCurve(startPos, endPos, startTan, endTan, Color.magenta, 3); } // Draw Saved Connections foreach (var connectionData in LoadedGraph.Connections.Values) { if (connectionData.Hovering) { continue; } var sourPortData = LoadedGraph.Ports[connectionData.InputPortId]; var targetPortData = LoadedGraph.Ports[connectionData.OutputPortId]; var direction = sourPortData.Direction == PortDirection.Out ? 1 : -1; var startPos = GraphToScreenSpace(sourPortData.ConnectPoint); var endPos = GraphToScreenSpace(targetPortData.ConnectPoint); var center = (startPos + endPos) / 2f; var mnog = Vector3.Distance(startPos, endPos); var startTan = startPos + Vector2.right * (NodePreferences.Instance.StartTanOff * mnog * direction); var endTan = endPos + Vector2.left * (NodePreferences.Instance.EndTanOff * mnog * direction); DrawCurve(startPos, endPos, startTan, endTan, connectionData.Connection.ConnectionColor, connectionData.Connection.LineWidth); DrawKnob(center, connectionData.Connection.KnobColor); DrawConnectionLabel(center, connectionData); } }