From 4c6f83ddf35122fc8a3a6b20187657b6c8146c2b Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Mon, 4 Jul 2022 17:01:03 +0800 Subject: [PATCH] 1.node links correctly --- Sample/MathGraph/Editor/MathEditor.cs.meta | 2 +- ...sset => NodeAttribute Editor Config.asset} | 18 +---- ...=> NodeAttribute Editor Config.asset.meta} | 2 +- TNode/BaseModels.meta | 3 - TNode/BaseModels/Interfaces.meta | 3 - .../BaseModels/Interfaces/IEditorOnlyModel.cs | 5 -- .../Interfaces/IEditorOnlyModel.cs.meta | 3 - TNode/BaseModels/Interfaces/IModel.cs | 5 -- TNode/BaseModels/Interfaces/IModel.cs.meta | 3 - TNode/Editor/BaseViews/DataGraphView.cs | 78 ++++++++++--------- .../Editor/BaseViews/SimpleGraphSubWindow.cs | 25 +++++- TNode/Editor/Cache/NodeEditorExtensions.cs | 18 ++++- TNode/Editor/EditorPersistence.meta | 3 + .../GraphEditorData.cs | 3 + .../GraphEditorData.cs.meta | 0 .../IGraphViewPersistence.cs | 9 +++ .../IGraphViewPersistence.cs.meta | 3 + .../NodeEditorData.cs | 0 .../NodeEditorData.cs.meta | 0 .../EditorPersistence/SubWindowEditorData.cs | 5 ++ .../SubWindowEditorData.cs.meta | 3 + TNode/Editor/GraphEditor.cs | 3 + TNode/Editor/SearchWindowProvider.cs | 3 +- TNode/Editor/Tools/NodeCreator.meta | 3 + TNode/Editor/Tools/NodeCreator/NodeHelper.cs | 25 ++++++ .../Tools/NodeCreator/NodeHelper.cs.meta | 3 + TNode/JsonSerialize.meta | 3 + TNode/JsonSerialize/JsonSerializeTool.cs | 22 ++++++ TNode/JsonSerialize/JsonSerializeTool.cs.meta | 3 + TNode/JsonSerialize/NodeDataConverter.cs | 42 ++++++++++ TNode/JsonSerialize/NodeDataConverter.cs.meta | 3 + TNode/JsonSerialize/Vector3Converter.cs | 29 +++++++ TNode/JsonSerialize/Vector3Converter.cs.meta | 3 + TNode/Models/GraphData.cs | 15 +++- TNode/Models/NodeData.cs | 5 +- TNode/Runtime/RuntimeNode.cs | 18 ++++- TNode/RuntimeCache.meta | 3 + TNode/RuntimeCache/RuntimeCache.cs | 52 +++++++++++++ TNode/RuntimeCache/RuntimeCache.cs.meta | 3 + TNode/Tools.meta | 3 + TNode/{Editor => Tools}/NodeDataWrapper.cs | 2 + .../{Editor => Tools}/NodeDataWrapper.cs.meta | 0 42 files changed, 341 insertions(+), 93 deletions(-) rename Sample/MathGraph/Editor/{MathEditor.asset => NodeAttribute Editor Config.asset} (50%) rename Sample/MathGraph/Editor/{MathEditor.asset.meta => NodeAttribute Editor Config.asset.meta} (79%) delete mode 100644 TNode/BaseModels.meta delete mode 100644 TNode/BaseModels/Interfaces.meta delete mode 100644 TNode/BaseModels/Interfaces/IEditorOnlyModel.cs delete mode 100644 TNode/BaseModels/Interfaces/IEditorOnlyModel.cs.meta delete mode 100644 TNode/BaseModels/Interfaces/IModel.cs delete mode 100644 TNode/BaseModels/Interfaces/IModel.cs.meta create mode 100644 TNode/Editor/EditorPersistence.meta rename TNode/Editor/{ => EditorPersistence}/GraphEditorData.cs (68%) rename TNode/Editor/{ => EditorPersistence}/GraphEditorData.cs.meta (100%) create mode 100644 TNode/Editor/EditorPersistence/IGraphViewPersistence.cs create mode 100644 TNode/Editor/EditorPersistence/IGraphViewPersistence.cs.meta rename TNode/Editor/{Model => EditorPersistence}/NodeEditorData.cs (100%) rename TNode/Editor/{Model => EditorPersistence}/NodeEditorData.cs.meta (100%) create mode 100644 TNode/Editor/EditorPersistence/SubWindowEditorData.cs create mode 100644 TNode/Editor/EditorPersistence/SubWindowEditorData.cs.meta create mode 100644 TNode/Editor/Tools/NodeCreator.meta create mode 100644 TNode/Editor/Tools/NodeCreator/NodeHelper.cs create mode 100644 TNode/Editor/Tools/NodeCreator/NodeHelper.cs.meta create mode 100644 TNode/JsonSerialize.meta create mode 100644 TNode/JsonSerialize/JsonSerializeTool.cs create mode 100644 TNode/JsonSerialize/JsonSerializeTool.cs.meta create mode 100644 TNode/JsonSerialize/NodeDataConverter.cs create mode 100644 TNode/JsonSerialize/NodeDataConverter.cs.meta create mode 100644 TNode/JsonSerialize/Vector3Converter.cs create mode 100644 TNode/JsonSerialize/Vector3Converter.cs.meta create mode 100644 TNode/RuntimeCache.meta create mode 100644 TNode/RuntimeCache/RuntimeCache.cs create mode 100644 TNode/RuntimeCache/RuntimeCache.cs.meta create mode 100644 TNode/Tools.meta rename TNode/{Editor => Tools}/NodeDataWrapper.cs (98%) rename TNode/{Editor => Tools}/NodeDataWrapper.cs.meta (100%) diff --git a/Sample/MathGraph/Editor/MathEditor.cs.meta b/Sample/MathGraph/Editor/MathEditor.cs.meta index 49b41e3..7b70665 100644 --- a/Sample/MathGraph/Editor/MathEditor.cs.meta +++ b/Sample/MathGraph/Editor/MathEditor.cs.meta @@ -6,7 +6,7 @@ MonoImporter: defaultReferences: - m_ViewDataDictionary: {instanceID: 0} - mVisualTreeAsset: {fileID: 9197481963319205126, guid: b67f6dcbe2361b649ad2b7845207321b, type: 3} - - nodeEditorData: {fileID: 11400000, guid: acb7b8ebcdf5f4f40bccf1e405c94da3, type: 2} + - graphEditorData: {fileID: 11400000, guid: f582a62cc8e00144f97b4dff1f9ba8cc, type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Sample/MathGraph/Editor/MathEditor.asset b/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset similarity index 50% rename from Sample/MathGraph/Editor/MathEditor.asset rename to Sample/MathGraph/Editor/NodeAttribute Editor Config.asset index bfe8dac..4445e6d 100644 --- a/Sample/MathGraph/Editor/MathEditor.asset +++ b/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset @@ -9,19 +9,7 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cde084f079a7426daa86ed86cb80ed1b, type: 3} - m_Name: MathEditor + m_Script: {fileID: 11500000, guid: 99ad0af56b40495cb6bd6165e652266c, type: 3} + m_Name: NodeAttribute Editor Config m_EditorClassIdentifier: - nodeData: - rid: -2 - nodePos: - serializedVersion: 2 - x: 0 - y: 0 - width: 0 - height: 0 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } + nodesData: [] diff --git a/Sample/MathGraph/Editor/MathEditor.asset.meta b/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta similarity index 79% rename from Sample/MathGraph/Editor/MathEditor.asset.meta rename to Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta index 58b227a..f33c3eb 100644 --- a/Sample/MathGraph/Editor/MathEditor.asset.meta +++ b/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: acb7b8ebcdf5f4f40bccf1e405c94da3 +guid: f582a62cc8e00144f97b4dff1f9ba8cc NativeFormatImporter: externalObjects: {} mainObjectFileID: 11400000 diff --git a/TNode/BaseModels.meta b/TNode/BaseModels.meta deleted file mode 100644 index 58d544d..0000000 --- a/TNode/BaseModels.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 54cbaedb5bd248f68813368e888d8854 -timeCreated: 1655969230 \ No newline at end of file diff --git a/TNode/BaseModels/Interfaces.meta b/TNode/BaseModels/Interfaces.meta deleted file mode 100644 index 9f91538..0000000 --- a/TNode/BaseModels/Interfaces.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: a3385746bf2c4f7699ac027dcb138a53 -timeCreated: 1656129728 \ No newline at end of file diff --git a/TNode/BaseModels/Interfaces/IEditorOnlyModel.cs b/TNode/BaseModels/Interfaces/IEditorOnlyModel.cs deleted file mode 100644 index 086ca5c..0000000 --- a/TNode/BaseModels/Interfaces/IEditorOnlyModel.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace TNode.BaseModels{ - public interface IEditorOnlyModel{ - - } -} \ No newline at end of file diff --git a/TNode/BaseModels/Interfaces/IEditorOnlyModel.cs.meta b/TNode/BaseModels/Interfaces/IEditorOnlyModel.cs.meta deleted file mode 100644 index 2199be5..0000000 --- a/TNode/BaseModels/Interfaces/IEditorOnlyModel.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 051a8933e6bf4b4ebdff2df9be042774 -timeCreated: 1655969265 \ No newline at end of file diff --git a/TNode/BaseModels/Interfaces/IModel.cs b/TNode/BaseModels/Interfaces/IModel.cs deleted file mode 100644 index da5a36c..0000000 --- a/TNode/BaseModels/Interfaces/IModel.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace TNode.BaseModels{ - public interface IModel{ - - } -} \ No newline at end of file diff --git a/TNode/BaseModels/Interfaces/IModel.cs.meta b/TNode/BaseModels/Interfaces/IModel.cs.meta deleted file mode 100644 index 6e40510..0000000 --- a/TNode/BaseModels/Interfaces/IModel.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 86896378e3c14a3dbf1e736b039f9acc -timeCreated: 1655969210 \ No newline at end of file diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index e2e3a8f..33d6229 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -6,10 +6,12 @@ using TNode.Cache; using TNode.Editor.Inspector; using TNode.Editor.Model; using TNode.Models; +using Unity.VisualScripting; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; +using Edge = UnityEditor.Experimental.GraphView.Edge; namespace TNode.Editor.BaseViews{ /* @@ -107,9 +109,13 @@ namespace TNode.Editor.BaseViews{ */ public abstract class DataGraphView:GraphView,IDataGraphView where T:GraphData{ private T _data; - private SearchWindowProvider _searchWindowProvider; private bool _isInspectorOn; + + private SearchWindowProvider _searchWindowProvider; private NodeInspector _nodeInspector; + public GraphEditor Owner; + private Dictionary _nodeDict = new(); + public T Data{ get{ return _data; } set{ @@ -129,8 +135,8 @@ namespace TNode.Editor.BaseViews{ foreach (var edge in edges){ RemoveElement(edge); } - Dictionary nodeDict = new Dictionary(); - if (nodeDict == null) throw new ArgumentNullException(nameof(nodeDict)); + + if (_nodeDict == null) throw new ArgumentNullException(nameof(_nodeDict)); foreach (var dataNode in _data.NodeDictionary.Values){ if(dataNode==null) continue; @@ -138,25 +144,18 @@ namespace TNode.Editor.BaseViews{ //Get the node type var nodeType = dataNode.GetType(); //Get the derived type of NodeAttribute View from the node type - var nodeViewType = typeof(NodeView<>).MakeGenericType(nodeType); - - //Fetch the node view from the node view type - var nodeView = NodeEditorExtensions.CreateInstance(nodeViewType); - - //Cast the node view to the nodeViewType - AddElement((Node)nodeView); + + var nodePos = Owner.graphEditorData.nodesData. + FirstOrDefault(x => x.nodeGuid == dataNode.id)?.nodePos??new Rect(0,0,200,200); - ((INodeView)nodeView).SetNodeData(dataNode); - - //Add the node view to the node dictionary - nodeDict.Add(dataNode.id, (Node)nodeView); + AddTNode(dataNode,nodePos); } - foreach (var edge in _data.NodeLinks){ + foreach (var edge in _data.nodeLinks){ var inputNode = _data.NodeDictionary[edge.inPort.nodeDataId]; var outputNode = _data.NodeDictionary[edge.outPort.nodeDataId]; - var inputNodeView = nodeDict[inputNode.id]; - var outputNodeView = nodeDict[outputNode.id]; + var inputNodeView = _nodeDict[inputNode.id]; + var outputNodeView = _nodeDict[outputNode.id]; Edge newEdge = new Edge(){ input = inputNodeView.inputContainer.Q(edge.inPort.portName), output = outputNodeView.outputContainer.Q(edge.outPort.portName) @@ -165,7 +164,7 @@ namespace TNode.Editor.BaseViews{ newEdge.output?.Connect(newEdge); AddElement(newEdge); } - nodeDict.Clear(); + _nodeDict.Clear(); } //A Constructor for the DataGraphView ,never to override it public DataGraphView(){ @@ -235,9 +234,11 @@ namespace TNode.Editor.BaseViews{ } public void SaveEditorData(GraphEditorData graphEditorData){ - graphEditorData.nodesData.Clear(); + graphEditorData.nodesData?.Clear(); //iterator nodes - + if (graphEditorData.nodesData == null){ + graphEditorData.nodesData = new List(); + } foreach (var node in this.nodes){ var nodeEditorData = new NodeEditorData{ nodePos = node.GetPosition(), @@ -249,25 +250,14 @@ namespace TNode.Editor.BaseViews{ EditorUtility.SetDirty(graphEditorData); } } - public void LoadEditorData(GraphEditorData graphEditorData){ - //Load node position - foreach (var nodeEditorData in graphEditorData.nodesData){ - - var node = this.nodes.Select(x => x as INodeView).First(x=>x?.GetNodeData().id==nodeEditorData.nodeGuid); - - if (node != null){ - ((GraphElement)node).SetPosition(nodeEditorData.nodePos); - } - } - } - - + public void SaveWithEditorData(GraphEditorData graphEditorData){ SaveEditorData(graphEditorData); SaveGraphData(); } - private void SaveGraphData(){ + private void SaveNode(){ + foreach (var node in nodes){ if (node is INodeView nodeView){ var nodeData = nodeView.GetNodeData(); @@ -276,11 +266,13 @@ namespace TNode.Editor.BaseViews{ } } } - //force edge to write as links + } + private void SaveEdge(){ foreach (var edge in edges){ var inputNode = edge.input.node as INodeView; var outputNode = edge.output.node as INodeView; var links = new List(); + Debug.Log($"Edge{inputNode},{outputNode}"); if (inputNode != null && outputNode != null){ var inputNodeData = inputNode.GetNodeData(); var outputNodeData = outputNode.GetNodeData(); @@ -292,15 +284,24 @@ namespace TNode.Editor.BaseViews{ nodeDataId = outputNodeData.id, portName = edge.output.name }); + links.Add(newNodeLink); } - _data.NodeLinks = links; + _data.nodeLinks = links; } + } + private void SaveGraphData(){ + _data.NodeDictionary.Clear(); + + SaveNode(); + SaveEdge(); + EditorUtility.SetDirty(_data); - AssetDatabase.SaveAssets(); } + + public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter){ return ports.Where(x => x.portType == startPort.portType).ToList(); } @@ -316,7 +317,7 @@ namespace TNode.Editor.BaseViews{ } public void AddTNode(NodeData nodeData, Rect rect){ - if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is GraphElement nodeView){ + if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is Node nodeView){ nodeView.SetPosition(rect); AddElement(nodeView); //Add a select callback to the nodeView @@ -333,6 +334,7 @@ namespace TNode.Editor.BaseViews{ if(nodeView is INodeView nodeViewInterface){ nodeViewInterface.SetNodeData(nodeData); } + _nodeDict.Add(nodeData.id, nodeView); } } diff --git a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs b/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs index 4376929..6eb82cf 100644 --- a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs +++ b/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs @@ -1,9 +1,12 @@ -using UnityEditor; +using System.Linq; +using TNode.Editor; +using TNode.Editor.EditorPersistence; +using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine.UIElements; namespace TNode.BaseViews{ - public class SimpleGraphSubWindow:GraphElement{ + public class SimpleGraphSubWindow:GraphElement,IGraphViewPersistence{ private readonly Dragger _dragger = new Dragger(); protected void ConstructWindowBasicSetting(){ @@ -32,5 +35,23 @@ namespace TNode.BaseViews{ ConstructWindowBasicSetting(); BuildWindow(visualTreeAsset); } + + public string GetPersistenceId(){ + throw new System.NotImplementedException(); + } + + public void ResetPos(GraphEditorData editorData){ + var res = editorData.subWindowPos.FirstOrDefault(x => x.nodeGuid == this.GetPersistenceId()); + } + + public void SavePos(GraphEditorData editorData){ + + } + + public void OnRemoveFromGraph(GraphEditorData editorData){ + + } } + + } \ No newline at end of file diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index 3f998bd..813d68a 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -81,9 +81,21 @@ namespace TNode.Cache{ return instance; } public static object CreateInstance(Type t){ - var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[t]; - var instance = Activator.CreateInstance(implementedType); - return instance; + if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(t)){ + var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[t]; + var instance = Activator.CreateInstance(implementedType); + return instance; + } + else{ + Debug.Log($"No given type found {t}"); + //check if t is a generic type node view + if (t is{IsGenericType: true} && t.GetGenericTypeDefinition() == typeof(NodeView<>)){ + var instance = Activator.CreateInstance(typeof(NodeView)); + return instance; + } + + return null; + } } public static bool HasSpecificType() where T : class{ diff --git a/TNode/Editor/EditorPersistence.meta b/TNode/Editor/EditorPersistence.meta new file mode 100644 index 0000000..68ef01e --- /dev/null +++ b/TNode/Editor/EditorPersistence.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dbf5832fcb3240429c6ca4e68ee28ef9 +timeCreated: 1656924665 \ No newline at end of file diff --git a/TNode/Editor/GraphEditorData.cs b/TNode/Editor/EditorPersistence/GraphEditorData.cs similarity index 68% rename from TNode/Editor/GraphEditorData.cs rename to TNode/Editor/EditorPersistence/GraphEditorData.cs index 20f999c..e096ec5 100644 --- a/TNode/Editor/GraphEditorData.cs +++ b/TNode/Editor/EditorPersistence/GraphEditorData.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using TNode.Editor.EditorPersistence; using TNode.Editor.Model; using UnityEngine; @@ -7,6 +8,8 @@ namespace TNode.Editor{ [CreateAssetMenu(fileName = "NodeAttribute Editor Config", menuName = "TNode/NodeAttribute Editor Config")] public class GraphEditorData:ScriptableObject{ public List nodesData; + public List subWindowPos; + public List graphViewPersistence; } } \ No newline at end of file diff --git a/TNode/Editor/GraphEditorData.cs.meta b/TNode/Editor/EditorPersistence/GraphEditorData.cs.meta similarity index 100% rename from TNode/Editor/GraphEditorData.cs.meta rename to TNode/Editor/EditorPersistence/GraphEditorData.cs.meta diff --git a/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs b/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs new file mode 100644 index 0000000..bc9e60c --- /dev/null +++ b/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs @@ -0,0 +1,9 @@ +namespace TNode.Editor.EditorPersistence{ + public interface IGraphViewPersistence{ + public string GetPersistenceId(); + public void ResetPos(GraphEditorData editorData); + public void SavePos(GraphEditorData editorData); + + public void OnRemoveFromGraph(GraphEditorData editorData); + } +} \ No newline at end of file diff --git a/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs.meta b/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs.meta new file mode 100644 index 0000000..d98a0b5 --- /dev/null +++ b/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98a1e33328e84b9fa71241f2a1ce42a1 +timeCreated: 1656924679 \ No newline at end of file diff --git a/TNode/Editor/Model/NodeEditorData.cs b/TNode/Editor/EditorPersistence/NodeEditorData.cs similarity index 100% rename from TNode/Editor/Model/NodeEditorData.cs rename to TNode/Editor/EditorPersistence/NodeEditorData.cs diff --git a/TNode/Editor/Model/NodeEditorData.cs.meta b/TNode/Editor/EditorPersistence/NodeEditorData.cs.meta similarity index 100% rename from TNode/Editor/Model/NodeEditorData.cs.meta rename to TNode/Editor/EditorPersistence/NodeEditorData.cs.meta diff --git a/TNode/Editor/EditorPersistence/SubWindowEditorData.cs b/TNode/Editor/EditorPersistence/SubWindowEditorData.cs new file mode 100644 index 0000000..ff64408 --- /dev/null +++ b/TNode/Editor/EditorPersistence/SubWindowEditorData.cs @@ -0,0 +1,5 @@ +namespace TNode.Editor.EditorPersistence{ + public class SubWindowEditorData{ + + } +} \ No newline at end of file diff --git a/TNode/Editor/EditorPersistence/SubWindowEditorData.cs.meta b/TNode/Editor/EditorPersistence/SubWindowEditorData.cs.meta new file mode 100644 index 0000000..ce1a4cd --- /dev/null +++ b/TNode/Editor/EditorPersistence/SubWindowEditorData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5c5b739c655d41fb995c162a2db9db48 +timeCreated: 1656925041 \ No newline at end of file diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index 6f03e24..48ad37a 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -75,10 +75,13 @@ namespace TNode.Editor{ T asset = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(asset, path); AssetDatabase.SaveAssets(); + } } else{ _graphView.SaveWithEditorData(graphEditorData); + AssetDatabase.Refresh(); + } } diff --git a/TNode/Editor/SearchWindowProvider.cs b/TNode/Editor/SearchWindowProvider.cs index 8a273bd..e719cbe 100644 --- a/TNode/Editor/SearchWindowProvider.cs +++ b/TNode/Editor/SearchWindowProvider.cs @@ -4,6 +4,7 @@ using System.Drawing; using TNode.BaseViews; using TNode.Cache; using TNode.Editor.BaseViews; +using TNode.Editor.Tools.NodeCreator; using TNode.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -47,7 +48,7 @@ namespace TNode.Editor{ //Check if type is derived from NodeData if (typeof(NodeData).IsAssignableFrom(type)){ //Make an instance of the type - if (Activator.CreateInstance(type) is NodeData nodeData){ + if (NodeHelper.InstantiateNodeData(type) is { } nodeData){ nodeData.nodeName = "New Node"; ((IDataGraphView) _graphView).AddTNode(nodeData, new Rect(localPos.x, localPos.y, 100, 100)); } diff --git a/TNode/Editor/Tools/NodeCreator.meta b/TNode/Editor/Tools/NodeCreator.meta new file mode 100644 index 0000000..c9852dc --- /dev/null +++ b/TNode/Editor/Tools/NodeCreator.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5671acbef854a59a67a63c3bab58547 +timeCreated: 1656911640 \ No newline at end of file diff --git a/TNode/Editor/Tools/NodeCreator/NodeHelper.cs b/TNode/Editor/Tools/NodeCreator/NodeHelper.cs new file mode 100644 index 0000000..adf3b15 --- /dev/null +++ b/TNode/Editor/Tools/NodeCreator/NodeHelper.cs @@ -0,0 +1,25 @@ +using System; +using TNode.Models; + +namespace TNode.Editor.Tools.NodeCreator{ + public static class NodeHelper{ + + /// + /// always use this to create a new node. + /// + /// + public static T InstantiateNodeData() where T:NodeData{ + var res = Activator.CreateInstance(); + res.id = Guid.NewGuid().ToString(); + return res; + } + public static NodeData InstantiateNodeData(Type type){ + if (Activator.CreateInstance(type) is NodeData res){ + res.id = Guid.NewGuid().ToString(); + return res; + } + + return null; + } + } +} \ No newline at end of file diff --git a/TNode/Editor/Tools/NodeCreator/NodeHelper.cs.meta b/TNode/Editor/Tools/NodeCreator/NodeHelper.cs.meta new file mode 100644 index 0000000..f81851d --- /dev/null +++ b/TNode/Editor/Tools/NodeCreator/NodeHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a7ebee12f44e439ca625f715a43510fc +timeCreated: 1656911665 \ No newline at end of file diff --git a/TNode/JsonSerialize.meta b/TNode/JsonSerialize.meta new file mode 100644 index 0000000..68eeed3 --- /dev/null +++ b/TNode/JsonSerialize.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ec6119d082a947f58ed6402290b65596 +timeCreated: 1656817965 \ No newline at end of file diff --git a/TNode/JsonSerialize/JsonSerializeTool.cs b/TNode/JsonSerialize/JsonSerializeTool.cs new file mode 100644 index 0000000..47c6553 --- /dev/null +++ b/TNode/JsonSerialize/JsonSerializeTool.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace TNode.JsonSerialize{ + public class JsonSerializeTool{ + public static JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings(){ + ReferenceLoopHandling = ReferenceLoopHandling.Ignore, + NullValueHandling = NullValueHandling.Ignore, + DateFormatString = "yyyy-MM-dd HH:mm:ss", + Converters = new List { new Vector3Converter() }, + TypeNameHandling = TypeNameHandling.Auto + + }; + + public static JsonSerializerSettings InternalJsonSerializerSettings = new JsonSerializerSettings(){ + ReferenceLoopHandling = ReferenceLoopHandling.Ignore, + NullValueHandling = NullValueHandling.Ignore, + Formatting = Formatting.Indented + }; + } +} \ No newline at end of file diff --git a/TNode/JsonSerialize/JsonSerializeTool.cs.meta b/TNode/JsonSerialize/JsonSerializeTool.cs.meta new file mode 100644 index 0000000..4480c5b --- /dev/null +++ b/TNode/JsonSerialize/JsonSerializeTool.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 14067671fe28434e9ae2e67a34074c52 +timeCreated: 1656819161 \ No newline at end of file diff --git a/TNode/JsonSerialize/NodeDataConverter.cs b/TNode/JsonSerialize/NodeDataConverter.cs new file mode 100644 index 0000000..a3c5f26 --- /dev/null +++ b/TNode/JsonSerialize/NodeDataConverter.cs @@ -0,0 +1,42 @@ +using System; +using Newtonsoft.Json; +using TNode.Models; +using UnityEngine; + +namespace TNode.JsonSerialize{ + public class NodeDataConverter:JsonConverter{ + public override void WriteJson(JsonWriter writer, NodeData value, JsonSerializer serializer){ + //Write node data with type information + writer.WriteStartObject(); + writer.WritePropertyName("type"); + Debug.Log(value.GetType().ToString()); + writer.WriteValue(value.GetType().Name); + writer.WritePropertyName("data"); + serializer.Serialize(writer, value, value.GetType()); + + + writer.WriteEndObject(); + + + } + + public override NodeData ReadJson(JsonReader reader, Type objectType, NodeData existingValue, bool hasExistingValue, + JsonSerializer serializer){ + //Load type info + reader.Read(); + + if (reader.Value != null){ + var type = reader.Value.ToString(); + if (type.Trim().Length==0){ + Debug.LogError(type); + throw new JsonSerializationException("Type name is empty"); + } + reader.Read(); + //Load data + var data = serializer.Deserialize(reader, Type.GetType(type)); + return (NodeData) data; + } + return null; + } + } +} \ No newline at end of file diff --git a/TNode/JsonSerialize/NodeDataConverter.cs.meta b/TNode/JsonSerialize/NodeDataConverter.cs.meta new file mode 100644 index 0000000..e29d3c5 --- /dev/null +++ b/TNode/JsonSerialize/NodeDataConverter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6f960539f2744729b35ff3011677d8ba +timeCreated: 1656857829 \ No newline at end of file diff --git a/TNode/JsonSerialize/Vector3Converter.cs b/TNode/JsonSerialize/Vector3Converter.cs new file mode 100644 index 0000000..7484816 --- /dev/null +++ b/TNode/JsonSerialize/Vector3Converter.cs @@ -0,0 +1,29 @@ +using System; +using System.Numerics; +using Newtonsoft.Json; +namespace TNode.JsonSerialize{ + + public class Vector3Converter:JsonConverter{ + public override void WriteJson(JsonWriter writer, Vector3 value, JsonSerializer serializer){ + writer.WriteStartArray(); + writer.WriteValue(value.X); + writer.WriteValue(value.Y); + writer.WriteValue(value.Z); + writer.WriteEndArray(); + } + + public override Vector3 ReadJson(JsonReader reader, Type objectType, Vector3 existingValue, bool hasExistingValue, JsonSerializer serializer){ + if (reader.TokenType == JsonToken.Null){ + return default(Vector3); + } + else{ + var array = serializer.Deserialize(reader); + + if (array != null) return new Vector3(array[0], array[1], array[2]); + } + + return default(Vector3); + + } + } +} \ No newline at end of file diff --git a/TNode/JsonSerialize/Vector3Converter.cs.meta b/TNode/JsonSerialize/Vector3Converter.cs.meta new file mode 100644 index 0000000..dbbbc50 --- /dev/null +++ b/TNode/JsonSerialize/Vector3Converter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fecb77054ad348239341a58c50549879 +timeCreated: 1656817975 \ No newline at end of file diff --git a/TNode/Models/GraphData.cs b/TNode/Models/GraphData.cs index 071114a..bacbe9e 100644 --- a/TNode/Models/GraphData.cs +++ b/TNode/Models/GraphData.cs @@ -2,26 +2,33 @@ using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; +using TNode.JsonSerialize; +using UnityEngine.Serialization; namespace TNode.Models{ [Serializable] public class GraphData:ScriptableObject,ISerializationCallbackReceiver{ [SerializeField] public Dictionary NodeDictionary = new Dictionary(); - public List NodeLinks = new List(); + public List nodeLinks = new List(); + [SerializeField] - [HideInInspector] + [TextArea] + //[HideInInspector] private string jsonObject; public void OnBeforeSerialize(){ - var serializedData = JsonConvert.SerializeObject(NodeDictionary); + var serializedData = JsonConvert.SerializeObject(NodeDictionary,JsonSerializeTool.JsonSerializerSettings); + jsonObject = serializedData; } public void OnAfterDeserialize(){ - var deserializedData = JsonConvert.DeserializeObject>(jsonObject); + var deserializedData = JsonConvert.DeserializeObject>(jsonObject,JsonSerializeTool.JsonSerializerSettings); + var deserializedData2 = JsonUtility.FromJson>(jsonObject); NodeDictionary = deserializedData; + Debug.Log("hi"); } } } \ No newline at end of file diff --git a/TNode/Models/NodeData.cs b/TNode/Models/NodeData.cs index 14b6449..53a5aef 100644 --- a/TNode/Models/NodeData.cs +++ b/TNode/Models/NodeData.cs @@ -1,6 +1,5 @@ using System; using TNode.Attribute; -using TNode.BaseModels; using UnityEngine; namespace TNode.Models{ @@ -12,11 +11,11 @@ namespace TNode.Models{ /// /// [Serializable] - public class NodeData:IModel{ + public class NodeData{ public NodeData() : base(){ //Object Registration - id = Guid.NewGuid().ToString(); + } [DisableOnInspector] public string id; diff --git a/TNode/Runtime/RuntimeNode.cs b/TNode/Runtime/RuntimeNode.cs index 1647821..94a84ec 100644 --- a/TNode/Runtime/RuntimeNode.cs +++ b/TNode/Runtime/RuntimeNode.cs @@ -1,9 +1,21 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; using TNode.Models; namespace TNode.Runtime{ - public class RuntimeNode{ - public NodeData NodeData { get; set; } + public class RuntimeNode where T:NodeData{ + public T NodeData{ get; set; } + + //Links related to runtime node,for fast access.only remember out links public List NodeLinks; + + + public void Process(){ + + var outputPorts = NodeLinks.Select(x => x.outPort.portName); + } + } } \ No newline at end of file diff --git a/TNode/RuntimeCache.meta b/TNode/RuntimeCache.meta new file mode 100644 index 0000000..a9da7db --- /dev/null +++ b/TNode/RuntimeCache.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1edb71c09fe64f77ba81a14e0e0fceb8 +timeCreated: 1656762418 \ No newline at end of file diff --git a/TNode/RuntimeCache/RuntimeCache.cs b/TNode/RuntimeCache/RuntimeCache.cs new file mode 100644 index 0000000..464bd79 --- /dev/null +++ b/TNode/RuntimeCache/RuntimeCache.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using JetBrains.Annotations; +using TNode.Models; +using Unity.VisualScripting; +using UnityEngine.UI; + +namespace TNode.RuntimeCache{ + public class RuntimeCache{ + //Singleton instance for the runtime cache + private static RuntimeCache _instance; + public static RuntimeCache Instance{ + get{ return _instance ??= new RuntimeCache(); } + } + //delegate return a value from a nodedata + public delegate object GetValueDelegate(NodeData nodeData); + + public readonly Dictionary> CachedDelegatesForGettingValue = + new (); + + public void ExecuteOutput(T nodeData) where T:NodeData{ + var type = typeof(T); + if(!CachedDelegatesForGettingValue.ContainsKey(type)){ + return; + } + var delegates = CachedDelegatesForGettingValue[type]; + foreach(var delegateInstance in delegates){ + var value = delegateInstance(nodeData); + } + } + + public void RegisterRuntimeNode() where T:NodeData{ + var type = typeof(T); + if(!CachedDelegatesForGettingValue.ContainsKey(type)){ + CachedDelegatesForGettingValue.Add(type, new List()); + } + //iterate properties of the nodeData and add them to the cache + var properties = type.GetProperties(); + foreach(var property in properties){ + var getValueDelegate = GetValueDelegateForProperty(property); + CachedDelegatesForGettingValue[type].Add(getValueDelegate); + } + + } + + private GetValueDelegate GetValueDelegateForProperty(PropertyInfo property){ + var getValueDelegate = (GetValueDelegate)Delegate.CreateDelegate(typeof(GetValueDelegate), property.GetGetMethod()); + return getValueDelegate; + } + } +} \ No newline at end of file diff --git a/TNode/RuntimeCache/RuntimeCache.cs.meta b/TNode/RuntimeCache/RuntimeCache.cs.meta new file mode 100644 index 0000000..ecf41f2 --- /dev/null +++ b/TNode/RuntimeCache/RuntimeCache.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4557d67036a046a2a3d8f8cf6843624d +timeCreated: 1656762426 \ No newline at end of file diff --git a/TNode/Tools.meta b/TNode/Tools.meta new file mode 100644 index 0000000..15e65f1 --- /dev/null +++ b/TNode/Tools.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 206b9a7ba6b54706b02c6aa2cb9a18b0 +timeCreated: 1656762017 \ No newline at end of file diff --git a/TNode/Editor/NodeDataWrapper.cs b/TNode/Tools/NodeDataWrapper.cs similarity index 98% rename from TNode/Editor/NodeDataWrapper.cs rename to TNode/Tools/NodeDataWrapper.cs index f951a18..b7391af 100644 --- a/TNode/Editor/NodeDataWrapper.cs +++ b/TNode/Tools/NodeDataWrapper.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using TNode.Models; +using UnityEngine; namespace TNode.Editor{ public class NodeDataWrapper{ @@ -33,6 +34,7 @@ namespace TNode.Editor{ if (wrapper == null) return null; return wrapper._data; + } public static implicit operator NodeDataWrapper(NodeData unWrapper){ if (unWrapper == null) diff --git a/TNode/Editor/NodeDataWrapper.cs.meta b/TNode/Tools/NodeDataWrapper.cs.meta similarity index 100% rename from TNode/Editor/NodeDataWrapper.cs.meta rename to TNode/Tools/NodeDataWrapper.cs.meta