diff --git a/Samples/New HelloGraph.asset b/Samples/New HelloGraph.asset index 9d75329..bf5255f 100644 --- a/Samples/New HelloGraph.asset +++ b/Samples/New HelloGraph.asset @@ -12,142 +12,15 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2051a0adbd1ba974084a535dd06ab7d7, type: 3} m_Name: New HelloGraph m_EditorClassIdentifier: - nodeList: - - id: 0 - - id: 1 - - id: 2 - - id: 3 - nodeLinks: - - inPort: - portEntryName: A - nodeDataId: f33d73da-40c5-4b3a-ace7-40105e3489b6 - outPort: - portEntryName: Value - nodeDataId: ae519ad8-4bc8-46c5-a98a-dc95bc85b58a - - inPort: - portEntryName: A - nodeDataId: f33d73da-40c5-4b3a-ace7-40105e3489b6 - outPort: - portEntryName: Value - nodeDataId: 23526615-f15c-4bdf-96c2-38a57d30b10d - - inPort: - portEntryName: A - nodeDataId: f33d73da-40c5-4b3a-ace7-40105e3489b6 - outPort: - portEntryName: Value - nodeDataId: 06f5acb9-58d5-41b3-b7f5-bd90f7f9ab94 + nodeList: [] + nodeLinks: [] blackboardData: - id: 4 + id: 0 sceneReference: - editorModels: - - id: 5 + editorModels: [] graphViewModel: - id: 6 + id: 0 references: version: 1 00000000: - type: {class: BlackboardDragNode, ns: TNodeCore.Runtime.Models, asm: TNodeCore} - data: - positionInView: - serializedVersion: 2 - x: -345 - y: -42 - width: 0 - height: 0 - id: 23526615-f15c-4bdf-96c2-38a57d30b10d - nodeName: - entryPoint: 0 - isTest: 0 - blackboardDragTypeString: UnityEngine.GameObject, UnityEngine.CoreModule, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - blackDragData: HelloGameObject - isListElement: 0 - 00000001: - type: {class: BlackboardDragNode, ns: TNodeCore.Runtime.Models, asm: TNodeCore} - data: - positionInView: - serializedVersion: 2 - x: -345 - y: -84 - width: 0 - height: 0 - id: ae519ad8-4bc8-46c5-a98a-dc95bc85b58a - nodeName: - entryPoint: 0 - isTest: 0 - blackboardDragTypeString: UnityEngine.GameObject, UnityEngine.CoreModule, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - blackDragData: HelloGameObject - isListElement: 0 - 00000002: - type: {class: BlackboardDragNode, ns: TNodeCore.Runtime.Models, asm: TNodeCore} - data: - positionInView: - serializedVersion: 2 - x: -345 - y: -126 - width: 0 - height: 0 - id: 06f5acb9-58d5-41b3-b7f5-bd90f7f9ab94 - nodeName: - entryPoint: 0 - isTest: 0 - blackboardDragTypeString: UnityEngine.GameObject, UnityEngine.CoreModule, - Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - blackDragData: HelloGameObject - isListElement: 0 - 00000003: - type: {class: AddNode, ns: Samples, asm: Assembly-CSharp} - data: - positionInView: - serializedVersion: 2 - x: -17 - y: -18 - width: 0 - height: 0 - id: f33d73da-40c5-4b3a-ace7-40105e3489b6 - nodeName: AddNode - entryPoint: 0 - isTest: 0 - 00000004: - type: {class: HelloBlackboard, ns: TNode.Samples, asm: Assembly-CSharp} - data: - positionInView: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - id: - HelloString: - HelloGameObject: {fileID: 0} - V3S: - - {x: 0, y: 0, z: 0} - V2S: - - {x: 0, y: 0} - 00000005: - type: {class: PlacematModel, ns: TNode.TNodeCore.Editor.Models, asm: TNodeCore} - data: - positionInView: - serializedVersion: 2 - x: 465 - y: -21 - width: 500 - height: 500 - id: - hostModels: [] - zOrder: 0 - title: Title - 00000006: - type: {class: GraphViewModel, ns: TNode.TNodeCore.Editor.Models, asm: TNodeCore} - data: - positionInView: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - id: - persistScale: 1 - persistOffset: {x: 519, y: 347} - isBlackboardOn: 1 + type: {class: , ns: , asm: } diff --git a/TNodeCore/Runtime/Models/PortInfo.cs b/TNodeCore/Runtime/Models/PortInfo.cs index 1a11771..27bcd25 100644 --- a/TNodeCore/Runtime/Models/PortInfo.cs +++ b/TNodeCore/Runtime/Models/PortInfo.cs @@ -3,6 +3,9 @@ namespace TNodeCore.Runtime.Models{ [Serializable] public class PortInfo{ + /// + /// Port entry name is port's name ,not the portName of the port + /// public string portEntryName; public string nodeDataId; } diff --git a/TNodeCore/Runtime/RuntimeNode.cs b/TNodeCore/Runtime/RuntimeNode.cs index 3062874..99da772 100644 --- a/TNodeCore/Runtime/RuntimeNode.cs +++ b/TNodeCore/Runtime/RuntimeNode.cs @@ -19,16 +19,48 @@ namespace TNodeCore.Runtime{ public void SetInput(string portName,object value){ var valueType = value.GetType(); - var portType = _portAccessors[portName].Type; - if(portType!=valueType && !portType.IsAssignableFrom(valueType)){ - var res =RuntimeCache.RuntimeCache.Instance.GetConvertedValue(valueType, portType, value); - _portAccessors[portName].SetValue(NodeData, res); + var portPath = portName.Split(':'); + if (portPath.Length ==2){ + portName = portPath[0]; + int index = int.Parse(portPath[1]); + if(_portAccessors[portName].Type.IsArray){ + if (_portAccessors[portName].GetValue(NodeData) is Array array) + array.SetValue(value, index); + } + + if (_portAccessors[portName].Type.IsGenericType){ + if (_portAccessors[portName].GetValue(NodeData) is IList list) + list[index] = value; + } + } else{ - _portAccessors[portName].SetValue(NodeData,value); + var portType = _portAccessors[portName].Type; + if(portType!=valueType && !portType.IsAssignableFrom(valueType)){ + var res =RuntimeCache.RuntimeCache.Instance.GetConvertedValue(valueType, portType, value); + _portAccessors[portName].SetValue(NodeData, res); + } + else{ + _portAccessors[portName].SetValue(NodeData,value); + } } + } public object GetOutput(string portName){ + var portPath = portName.Split(':'); + if (portPath.Length == 2){ + portName = portPath[0]; + int index = int.Parse(portPath[1]); + if(_portAccessors[portName].Type.IsArray){ + if (_portAccessors[portName].GetValue(NodeData) is Array array) + return array.GetValue(index); + } + + if (_portAccessors[portName].Type.IsGenericType){ + if (_portAccessors[portName].GetValue(NodeData) is IList list) + return list[index]; + } + } return _portAccessors[portName].GetValue(NodeData); } public string[] GetPortsOfType (){ diff --git a/Tests.meta b/TNodeCore/Tests.meta similarity index 100% rename from Tests.meta rename to TNodeCore/Tests.meta diff --git a/TNodeCore/Tests/Editor.meta b/TNodeCore/Tests/Editor.meta new file mode 100644 index 0000000..e7ad56f --- /dev/null +++ b/TNodeCore/Tests/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7390f9f15b054e6bab7abbb4afefee48 +timeCreated: 1660804507 \ No newline at end of file diff --git a/TNodeCore/Tests/Runtime.meta b/TNodeCore/Tests/Runtime.meta new file mode 100644 index 0000000..bf8be39 --- /dev/null +++ b/TNodeCore/Tests/Runtime.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 44e6960483c34cc5bd93c350a34a1106 +timeCreated: 1660804527 \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs index 028ebe0..3b12042 100644 --- a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs +++ b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs @@ -278,7 +278,7 @@ namespace TNodeGraphViewImpl.Editor.Cache{ public class Launcher{ static Launcher(){ //Get version of the package - Debug.Log("TNodeCore v0.01 is launched"); + NodeEditorSingleton.Instance.Initialize(); } } diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index ba06ad6..3fd158f 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -426,9 +426,9 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ } public void ResetGraphView(){ ClearAll(); - LoadPersistentGraphViewData(); if (_nodeDict == null) throw new ArgumentNullException(nameof(_nodeDict)); + if (_data == null) return; foreach (var dataNode in _data.NodeDictionary.Values){ if(dataNode==null) continue; @@ -484,6 +484,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ } private void LoadPersistentGraphViewData(){ + if (_data == null) return; var r= _data.GraphViewModel; viewTransformChanged-=OnViewTransformChanged; UpdateViewTransform(r.persistOffset,new Vector3(r.persistScale,r.persistScale,1)); @@ -586,9 +587,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ }); links.Add(newNodeLink); } - } - _data.NodeLinks = links; } private void SaveGraphData(){ @@ -698,6 +697,9 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ /// /// The give rect is the actual position in the graph view public void AddTNode(NodeData nodeData, Rect rect){ + if (nodeData==null||nodeData.id == null){ + return; + } if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is Node nodeView){ //convert rect at graph space @@ -716,12 +718,9 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ } } }); - - - if(_nodeDict.ContainsKey(nodeData.id)==false) _nodeDict.Add(nodeData.id, nodeView); - if (_data.NodeDictionary.ContainsKey(nodeData.id) == false){ + if (_data!=null&&_data.NodeDictionary.ContainsKey(nodeData.id) == false){ Undo.RegisterCompleteObjectUndo(_data,"Node Creation"); _data.NodeDictionary.Add(nodeData.id,nodeData); } diff --git a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs index 59fc964..59d623f 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs @@ -95,10 +95,15 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ BuildDoubleClickRename(); } private void OnDataChangedHandler(T obj){ + if(obj.id==null||obj.id.Trim(' ').Length==0){ + Debug.LogWarning("You should not use a node data without id"); + return; + } this.title = _data.nodeName; if (_nodeInspectorInNode != null){ _nodeInspectorInNode.Data = obj; } + _viewLogger ??= new NodeViewLogger{NodeView = this}; if (NodeLogger.Loggers.ContainsKey(obj.id)){ NodeLogger.Loggers[obj.id] = _viewLogger; @@ -166,7 +171,8 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ } } - public virtual Type BuildGroupPortType(PortAttribute portAttribute,PropertyInfo propertyInfo,int index){ + + protected virtual Type BuildGroupPortType(PortAttribute portAttribute,PropertyInfo propertyInfo,int index){ var iList = propertyInfo.GetValue(_data) as IList; if (iList is Array array){ switch (portAttribute.TypeHandling){ @@ -224,7 +230,7 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ var port = new CustomPort(Orientation.Horizontal, Direction.Output, Port.Capacity.Single, BuildGroupPortType(attribute, propertyInfo,i)); - BuildPort(port, attribute, propertyInfo,outputContainer); + BuildGroupPort(port, attribute, propertyInfo,outputContainer,list[i],i); } } } @@ -240,7 +246,17 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ BuildPort(port,attribute,propertyInfo,inputContainer); } else{ - + var propertyValue = propertyInfo.GetValue(_data); + if (propertyValue is IList list){ + + for (var i = 0; i < list.Count; i++){ + var port = new CustomPort(Orientation.Horizontal, Direction.Input, + Port.Capacity.Single, + BuildGroupPortType(attribute, propertyInfo,i)); + BuildGroupPort(port, attribute, propertyInfo,inputContainer,list[i],i); + + } + } } } } @@ -261,6 +277,7 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ private void BuildGroupPort(Port port, PortAttribute attribute, PropertyInfo propertyInfo, VisualElement portContainer,object currentElement,int index = 0){ portContainer.Add(port); + port.name = propertyInfo.Name + ":" + index; if (currentElement is string str){ if (attribute.NameHandling == PortNameHandling.Auto){ port.portName = str; diff --git a/TNodeGraphViewImpl/Tests.meta b/TNodeGraphViewImpl/Tests.meta new file mode 100644 index 0000000..f937873 --- /dev/null +++ b/TNodeGraphViewImpl/Tests.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 61d88b1f3fc14972aa28c22a5afaa53e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: