From ba8b9ccac91f3d025bf329f960ffb82e462a0040 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Thu, 7 Jul 2022 20:22:48 +0800 Subject: [PATCH 01/17] feat: Add an new property drawer for graph --- TNode/Attribute/Ports/BatchInputAttribute.cs | 5 ++++ .../Ports/BatchInputAttribute.cs.meta | 3 ++ TNode/Attribute/Ports/BatchOutputAttribute.cs | 12 ++++++++ .../Ports/BatchOutputAttribute.cs.meta | 3 ++ TNode/Attribute/Ports/InputAttribute.cs | 7 +---- TNode/Attribute/Ports/PortAttribute.cs | 18 +----------- TNode/Attribute/ShowInNodeViewAttribute.cs | 1 + TNode/Editor/BaseViews/DataGraphView.cs | 8 ++---- TNode/Editor/BaseViews/NodeView.cs | 1 - TNode/Editor/Cache/NodeEditorExtensions.cs | 28 +++++++++---------- TNode/Editor/GraphEditor.cs | 2 +- .../InspectorImplementation/EnumFieldItem.cs | 20 +++++++++++++ .../EnumFieldItem.cs.meta | 3 ++ TNode/Editor/Inspector/InspectorItem.cs | 21 ++++++++------ .../Editor/Inspector/InspectorItemFactory.cs | 25 +++++++++++++++-- TNode/Editor/Inspector/NodeInspectorInNode.cs | 23 +++++++++------ TNode/Editor/Inspector/TinyInspectorItem.cs | 13 --------- .../Inspector/TinyInspectorItem.cs.meta | 3 -- .../Search/BlackboardSearchWindowProvider.cs | 17 +++++++++-- TNode/Models/GraphData.cs | 1 - 20 files changed, 129 insertions(+), 85 deletions(-) create mode 100644 TNode/Attribute/Ports/BatchInputAttribute.cs create mode 100644 TNode/Attribute/Ports/BatchInputAttribute.cs.meta create mode 100644 TNode/Attribute/Ports/BatchOutputAttribute.cs create mode 100644 TNode/Attribute/Ports/BatchOutputAttribute.cs.meta create mode 100644 TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs create mode 100644 TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta delete mode 100644 TNode/Editor/Inspector/TinyInspectorItem.cs delete mode 100644 TNode/Editor/Inspector/TinyInspectorItem.cs.meta diff --git a/TNode/Attribute/Ports/BatchInputAttribute.cs b/TNode/Attribute/Ports/BatchInputAttribute.cs new file mode 100644 index 0000000..4786d55 --- /dev/null +++ b/TNode/Attribute/Ports/BatchInputAttribute.cs @@ -0,0 +1,5 @@ +namespace TNode.Attribute.Ports{ + public class BatchInputAttribute{ + + } +} \ No newline at end of file diff --git a/TNode/Attribute/Ports/BatchInputAttribute.cs.meta b/TNode/Attribute/Ports/BatchInputAttribute.cs.meta new file mode 100644 index 0000000..2847ec0 --- /dev/null +++ b/TNode/Attribute/Ports/BatchInputAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8745aaf35940443693af378c8214060e +timeCreated: 1657190813 \ No newline at end of file diff --git a/TNode/Attribute/Ports/BatchOutputAttribute.cs b/TNode/Attribute/Ports/BatchOutputAttribute.cs new file mode 100644 index 0000000..9e96754 --- /dev/null +++ b/TNode/Attribute/Ports/BatchOutputAttribute.cs @@ -0,0 +1,12 @@ +using System; +using UnityEditor.Experimental.GraphView; + +namespace TNode.Attribute.Ports{ + /// + /// Batch out port attribute could specify a batch out port,allowing large scale calculation. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class BatchOutputAttribute:PortAttribute{ + + } +} \ No newline at end of file diff --git a/TNode/Attribute/Ports/BatchOutputAttribute.cs.meta b/TNode/Attribute/Ports/BatchOutputAttribute.cs.meta new file mode 100644 index 0000000..e5a345e --- /dev/null +++ b/TNode/Attribute/Ports/BatchOutputAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0a6ca9cc801d4db3b73ee59cf0aef38e +timeCreated: 1657190648 \ No newline at end of file diff --git a/TNode/Attribute/Ports/InputAttribute.cs b/TNode/Attribute/Ports/InputAttribute.cs index 0ac3ed1..1312c34 100644 --- a/TNode/Attribute/Ports/InputAttribute.cs +++ b/TNode/Attribute/Ports/InputAttribute.cs @@ -7,11 +7,6 @@ namespace TNode.Attribute{ [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class InputAttribute : PortAttribute{ - public InputAttribute(string portName, Type nodeLinkType, Port.Capacity capacity, string portAccepted = "*") : base(portName, nodeLinkType, capacity, portAccepted){ - } - public InputAttribute(Type nodeLinkType, Port.Capacity capacity, string portAccepted="*") : base(nodeLinkType, capacity, portAccepted){ - } - public InputAttribute(string portName="*",string portAccepted = "*") :base(portName, typeof(NodeLink),Port.Capacity.Multi,portAccepted){ - } + } } \ No newline at end of file diff --git a/TNode/Attribute/Ports/PortAttribute.cs b/TNode/Attribute/Ports/PortAttribute.cs index 1b983eb..72fb46e 100644 --- a/TNode/Attribute/Ports/PortAttribute.cs +++ b/TNode/Attribute/Ports/PortAttribute.cs @@ -7,22 +7,6 @@ namespace TNode.Attribute{ [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class PortAttribute:System.Attribute{ - public string PortName; - public string PortAccepted; - public Type NodeLinkType; - public Port.Capacity Capacity; - - public PortAttribute(string portName, Type nodeLinkType, Port.Capacity capacity,string portAccepted="*"){ - PortName = portName; - PortAccepted = portAccepted; - NodeLinkType = nodeLinkType; - Capacity = capacity; - } - //Auto generate port name via variable use this attribute - public PortAttribute(Type nodeLinkType, Port.Capacity capacity, string portAccepted = "*"){ - PortAccepted = portAccepted; - NodeLinkType = nodeLinkType; - Capacity = capacity; - } + } } \ No newline at end of file diff --git a/TNode/Attribute/ShowInNodeViewAttribute.cs b/TNode/Attribute/ShowInNodeViewAttribute.cs index f2ffde9..d516534 100644 --- a/TNode/Attribute/ShowInNodeViewAttribute.cs +++ b/TNode/Attribute/ShowInNodeViewAttribute.cs @@ -2,6 +2,7 @@ namespace TNode.Attribute{ [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] + public class ShowInNodeViewAttribute:System.Attribute{ } diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index 456cb21..dac2122 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -261,8 +261,7 @@ namespace TNode.Editor.BaseViews{ input = inputNodeView.inputContainer.Q(edge.inPort.portName), output = outputNodeView.outputContainer.Q(edge.outPort.portName) }; - Debug.Log(edge.inPort.portName); - Debug.Log(edge.outPort.portName); + newEdge.input?.Connect(newEdge); newEdge.output?.Connect(newEdge); AddElement(newEdge); @@ -296,7 +295,7 @@ namespace TNode.Editor.BaseViews{ // }); // blackboard.addItemRequested = (item) => { // //Create a sub window for the blackboard to show the selection - // var subWindow = ScriptableObject.CreateInstance(); + // var subWindow = ScriptableObject.CreateNodeComponentFromGenericType(); // }; // //Set black board to left side of the view @@ -315,11 +314,9 @@ namespace TNode.Editor.BaseViews{ if (_data.blackboardData == null) return; } - Debug.Log(_data.blackboardData); //Iterate field of the blackboard and add a button for each field foreach (var field in _data.blackboardData.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ - Debug.Log(field); //if the field is MonoBehaviour,add a property field for blackboard var propertyField = new BlackboardPropertyField(new BlackboardProperty(field.Name,field.FieldType)); _blackboard.Add(propertyField); @@ -432,7 +429,6 @@ namespace TNode.Editor.BaseViews{ AddElement(nodeView); //Add a select callback to the nodeView nodeView.RegisterCallback(evt => { - Debug.Log("NodeView Selected"); if (evt.clickCount == 1){ if (_isInspectorOn){ _nodeInspector.Data = nodeData; diff --git a/TNode/Editor/BaseViews/NodeView.cs b/TNode/Editor/BaseViews/NodeView.cs index b7caa5d..bcf74b8 100644 --- a/TNode/Editor/BaseViews/NodeView.cs +++ b/TNode/Editor/BaseViews/NodeView.cs @@ -76,7 +76,6 @@ namespace TNode.Editor.BaseViews{ } } foreach (var propertyInfo in propertyInfos){ - Debug.Log(propertyInfos); var attribute = propertyInfo.GetCustomAttributes(typeof(InputAttribute),true); if (attribute.Length > 0){ Port port = InstantiatePort(Orientation.Horizontal, Direction.Input,Port.Capacity.Multi,propertyInfo.PropertyType); diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index 80cf405..f238eb8 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -92,32 +92,33 @@ namespace TNode.Cache{ } //Outer wrapper for the singleton class public static class NodeEditorExtensions{ - public static T CreateInstance(){ + public static T CreateNodeComponentFromGenericType(){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[typeof(T)]; var instance = (T)Activator.CreateInstance(implementedType); return instance; } - public static object CreateInstance(Type t){ + public static object CreateNodeComponentFromGenericType(Type t){ 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; + 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{ + public static bool HasSpecificTypeComponent() where T : class{ return NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(typeof(T)); } + public static bool HasSpecificTypeComponent(Type t) { + + return NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(t); + } public static List GetGraphDataUsage(Type t){ if (NodeEditorSingleton.Instance.GraphDataUsage.ContainsKey(t)){ return NodeEditorSingleton.Instance.GraphDataUsage[t]; @@ -145,9 +146,6 @@ namespace TNode.Cache{ } public static object CreateNodeViewFromNodeType(Type t){ //Check the generic type of NodeView by t - Debug.Log(t); - Debug.Log(t.ToString()); - Debug.Log(typeof(NodeData).IsAssignableFrom(t)); var type = typeof(NodeView<>).MakeGenericType(t); if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(type)){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[type]; diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index 7619b74..e045f39 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -36,7 +36,7 @@ namespace TNode.Editor{ } private void BuildGraphView(){ - _graphView = NodeEditorExtensions.CreateInstance>(); + _graphView = NodeEditorExtensions.CreateNodeComponentFromGenericType>(); rootVisualElement.Add(_graphView); _graphView.StretchToParentSize(); } diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs new file mode 100644 index 0000000..148f9d7 --- /dev/null +++ b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs @@ -0,0 +1,20 @@ +using System; +using TNode.Attribute; +using UnityEngine; +using UnityEngine.UIElements; + +namespace TNode.Editor.Inspector.InspectorImplementation{ + [NodeComponent] + public class EnumFieldItem:InspectorItem{ + public EnumFieldItem() : base(){ + var field = new EnumField(); + Debug.Log("An Enum Field is created"); + CreateBindable(field); + OnDataChanged += () => { + + field.Init(Value); + Debug.Log(Value.GetType()); + }; + } + } +} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta new file mode 100644 index 0000000..1a83a95 --- /dev/null +++ b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6eb83a1255d545e5998c7b3efd1b0d69 +timeCreated: 1657193097 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs index 829ac4b..278e215 100644 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorItem.cs @@ -6,8 +6,8 @@ using UnityEngine.UIElements; namespace TNode.Editor.Inspector{ public abstract class InspectorItem:VisualElement,INodeDataBinding { - private NodeData _bindingNodeData; - private string _bindingFieldName; + protected NodeData _bindingNodeData; + protected string _bindingFieldName; protected BaseField Bindable; protected event System.Action OnDataChanged; @@ -38,15 +38,19 @@ namespace TNode.Editor.Inspector{ } private T GetValue(){ - + var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - //check field type - if (fieldInfo != null && fieldInfo.FieldType == typeof(T)){ + if (fieldInfo == null){ + throw new Exception("Null field info"); + } + if (fieldInfo.FieldType == typeof(T)){ return (T)fieldInfo.GetValue(BindingNodeData); } - else{ - Debug.LogError("Wrong Type for current node data"); + + if (fieldInfo.FieldType.IsEnum){ + return (T)fieldInfo.GetValue(BindingNodeData); } + Debug.LogError("Wrong Type for current node data"); return default; } @@ -75,7 +79,7 @@ namespace TNode.Editor.Inspector{ Bindable.UnregisterValueChangedCallback(OnInspectorItemValueChanged); } Bindable = bindable; - this.Add(Bindable); + Add(Bindable); Bindable?.RegisterValueChangedCallback(OnInspectorItemValueChanged); } private void OnDataChangedHandler(){ @@ -84,6 +88,7 @@ namespace TNode.Editor.Inspector{ Bindable.value = Value; Bindable.label = BindingPath; } + Debug.Log(Value.GetType()); } private void OnNodeDataValueChanged(NodeDataWrapper wrapper){ diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs b/TNode/Editor/Inspector/InspectorItemFactory.cs index be99391..9e5f9a7 100644 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs +++ b/TNode/Editor/Inspector/InspectorItemFactory.cs @@ -11,9 +11,30 @@ namespace TNode.Editor.Inspector{ public InspectorItem Create(){ //Check type of GraphDataType - var hasSpecificType = NodeEditorExtensions.HasSpecificType>(); + var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent>(); + if (hasSpecificType){ - return NodeEditorExtensions.CreateInstance>(); + return NodeEditorExtensions.CreateNodeComponentFromGenericType>(); + } + + if (typeof(T).IsEnum){ + + return NodeEditorExtensions.CreateNodeComponentFromGenericType(typeof(InspectorItem)) as InspectorItem; + } + return null; + } + + public INodeDataBindingBase Create(Type t){ + var genericType = typeof(InspectorItem<>).MakeGenericType(t); + var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent(genericType); + + if (hasSpecificType){ + return NodeEditorExtensions.CreateNodeComponentFromGenericType(genericType) as INodeDataBindingBase; + } + + if (t.IsEnum){ + + return NodeEditorExtensions.CreateNodeComponentFromGenericType(typeof(InspectorItem)) as INodeDataBindingBase; } return null; } diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs b/TNode/Editor/Inspector/NodeInspectorInNode.cs index 0268d98..e89603e 100644 --- a/TNode/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNode/Editor/Inspector/NodeInspectorInNode.cs @@ -33,16 +33,21 @@ namespace TNode.Editor.Inspector{ if(!showInNodeViewAttribute) continue; //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection - MethodInfo methodInfo = inspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); - if (methodInfo != null){ - var genericMethod = methodInfo.MakeGenericMethod(type); - var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; - Add(createdItem); - if (createdItem is INodeDataBindingBase castedItem){ - castedItem.BindingNodeData = _data; - castedItem.BindingPath = bindingPath; - } + var createdItem = inspectorItemFactory.Create(type); + if (createdItem is { } castedItem){ + castedItem.BindingNodeData = _data; + castedItem.BindingPath = bindingPath; } + Add((VisualElement)createdItem); + // MethodInfo methodInfo = inspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); + // if (methodInfo != null){ + // var genericMethod = methodInfo.MakeGenericMethod(type); + // Debug.Log(genericMethod); + // var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; + // Add(createdItem); + // Debug.Log(createdItem?.GetType()); + // + // } } } } diff --git a/TNode/Editor/Inspector/TinyInspectorItem.cs b/TNode/Editor/Inspector/TinyInspectorItem.cs deleted file mode 100644 index 89186c9..0000000 --- a/TNode/Editor/Inspector/TinyInspectorItem.cs +++ /dev/null @@ -1,13 +0,0 @@ -using TNode.Models; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector{ - /// - /// Tiny Inspector item is a simple inspector item inside a node view ,it monitor node data - /// - /// - public class TinyInspectorItem:VisualElement,INodeDataBinding{ - public string BindingPath{ get; set; } - public NodeData BindingNodeData{ get; set; } - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/TinyInspectorItem.cs.meta b/TNode/Editor/Inspector/TinyInspectorItem.cs.meta deleted file mode 100644 index 5944c38..0000000 --- a/TNode/Editor/Inspector/TinyInspectorItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 7eeddeb28a5a475c85c85ceae3198778 -timeCreated: 1656142058 \ No newline at end of file diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs index 53dfcbb..e0f5ed4 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs @@ -1,5 +1,16 @@ -namespace TNode.Editor{ - public class BlackboardSearchWindowProvider{ - +using System.Collections.Generic; +using UnityEditor.Experimental.GraphView; + +namespace TNode.Editor{ + public class BlackboardSearchWindowProvider:ISearchWindowProvider{ + + public List CreateSearchTree(SearchWindowContext context){ + throw new System.NotImplementedException(); + } + + public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ + throw new System.NotImplementedException(); + } } + } \ No newline at end of file diff --git a/TNode/Models/GraphData.cs b/TNode/Models/GraphData.cs index 2d4d323..3937714 100644 --- a/TNode/Models/GraphData.cs +++ b/TNode/Models/GraphData.cs @@ -33,7 +33,6 @@ namespace TNode.Models{ var deserializedBlackboard = JsonConvert.DeserializeObject(jsonBlackboard,JsonSerializeTool.JsonSerializerSettings); blackboardData = deserializedBlackboard; - Debug.Log("hi"); } } } \ No newline at end of file From 9fd05b2590cae41a9b988e6cd316f64ef565d2f3 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Thu, 7 Jul 2022 23:45:01 +0800 Subject: [PATCH 02/17] chore: little work around on Blackboard drag node --- TNode/Attribute/Ports/BatchOutputAttribute.cs | 3 +- TNode/Attribute/Ports/InputAttribute.cs | 3 +- TNode/Attribute/Ports/OutputAttribute.cs | 5 +- TNode/Attribute/Ports/PortAttribute.cs | 18 ++++- TNode/Editor/Cache/NodeEditorExtensions.cs | 72 +++++++++++++++++-- TNode/Editor/Inspector/InspectorItem.cs | 1 - TNode/Editor/NodeViews.meta | 3 + .../Editor/{ => NodeViews}/DefaultNodeView.cs | 0 .../{ => NodeViews}/DefaultNodeView.cs.meta | 0 TNode/Editor/NodeViews/DragNodeView.cs | 15 ++++ TNode/Editor/NodeViews/DragNodeView.cs.meta | 3 + .../{BaseViews => NodeViews}/NodeView.cs | 43 ++++++++--- .../{BaseViews => NodeViews}/NodeView.cs.meta | 0 TNode/Models/BlackboardDragNodeData.cs | 4 +- TNode/RuntimeCache/RuntimeCache.cs | 5 ++ 15 files changed, 151 insertions(+), 24 deletions(-) create mode 100644 TNode/Editor/NodeViews.meta rename TNode/Editor/{ => NodeViews}/DefaultNodeView.cs (100%) rename TNode/Editor/{ => NodeViews}/DefaultNodeView.cs.meta (100%) create mode 100644 TNode/Editor/NodeViews/DragNodeView.cs create mode 100644 TNode/Editor/NodeViews/DragNodeView.cs.meta rename TNode/Editor/{BaseViews => NodeViews}/NodeView.cs (72%) rename TNode/Editor/{BaseViews => NodeViews}/NodeView.cs.meta (100%) diff --git a/TNode/Attribute/Ports/BatchOutputAttribute.cs b/TNode/Attribute/Ports/BatchOutputAttribute.cs index 9e96754..71a20c3 100644 --- a/TNode/Attribute/Ports/BatchOutputAttribute.cs +++ b/TNode/Attribute/Ports/BatchOutputAttribute.cs @@ -7,6 +7,7 @@ namespace TNode.Attribute.Ports{ /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class BatchOutputAttribute:PortAttribute{ - + public BatchOutputAttribute(string name="") : base(name){ + } } } \ No newline at end of file diff --git a/TNode/Attribute/Ports/InputAttribute.cs b/TNode/Attribute/Ports/InputAttribute.cs index 1312c34..dd4b855 100644 --- a/TNode/Attribute/Ports/InputAttribute.cs +++ b/TNode/Attribute/Ports/InputAttribute.cs @@ -7,6 +7,7 @@ namespace TNode.Attribute{ [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class InputAttribute : PortAttribute{ - + public InputAttribute(string name="", PortNameHandling nameHandling = PortNameHandling.Auto) : base(name, nameHandling){ + } } } \ No newline at end of file diff --git a/TNode/Attribute/Ports/OutputAttribute.cs b/TNode/Attribute/Ports/OutputAttribute.cs index 675d731..a0c3908 100644 --- a/TNode/Attribute/Ports/OutputAttribute.cs +++ b/TNode/Attribute/Ports/OutputAttribute.cs @@ -1,5 +1,6 @@ namespace TNode.Attribute.Ports{ - public class OutputAttribute:System.Attribute{ - + public class OutputAttribute:PortAttribute{ + public OutputAttribute(string name="", PortNameHandling nameHandling = PortNameHandling.Auto) : base(name, nameHandling){ + } } } \ No newline at end of file diff --git a/TNode/Attribute/Ports/PortAttribute.cs b/TNode/Attribute/Ports/PortAttribute.cs index 72fb46e..24feda5 100644 --- a/TNode/Attribute/Ports/PortAttribute.cs +++ b/TNode/Attribute/Ports/PortAttribute.cs @@ -3,10 +3,24 @@ using JetBrains.Annotations; using UnityEditor.Experimental.GraphView; namespace TNode.Attribute{ + + public enum PortNameHandling{ + Auto, + MemberName, + Manual, + Format, + MemberType + + } [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] - public class PortAttribute:System.Attribute{ - + public readonly string Name; + public readonly PortNameHandling NameHandling; + + public PortAttribute(string name,PortNameHandling nameHandling=PortNameHandling.Auto){ + this.Name = name; + this.NameHandling = nameHandling; + } } } \ No newline at end of file diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index f238eb8..d21c96c 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -9,14 +9,37 @@ using TNode.Editor.Inspector; using TNode.Models; using UnityEditor.Experimental.GraphView; using UnityEngine; +using UnityEngine.TestTools.Utils; namespace TNode.Cache{ /// /// Internal singleton class for caching TNode reflection Data. /// + internal class NodeEditorTypeDictionary:Dictionary{ + //Custom camparator for sorting the dictionary by key. + + + + private class NodeEditorTypeDictionaryComparer : IEqualityComparer + { + public bool Equals(Type x, Type y){ + return x?.ToString() == y?.ToString(); + } + + public int GetHashCode(Type obj){ + return obj.ToString().GetHashCode(); + } + } + + public NodeEditorTypeDictionary():base(new NodeEditorTypeDictionaryComparer()){ + + } + + } + internal class NodeEditorSingleton{ private static NodeEditorSingleton _instance; - public readonly Dictionary FromGenericToSpecific = new Dictionary(); + public readonly Dictionary FromGenericToSpecific = new NodeEditorTypeDictionary(); public readonly Dictionary> GraphDataUsage = new Dictionary>(); public Dictionary GraphBlackboard = new(); public static NodeEditorSingleton Instance{ @@ -75,15 +98,22 @@ namespace TNode.Cache{ } } } - private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(InspectorItem<>)}; + private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(InspectorItem<>),typeof(NodeView<>)}; private void SetNodeComponentAttribute(Type type){ foreach (var attribute in type.GetCustomAttributes(typeof(NodeComponentAttribute), false)){ //fetch this type 's parent class var parent = type.BaseType; - //Check if this type is a generic type and is a generic type of NodeView or DataGraphView - if (parent is{IsGenericType: true} && _acceptedTypesForGenericToSpecific.Contains(parent.GetGenericTypeDefinition())){ + //Check if this type is a generic type and is a generic type of NodeView or DataGraphView, + //Two level generic definition is now supported by TNode + //Deeper nested generic definition is not supported by TNode + if (parent is{IsGenericType: true} && + (_acceptedTypesForGenericToSpecific.Contains(parent.GetGenericTypeDefinition()) || + (parent.GetGenericTypeDefinition().IsGenericType && _acceptedTypesForGenericToSpecific.Contains(parent.GetGenericTypeDefinition().GetGenericTypeDefinition())) + ) + ){ //Get the generic type of this type //Add this type to the dictionary + Debug.Log($"type {type} is a registered as node component for {parent}"); FromGenericToSpecific.Add(parent, type); } //TODO Note that a node component only applied to a specific type of editor,so ,same GraphView could behave differently in different editor.it's a todo feature. @@ -103,7 +133,6 @@ namespace TNode.Cache{ var instance = Activator.CreateInstance(implementedType); return instance; } - 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)); @@ -146,13 +175,46 @@ namespace TNode.Cache{ } public static object CreateNodeViewFromNodeType(Type t){ //Check the generic type of NodeView by t + + if (t.IsGenericType){ + Debug.Log($"A generic type {t} is detected"); + //AKA if BlackboardDragNodeData is pulled + //Get BlackboardDragNodeData as generic type + + + var genericTypeDefinition = t.GetGenericTypeDefinition(); + + //What you want is a NodeView> to be created + var genericViewType = typeof(NodeView<>).MakeGenericType(genericTypeDefinition); + Debug.Log($"The generic view type is {genericViewType}"); + + //search for the specific type of genericViewType in the dictionary + if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(genericViewType)){ + + var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[genericViewType]; + //The implementedType is still a generic type ,so we make it a specific type by using MakeGenericType + Debug.Log($"{implementedType}"); + //Get argument type of t + var argumentType = t.GetGenericArguments()[0]; + var instance = Activator.CreateInstance(implementedType.MakeGenericType(argumentType)); + + return instance; + + } + else{ + return new DefaultNodeView(); + } + + } var type = typeof(NodeView<>).MakeGenericType(t); if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(type)){ + var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[type]; var instance = Activator.CreateInstance(implementedType); return instance; } else{ + return new DefaultNodeView(); } diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs index 278e215..8802bb5 100644 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorItem.cs @@ -88,7 +88,6 @@ namespace TNode.Editor.Inspector{ Bindable.value = Value; Bindable.label = BindingPath; } - Debug.Log(Value.GetType()); } private void OnNodeDataValueChanged(NodeDataWrapper wrapper){ diff --git a/TNode/Editor/NodeViews.meta b/TNode/Editor/NodeViews.meta new file mode 100644 index 0000000..8da3bd3 --- /dev/null +++ b/TNode/Editor/NodeViews.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ea202e63fe8e4d3b9b7759488419dde7 +timeCreated: 1657197080 \ No newline at end of file diff --git a/TNode/Editor/DefaultNodeView.cs b/TNode/Editor/NodeViews/DefaultNodeView.cs similarity index 100% rename from TNode/Editor/DefaultNodeView.cs rename to TNode/Editor/NodeViews/DefaultNodeView.cs diff --git a/TNode/Editor/DefaultNodeView.cs.meta b/TNode/Editor/NodeViews/DefaultNodeView.cs.meta similarity index 100% rename from TNode/Editor/DefaultNodeView.cs.meta rename to TNode/Editor/NodeViews/DefaultNodeView.cs.meta diff --git a/TNode/Editor/NodeViews/DragNodeView.cs b/TNode/Editor/NodeViews/DragNodeView.cs new file mode 100644 index 0000000..8ce31c7 --- /dev/null +++ b/TNode/Editor/NodeViews/DragNodeView.cs @@ -0,0 +1,15 @@ +using TNode.Attribute; +using TNode.Editor.BaseViews; +using TNode.Models; + +namespace TNode.Editor.NodeViews{ + [NodeComponent] + public class DragNodeView:NodeView>{ + public DragNodeView() : base(){ + //Make capsule like style + + this.titleContainer.visible = false; + this.titleContainer.RemoveFromHierarchy(); + } + } +} \ No newline at end of file diff --git a/TNode/Editor/NodeViews/DragNodeView.cs.meta b/TNode/Editor/NodeViews/DragNodeView.cs.meta new file mode 100644 index 0000000..97c8950 --- /dev/null +++ b/TNode/Editor/NodeViews/DragNodeView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 899b964a5f674c2fbf1db20cf40ff5e7 +timeCreated: 1657197096 \ No newline at end of file diff --git a/TNode/Editor/BaseViews/NodeView.cs b/TNode/Editor/NodeViews/NodeView.cs similarity index 72% rename from TNode/Editor/BaseViews/NodeView.cs rename to TNode/Editor/NodeViews/NodeView.cs index bcf74b8..0079cb6 100644 --- a/TNode/Editor/BaseViews/NodeView.cs +++ b/TNode/Editor/NodeViews/NodeView.cs @@ -1,4 +1,6 @@ using System; +using System.Linq; +using System.Reflection; using TNode.Attribute; using TNode.Attribute.Ports; using TNode.Editor.Inspector; @@ -63,25 +65,46 @@ namespace TNode.Editor.BaseViews{ this.RefreshExpandedState(); } - private void BuildInputAndOutputPort(){ + protected virtual string BuildPortName(PortAttribute portAttribute,PropertyInfo propertyInfo,params object[] args){ + switch (portAttribute.NameHandling){ + case PortNameHandling.Auto: + return portAttribute.Name.Trim(' ').Length>0?portAttribute.Name:propertyInfo.Name; + break; + case PortNameHandling.Manual: + return portAttribute.Name; + break; + case PortNameHandling.MemberName: + return propertyInfo.Name; + case PortNameHandling.Format: + return String.Format(propertyInfo.Name, args); + case PortNameHandling.MemberType: + return propertyInfo.PropertyType.Name; + default: + throw new ArgumentOutOfRangeException(); + } + } + /// + /// of course you can override this method to build your own port builder + /// + protected virtual void BuildInputAndOutputPort(){ var propertyInfos = _data.GetType().GetProperties(); foreach (var propertyInfo in propertyInfos){ - var attribute = propertyInfo.GetCustomAttributes(typeof(OutputAttribute),true); - if (attribute.Length > 0){ + if (propertyInfo.GetCustomAttributes(typeof(OutputAttribute),true).FirstOrDefault() is OutputAttribute attribute){ Port port = InstantiatePort(Orientation.Horizontal, Direction.Output,Port.Capacity.Multi,propertyInfo.PropertyType); this.outputContainer.Add(port); - port.portName = propertyInfo.Name; - port.name = propertyInfo.Name; + var portName = BuildPortName(attribute,propertyInfo); + port.portName = portName; + port.name = portName; } } foreach (var propertyInfo in propertyInfos){ - var attribute = propertyInfo.GetCustomAttributes(typeof(InputAttribute),true); - if (attribute.Length > 0){ - Port port = InstantiatePort(Orientation.Horizontal, Direction.Input,Port.Capacity.Multi,propertyInfo.PropertyType); + if(propertyInfo.GetCustomAttributes(typeof(InputAttribute),true).FirstOrDefault() is InputAttribute attribute){ + Port port = InstantiatePort(Orientation.Horizontal, Direction.Input,Port.Capacity.Single,propertyInfo.PropertyType); this.inputContainer.Add(port); - port.portName = propertyInfo.Name; - port.name = propertyInfo.Name; + var portName = BuildPortName(attribute,propertyInfo); + port.portName = portName; + port.name = portName; } } } diff --git a/TNode/Editor/BaseViews/NodeView.cs.meta b/TNode/Editor/NodeViews/NodeView.cs.meta similarity index 100% rename from TNode/Editor/BaseViews/NodeView.cs.meta rename to TNode/Editor/NodeViews/NodeView.cs.meta diff --git a/TNode/Models/BlackboardDragNodeData.cs b/TNode/Models/BlackboardDragNodeData.cs index 5119283..dc587ad 100644 --- a/TNode/Models/BlackboardDragNodeData.cs +++ b/TNode/Models/BlackboardDragNodeData.cs @@ -1,16 +1,16 @@ using System.Runtime.InteropServices; using Newtonsoft.Json; +using TNode.Attribute; using TNode.Attribute.Ports; using TNode.RuntimeCache; namespace TNode.Models{ public class BlackboardDragNodeData:NodeData{ - [JsonIgnore] private string _blackDragData; [JsonIgnore] private BlackboardData _blackboardData; - [Output] + [Output("",PortNameHandling.MemberType)] public T Value => _blackboardData.GetValue(_blackDragData); public BlackboardDragNodeData(){ diff --git a/TNode/RuntimeCache/RuntimeCache.cs b/TNode/RuntimeCache/RuntimeCache.cs index c63aea1..4310a3e 100644 --- a/TNode/RuntimeCache/RuntimeCache.cs +++ b/TNode/RuntimeCache/RuntimeCache.cs @@ -62,6 +62,11 @@ namespace TNode.RuntimeCache{ var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; return (T) method.Invoke(blackboardData); } + + public static object GetValue(this BlackboardData blackboardData, string path){ + var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; + return method.Invoke(blackboardData); + } public static RuntimeCache.GetValueDelegate GetValueDelegate(this BlackboardData blackboardData,string path){ var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; return method; From 618f1a017801a289bd0b06a25461bb93d785107c Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Fri, 8 Jul 2022 20:47:53 +0800 Subject: [PATCH 03/17] feat:work around another way to inspect properties --- .../PropertyFieldItem.cs | 23 +++++++++++++++++++ .../PropertyFieldItem.cs.meta | 3 +++ TNode/Editor/Inspector/NodeInspector.cs | 19 ++++----------- TNode/Editor/Inspector/NodeInspectorInNode.cs | 11 +-------- .../Search/BlackboardSearchWindowProvider.cs | 12 ++++++---- 5 files changed, 40 insertions(+), 28 deletions(-) create mode 100644 TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs create mode 100644 TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs new file mode 100644 index 0000000..05fa288 --- /dev/null +++ b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs @@ -0,0 +1,23 @@ +using UnityEditor; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace TNode.Editor.Inspector.InspectorImplementation{ + public class PropertyFieldItem:InspectorItem{ + + public PropertyFieldItem(){ + + + OnDataChanged += () => { + var data = new SerializedObject(Value as Object); + var testProperty = data.GetIterator().GetArrayElementAtIndex(0); + PropertyField propertyField = new PropertyField(testProperty); + this.Q()?.RemoveFromHierarchy(); + this.Add(propertyField); + + }; + } + + } +} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta new file mode 100644 index 0000000..bced887 --- /dev/null +++ b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98769c8b285d438197820fa366568fee +timeCreated: 1657280625 \ No newline at end of file diff --git a/TNode/Editor/Inspector/NodeInspector.cs b/TNode/Editor/Inspector/NodeInspector.cs index e4d2ad4..1d2c516 100644 --- a/TNode/Editor/Inspector/NodeInspector.cs +++ b/TNode/Editor/Inspector/NodeInspector.cs @@ -51,21 +51,12 @@ namespace TNode.Editor.Inspector{ var type = field.FieldType; InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection - MethodInfo methodInfo = inspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); - if (methodInfo != null){ - var genericMethod = methodInfo.MakeGenericMethod(type); - var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; - body.Add(createdItem); - if (createdItem is INodeDataBindingBase castedItem){ - castedItem.BindingNodeData = _data; - castedItem.BindingPath = bindingPath; - } - - //Check if field has DisableOnInspector attribute and if so,disable it - if (field.GetCustomAttribute() != null){ - createdItem?.SetEnabled(false); - } + var createdItem = inspectorItemFactory.Create(type); + if (createdItem is { } castedItem){ + castedItem.BindingNodeData = _data; + castedItem.BindingPath = bindingPath; } + Add((VisualElement)createdItem); } } } diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs b/TNode/Editor/Inspector/NodeInspectorInNode.cs index e89603e..9a7c53c 100644 --- a/TNode/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNode/Editor/Inspector/NodeInspectorInNode.cs @@ -32,22 +32,13 @@ namespace TNode.Editor.Inspector{ var showInNodeViewAttribute = field.GetCustomAttribute()!=null; if(!showInNodeViewAttribute) continue; - //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection var createdItem = inspectorItemFactory.Create(type); if (createdItem is { } castedItem){ castedItem.BindingNodeData = _data; castedItem.BindingPath = bindingPath; } Add((VisualElement)createdItem); - // MethodInfo methodInfo = inspectorItemFactory.GetType().GetMethod("Create", BindingFlags.Instance | BindingFlags.Public); - // if (methodInfo != null){ - // var genericMethod = methodInfo.MakeGenericMethod(type); - // Debug.Log(genericMethod); - // var createdItem = genericMethod.Invoke(inspectorItemFactory,null) as VisualElement; - // Add(createdItem); - // Debug.Log(createdItem?.GetType()); - // - // } + } } } diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs index e0f5ed4..ffe6b32 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs @@ -1,15 +1,19 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using UnityEditor; using UnityEditor.Experimental.GraphView; namespace TNode.Editor{ public class BlackboardSearchWindowProvider:ISearchWindowProvider{ - + private Type _graphType; + private GraphView _graphView; + private EditorWindow _editor; public List CreateSearchTree(SearchWindowContext context){ - throw new System.NotImplementedException(); + return null; } public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ - throw new System.NotImplementedException(); + return false; } } From c8fa58132d1756cf0bd25d4bfdb376920990bb8f Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Sat, 9 Jul 2022 23:57:37 +0800 Subject: [PATCH 04/17] feat: add a black board search window for create list data --- TNode/Editor/BaseViews/DataGraphView.cs | 13 +++-- .../Search/BlackboardSearchWindowProvider.cs | 54 ++++++++++++++++++- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index dac2122..b66b150 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -112,20 +112,13 @@ namespace TNode.Editor.BaseViews{ */ public abstract class DataGraphView:GraphView,IDataGraphView where T:GraphData{ #region variables and properties - - - - private T _data; private bool _isInspectorOn; - private NodeSearchWindowProvider _nodeSearchWindowProvider; private NodeInspector _nodeInspector; public GraphEditor Owner; private Dictionary _nodeDict = new(); private Blackboard _blackboard; - - public T Data{ get{ return _data; } set{ @@ -469,11 +462,17 @@ namespace TNode.Editor.BaseViews{ } Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id); } + + public BlackboardData GetBlackboardData(){ + return this._data.blackboardData; + } } public interface IDataGraphView{ public void AddTNode(NodeData nodeData, Rect rect); public void RemoveTNode(NodeData nodeData); + + public BlackboardData GetBlackboardData(); } public class DataChangedEventArgs{ diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs index ffe6b32..acfbc82 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs @@ -1,20 +1,70 @@ using System; +using System.Collections; using System.Collections.Generic; +using TNode.Editor.BaseViews; using UnityEditor; using UnityEditor.Experimental.GraphView; +using UnityEngine; namespace TNode.Editor{ public class BlackboardSearchWindowProvider:ISearchWindowProvider{ private Type _graphType; - private GraphView _graphView; + private IDataGraphView _graphView; private EditorWindow _editor; + + private struct InternalSearchTreeUserData{ + public IList List; + public Type Type; + + } public List CreateSearchTree(SearchWindowContext context){ - return null; + var blackboardData = _graphView.GetBlackboardData(); + var type = blackboardData.GetType(); + var entries = new List(); + if (entries == null) throw new ArgumentNullException(nameof(entries)); + //search fields with List type + Texture2D icon = new Texture2D(2,2); + foreach (var field in type.GetFields()){ + if (field.FieldType.IsGenericType){ + var genericType = field.FieldType.GetGenericTypeDefinition(); + if (genericType == typeof(List<>)){ + entries.Add(new SearchTreeEntry(new GUIContent(field.Name,icon)){ + level = 1, + userData = new InternalSearchTreeUserData(){ + List = field.GetValue(blackboardData) as IList, + Type = field.FieldType.GetGenericArguments()[0] + } + + }); + } + } + } + + return entries; + } public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ + var userData = SearchTreeEntry.userData; + var relativePos = context.screenMousePosition - _editor.position.position; + var blackboardData = _graphView.GetBlackboardData(); + + if (userData is InternalSearchTreeUserData){ + var list = ((InternalSearchTreeUserData) userData).List; + var type = ((InternalSearchTreeUserData) userData).Type; + var newItem = Activator.CreateInstance(type); + list.Add(newItem); + return true; + } + return false; } + + public void Setup(Type graph,IDataGraphView graphView,EditorWindow editor){ + _graphType = graph; + _graphView = graphView; + _editor = editor; + } } } \ No newline at end of file From 4b792468ec7552503cb0fac92a0e473a01bbf69e Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Mon, 11 Jul 2022 06:45:28 +0800 Subject: [PATCH 05/17] feat:new method create inspector and composite field are now accepted and inspected --- TNode/Editor/Cache/NodeEditorExtensions.cs | 1 - .../InspectorImplementation/EnumFieldItem.cs | 1 + .../InspectorImplementation/FloatFieldItem.cs | 1 + .../PropertyFieldItem.cs | 6 +- .../StringFieldItem.cs | 4 +- .../ToggleFieldItem.cs | 4 +- TNode/Editor/Inspector/InspectorItem.cs | 1 + .../Editor/Inspector/InspectorItemFactory.cs | 1 + TNode/Editor/Inspector/NodeInspectorInNode.cs | 43 ++++++++++-- TNode/Editor/Inspector/PropertyDrawer.meta | 3 + .../Editor/Resources/GraphViewBackground.uss | 2 +- TNode/Editor/Resources/NodeInspector.uss | 1 + TNode/Editor/Resources/NodeInspector.uss.meta | 3 + TNode/Models/BlackboardDragNodeData.cs | 5 +- TNode/Tools/NodeDataWrapper.cs | 68 +++++++++++++++---- 15 files changed, 120 insertions(+), 24 deletions(-) create mode 100644 TNode/Editor/Inspector/PropertyDrawer.meta create mode 100644 TNode/Editor/Resources/NodeInspector.uss create mode 100644 TNode/Editor/Resources/NodeInspector.uss.meta diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index d21c96c..2ad617a 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -113,7 +113,6 @@ namespace TNode.Cache{ ){ //Get the generic type of this type //Add this type to the dictionary - Debug.Log($"type {type} is a registered as node component for {parent}"); FromGenericToSpecific.Add(parent, type); } //TODO Note that a node component only applied to a specific type of editor,so ,same GraphView could behave differently in different editor.it's a todo feature. diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs index 148f9d7..081d9e8 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs @@ -5,6 +5,7 @@ using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ [NodeComponent] + [Obsolete] public class EnumFieldItem:InspectorItem{ public EnumFieldItem() : base(){ var field = new EnumField(); diff --git a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs index fbabbb0..b8a06d6 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs @@ -3,6 +3,7 @@ using TNode.Attribute; using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ + [Obsolete] [NodeComponent] public class FloatFieldItem:InspectorItem{ public FloatFieldItem():base(){ diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs index 05fa288..b1d6a01 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs @@ -1,9 +1,11 @@ -using UnityEditor; +using System; +using UnityEditor; using UnityEditor.UIElements; -using UnityEngine; using UnityEngine.UIElements; +using Object = UnityEngine.Object; namespace TNode.Editor.Inspector.InspectorImplementation{ + [Obsolete] public class PropertyFieldItem:InspectorItem{ public PropertyFieldItem(){ diff --git a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs index 65d9ed9..e05ac16 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs @@ -1,7 +1,9 @@ -using TNode.Attribute; +using System; +using TNode.Attribute; using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ + [Obsolete] /// /// Force these element to bind native c# property /// diff --git a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs index ce0e540..b40cfcc 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs @@ -1,7 +1,9 @@ -using TNode.Attribute; +using System; +using TNode.Attribute; using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ + [Obsolete] [NodeComponent] public class ToggleFieldItem:InspectorItem{ public ToggleFieldItem(){ diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs index 8802bb5..1575c7c 100644 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ b/TNode/Editor/Inspector/InspectorItem.cs @@ -5,6 +5,7 @@ using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector{ + [Obsolete] public abstract class InspectorItem:VisualElement,INodeDataBinding { protected NodeData _bindingNodeData; protected string _bindingFieldName; diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs b/TNode/Editor/Inspector/InspectorItemFactory.cs index 9e5f9a7..d628307 100644 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs +++ b/TNode/Editor/Inspector/InspectorItemFactory.cs @@ -7,6 +7,7 @@ using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector{ + [Obsolete] public class InspectorItemFactory{ public InspectorItem Create(){ diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs b/TNode/Editor/Inspector/NodeInspectorInNode.cs index 9a7c53c..8a0bc88 100644 --- a/TNode/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNode/Editor/Inspector/NodeInspectorInNode.cs @@ -1,6 +1,8 @@ using System.Reflection; using TNode.Attribute; using TNode.Models; +using UnityEditor; +using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; @@ -14,8 +16,11 @@ namespace TNode.Editor.Inspector{ UpdateData(); } + } + public NodeInspectorInNode():base(){ + } private void UpdateData(){ if (_data != null){ RefreshInspector(); @@ -23,22 +28,52 @@ namespace TNode.Editor.Inspector{ } private void RefreshInspector(){ + //Set size + Clear(); + //RefreshItems(); + RefreshPropertyDrawer(); + } + + private void RefreshPropertyDrawer(){ + //Check if the data's type is a generic type of BlackboardDragNodeData<> + if (_data.GetType().IsSubclassOf(typeof(BlackboardDragNodeData<>))){ + return; + } + + + + var serializedObject = new SerializedObject((NodeDataWrapper)_data); + foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public|BindingFlags.NonPublic)){ + //Create corresponding property field + //check if the field has ShowInNodeView attribute + var showInNodeViewAttribute = field.GetCustomAttribute() != null; + if (!showInNodeViewAttribute) + continue; + var drawer = new PropertyField(serializedObject.FindProperty("Data").FindPropertyRelative(field.Name),field.Name); + Debug.Log(serializedObject.FindProperty("Data")); + drawer.Bind(serializedObject); + + Add(drawer); + } + } + + private void RefreshItems(){ InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ var bindingPath = field.Name; var type = field.FieldType; //check if the field has ShowInNodeView attribute - var showInNodeViewAttribute = field.GetCustomAttribute()!=null; - if(!showInNodeViewAttribute) + var showInNodeViewAttribute = field.GetCustomAttribute() != null; + if (!showInNodeViewAttribute) continue; var createdItem = inspectorItemFactory.Create(type); - if (createdItem is { } castedItem){ + if (createdItem is{ } castedItem){ castedItem.BindingNodeData = _data; castedItem.BindingPath = bindingPath; } - Add((VisualElement)createdItem); + Add((VisualElement) createdItem); } } } diff --git a/TNode/Editor/Inspector/PropertyDrawer.meta b/TNode/Editor/Inspector/PropertyDrawer.meta new file mode 100644 index 0000000..196eeba --- /dev/null +++ b/TNode/Editor/Inspector/PropertyDrawer.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: cc8c20a304714599959643305857c804 +timeCreated: 1657486909 \ No newline at end of file diff --git a/TNode/Editor/Resources/GraphViewBackground.uss b/TNode/Editor/Resources/GraphViewBackground.uss index 8107b59..44451b6 100644 --- a/TNode/Editor/Resources/GraphViewBackground.uss +++ b/TNode/Editor/Resources/GraphViewBackground.uss @@ -3,4 +3,4 @@ GridBackground{ --line-color: rgba(211, 211, 211, 0.1); --thick-line-color: rgba(211, 211, 211, 0.2); --spacing:50; -} \ No newline at end of file +} diff --git a/TNode/Editor/Resources/NodeInspector.uss b/TNode/Editor/Resources/NodeInspector.uss new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/TNode/Editor/Resources/NodeInspector.uss @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/TNode/Editor/Resources/NodeInspector.uss.meta b/TNode/Editor/Resources/NodeInspector.uss.meta new file mode 100644 index 0000000..c27086e --- /dev/null +++ b/TNode/Editor/Resources/NodeInspector.uss.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3180a0745e5144aea3d7ea3d43b5b073 +timeCreated: 1657483260 \ No newline at end of file diff --git a/TNode/Models/BlackboardDragNodeData.cs b/TNode/Models/BlackboardDragNodeData.cs index dc587ad..6b1680b 100644 --- a/TNode/Models/BlackboardDragNodeData.cs +++ b/TNode/Models/BlackboardDragNodeData.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; using Newtonsoft.Json; using TNode.Attribute; using TNode.Attribute.Ports; @@ -9,7 +10,7 @@ namespace TNode.Models{ private string _blackDragData; [JsonIgnore] private BlackboardData _blackboardData; - + [Output("",PortNameHandling.MemberType)] public T Value => _blackboardData.GetValue(_blackDragData); diff --git a/TNode/Tools/NodeDataWrapper.cs b/TNode/Tools/NodeDataWrapper.cs index b7391af..1170590 100644 --- a/TNode/Tools/NodeDataWrapper.cs +++ b/TNode/Tools/NodeDataWrapper.cs @@ -4,36 +4,81 @@ using TNode.Models; using UnityEngine; namespace TNode.Editor{ - public class NodeDataWrapper{ - private readonly NodeData _data; + /// + /// Scriptable object wrapper enable property drawer for t-node + /// + public class NodeDataWrapper : ScriptableObject where T : NodeData{ + public T Data; + private static readonly Dictionary> Cache = new (); + public event Action> OnValueChanged; + public static NodeDataWrapper Get(T data){ + if(Cache.ContainsKey(data)){ + return Cache[data]; + } + var wrapper = ScriptableObject.CreateInstance>(); + Cache.Add(data,wrapper); + return wrapper; + } + public NodeDataWrapper(T data){ + this.Data = data; + } + + public void SetValue(string path, object value){ + var fieldInfo = Data.GetType().GetField(path); + fieldInfo.SetValue(Data,value); + OnValueChanged?.Invoke(this); + } + + public object GetValue(string path){ + var fieldInfo = Data.GetType().GetField(path); + return fieldInfo.GetValue(Data); + } + public static implicit operator T(NodeDataWrapper wrapper){ + if (wrapper == null) + return null; + return wrapper.Data; + + } + public static implicit operator NodeDataWrapper(T unWrapper){ + if (unWrapper == null) + return null; + return Get(unWrapper); + } + } + + public class NodeDataWrapper:ScriptableObject{ + [SerializeReference] + public NodeData Data; private static readonly Dictionary Cache = new (); public event Action OnValueChanged; public static NodeDataWrapper Get(NodeData data){ + if (data.GetType().IsGenericType){ + return ScriptableObject.CreateInstance(); + } if(Cache.ContainsKey(data)){ return Cache[data]; } - var wrapper = new NodeDataWrapper(data); + var wrapper = ScriptableObject.CreateInstance(); + wrapper.Data = data; Cache.Add(data,wrapper); return wrapper; } - public NodeDataWrapper(NodeData data){ - this._data = data; - } + public void SetValue(string path, object value){ - var fieldInfo = _data.GetType().GetField(path); - fieldInfo.SetValue(_data,value); + var fieldInfo = Data.GetType().GetField(path); + fieldInfo.SetValue(Data,value); OnValueChanged?.Invoke(this); } public object GetValue(string path){ - var fieldInfo = _data.GetType().GetField(path); - return fieldInfo.GetValue(_data); + var fieldInfo = Data.GetType().GetField(path); + return fieldInfo.GetValue(Data); } public static implicit operator NodeData(NodeDataWrapper wrapper){ if (wrapper == null) return null; - return wrapper._data; + return wrapper.Data; } public static implicit operator NodeDataWrapper(NodeData unWrapper){ @@ -41,6 +86,5 @@ namespace TNode.Editor{ return null; return Get(unWrapper); } - } } \ No newline at end of file From eb12765338ca7890eb20be74a0e22b0436089bdd Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Tue, 12 Jul 2022 12:03:24 +0800 Subject: [PATCH 06/17] feat: search window now applied correctly --- Sample/MathGraph/Editor/MathGraphView.cs | 2 +- ...Attribute.cs => ViewComponentAttribute.cs} | 2 +- ...cs.meta => ViewComponentAttribute.cs.meta} | 0 TNode/Editor/BaseViews/DataGraphView.cs | 41 +++++++----- TNode/Editor/Cache/NodeEditorExtensions.cs | 63 +++++++++++++------ .../DefaultGraphBlackboardView.cs | 17 +++++ .../DefaultGraphBlackboardView.cs.meta | 3 + ...phBlackboard.cs => GraphBlackboardView.cs} | 7 ++- ...rd.cs.meta => GraphBlackboardView.cs.meta} | 0 TNode/Editor/GraphEditor.cs | 2 +- .../InspectorImplementation/EnumFieldItem.cs | 2 +- .../InspectorImplementation/FloatFieldItem.cs | 2 +- .../StringFieldItem.cs | 2 +- .../ToggleFieldItem.cs | 2 +- .../Editor/Inspector/InspectorItemFactory.cs | 8 +-- TNode/Editor/NodeViews/DragNodeView.cs | 2 +- .../Search/BlackboardSearchWindowProvider.cs | 24 +++---- .../Editor/Search/NodeSearchWindowProvider.cs | 4 +- 18 files changed, 119 insertions(+), 64 deletions(-) rename TNode/Attribute/{NodeComponentAttribute.cs => ViewComponentAttribute.cs} (83%) rename TNode/Attribute/{NodeComponentAttribute.cs.meta => ViewComponentAttribute.cs.meta} (100%) create mode 100644 TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs create mode 100644 TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta rename TNode/Editor/GraphBlackboard/{GraphBlackboard.cs => GraphBlackboardView.cs} (63%) rename TNode/Editor/GraphBlackboard/{GraphBlackboard.cs.meta => GraphBlackboardView.cs.meta} (100%) diff --git a/Sample/MathGraph/Editor/MathGraphView.cs b/Sample/MathGraph/Editor/MathGraphView.cs index 730dfab..8fc1a08 100644 --- a/Sample/MathGraph/Editor/MathGraphView.cs +++ b/Sample/MathGraph/Editor/MathGraphView.cs @@ -1,7 +1,7 @@ using TNode.Models; using TNode.Attribute; using TNode.Editor.BaseViews; -[NodeComponent] +[ViewComponent] public class MathGraphView : DataGraphView{ diff --git a/TNode/Attribute/NodeComponentAttribute.cs b/TNode/Attribute/ViewComponentAttribute.cs similarity index 83% rename from TNode/Attribute/NodeComponentAttribute.cs rename to TNode/Attribute/ViewComponentAttribute.cs index 2a3c660..6399726 100644 --- a/TNode/Attribute/NodeComponentAttribute.cs +++ b/TNode/Attribute/ViewComponentAttribute.cs @@ -11,7 +11,7 @@ namespace TNode.Attribute{ [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] [MeansImplicitUse] - public class NodeComponentAttribute:System.Attribute{ + public class ViewComponentAttribute:System.Attribute{ public Type GenericType{ get; set; } diff --git a/TNode/Attribute/NodeComponentAttribute.cs.meta b/TNode/Attribute/ViewComponentAttribute.cs.meta similarity index 100% rename from TNode/Attribute/NodeComponentAttribute.cs.meta rename to TNode/Attribute/ViewComponentAttribute.cs.meta diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNode/Editor/BaseViews/DataGraphView.cs index b66b150..ff2decd 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNode/Editor/BaseViews/DataGraphView.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -7,6 +8,7 @@ using TNode.Cache; using TNode.Editor.GraphBlackboard; using TNode.Editor.Inspector; using TNode.Editor.Model; +using TNode.Editor.Search; using TNode.Editor.Tools.NodeCreator; using TNode.Models; using Unity.VisualScripting; @@ -281,20 +283,11 @@ namespace TNode.Editor.BaseViews{ } public virtual void CreateBlackboard(){ - _blackboard = new Blackboard(); - //Blackboard add "Add Node" button - // blackboard.Add(new BlackboardSection(){ - // title = "Hello World", - // }); - // blackboard.addItemRequested = (item) => { - // //Create a sub window for the blackboard to show the selection - // var subWindow = ScriptableObject.CreateNodeComponentFromGenericType(); - // }; - // - //Set black board to left side of the view + + _blackboard = NodeEditorExtensions.CreateBlackboardWithGraphData(typeof(T)); + _blackboard.SetPosition(new Rect(0,0,200,600)); Add(_blackboard); - //Check the type of the blackboard OnDataChanged+= (sender, e) => { BlackboardUpdate(); }; @@ -306,14 +299,30 @@ namespace TNode.Editor.BaseViews{ if (_data.blackboardData == null) return; } - + //Iterate field of the blackboard and add a button for each field foreach (var field in _data.blackboardData.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ - //if the field is MonoBehaviour,add a property field for blackboard - var propertyField = new BlackboardPropertyField(new BlackboardProperty(field.Name,field.FieldType)); - _blackboard.Add(propertyField); + //if the field is MonoBehaviour,add a property field for blackboard + //skip if the field is a list or Ilist + if (!typeof(IList).IsAssignableFrom(field.FieldType)){ + var propertyField = new BlackboardPropertyField(new BlackboardProperty(field.Name,field.FieldType)); + _blackboard.Add(propertyField); + } + } + _blackboard.addItemRequested = (sender) => { + var res = ScriptableObject.CreateInstance(); + + //Get right top corner of the blackboard + var blackboardPos = _blackboard.GetPosition().position; + var searchWindowContext = new SearchWindowContext(blackboardPos,200,200); + //Call search window + res.Setup(typeof(T),this,Owner); + + SearchWindow.Open(searchWindowContext, res); + }; + } public virtual void DestroyInspector(){ diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index 2ad617a..f02c267 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -5,6 +5,7 @@ using TNode.Attribute; using TNode.BaseViews; using TNode.Editor; using TNode.Editor.BaseViews; +using TNode.Editor.GraphBlackboard; using TNode.Editor.Inspector; using TNode.Models; using UnityEditor.Experimental.GraphView; @@ -58,7 +59,7 @@ namespace TNode.Cache{ foreach(var type in assembly.GetTypes()){ if(type.IsClass && !type.IsAbstract){ //Register Node View And Graph View via its parent class - SetNodeComponentAttribute(type); + SetViewComponentAttribute(type); //Register Node Data by GraphUsageAttribute. SetGraphUsageAttribute(type); } @@ -98,9 +99,10 @@ namespace TNode.Cache{ } } } - private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(InspectorItem<>),typeof(NodeView<>)}; - private void SetNodeComponentAttribute(Type type){ - foreach (var attribute in type.GetCustomAttributes(typeof(NodeComponentAttribute), false)){ + private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(GraphBlackboardView<>)}; + private readonly Type[] _defaultTypes = new []{typeof(DefaultNodeView),typeof(DefaultGraphBlackboardView)}; + private void SetViewComponentAttribute(Type type){ + foreach (var attribute in type.GetCustomAttributes(typeof(ViewComponentAttribute), false)){ //fetch this type 's parent class var parent = type.BaseType; //Check if this type is a generic type and is a generic type of NodeView or DataGraphView, @@ -121,17 +123,28 @@ namespace TNode.Cache{ } //Outer wrapper for the singleton class public static class NodeEditorExtensions{ - public static T CreateNodeComponentFromGenericType(){ + /// + /// by given a generic type T,return the implementation instance of the generic type + /// + /// + /// + public static T CreateViewComponentFromBaseType(){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[typeof(T)]; var instance = (T)Activator.CreateInstance(implementedType); return instance; } - public static object CreateNodeComponentFromGenericType(Type t){ + + /// + /// by given a generic type t,return the implementation instance of the generic type + /// + /// + public static object CreateViewComponentFromBaseType(Type t){ if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(t)){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[t]; var instance = Activator.CreateInstance(implementedType); return instance; } + //check if t is a generic type node view if (t is{IsGenericType: true} && t.GetGenericTypeDefinition() == typeof(NodeView<>)){ var instance = Activator.CreateInstance(typeof(NodeView)); @@ -139,6 +152,31 @@ namespace TNode.Cache{ } return null; } + + public static Blackboard CreateBlackboardDataFromBlackboardDataType(Type t){ + var type = typeof(GraphBlackboardView<>).MakeGenericType(t); + var res = CreateViewComponentFromBaseType(type) as Blackboard; + return res ?? new DefaultGraphBlackboardView(); + + } + + public static Blackboard CreateBlackboardWithGraphData(GraphData graphData){ + var graphType = graphData.GetType(); + if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ + var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; + return CreateBlackboardDataFromBlackboardDataType(type); + + } + return null; + } + public static Blackboard CreateBlackboardWithGraphData(Type graphType){ + if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ + var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; + return CreateBlackboardDataFromBlackboardDataType(type); + + } + return null; + } public static bool HasSpecificTypeComponent() where T : class{ return NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(typeof(T)); @@ -159,19 +197,6 @@ namespace TNode.Cache{ } return null; } - public static object CreateNodeViewFromNodeType() where T:NodeData,new(){ - //Check specific derived type exists or not. - var type = typeof(NodeView); - if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(type)){ - var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[type]; - var instance = (NodeView)Activator.CreateInstance(implementedType); - return instance; - } - else{ - return new DefaultNodeView(); - } - - } public static object CreateNodeViewFromNodeType(Type t){ //Check the generic type of NodeView by t diff --git a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs new file mode 100644 index 0000000..26c98c2 --- /dev/null +++ b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -0,0 +1,17 @@ +using TNode.Attribute; +using TNode.Models; + +namespace TNode.Editor.GraphBlackboard{ + [ViewComponent] + public class DefaultGraphBlackboardView:GraphBlackboardView{ + public DefaultGraphBlackboardView(){ + + } + public void ConstructView(){ + + } + public void AddParameter(){ + + } + } +} \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta new file mode 100644 index 0000000..3b6d406 --- /dev/null +++ b/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98e4de339ad84949ac2c50e61a108a96 +timeCreated: 1657592333 \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/GraphBlackboard.cs b/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs similarity index 63% rename from TNode/Editor/GraphBlackboard/GraphBlackboard.cs rename to TNode/Editor/GraphBlackboard/GraphBlackboardView.cs index 40b9e3d..a59ce41 100644 --- a/TNode/Editor/GraphBlackboard/GraphBlackboard.cs +++ b/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs @@ -5,8 +5,11 @@ namespace TNode.Editor.GraphBlackboard{ /// /// Implement this class to create graph black board for specified graph /// - public class GraphBlackboard:Blackboard where T:BlackboardData{ + public class GraphBlackboardView:Blackboard where T:BlackboardData{ public T BlackboardData; - + + public GraphBlackboardView() : base(){ + + } } } \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/GraphBlackboard.cs.meta b/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/GraphBlackboard.cs.meta rename to TNode/Editor/GraphBlackboard/GraphBlackboardView.cs.meta diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index e045f39..7d1b01a 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -36,7 +36,7 @@ namespace TNode.Editor{ } private void BuildGraphView(){ - _graphView = NodeEditorExtensions.CreateNodeComponentFromGenericType>(); + _graphView = NodeEditorExtensions.CreateViewComponentFromBaseType>(); rootVisualElement.Add(_graphView); _graphView.StretchToParentSize(); } diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs index 081d9e8..362d8f7 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs @@ -4,7 +4,7 @@ using UnityEngine; using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ - [NodeComponent] + [ViewComponent] [Obsolete] public class EnumFieldItem:InspectorItem{ public EnumFieldItem() : base(){ diff --git a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs index b8a06d6..5cbda65 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs @@ -4,7 +4,7 @@ using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ [Obsolete] - [NodeComponent] + [ViewComponent] public class FloatFieldItem:InspectorItem{ public FloatFieldItem():base(){ CreateBindable(new FloatField()); diff --git a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs index e05ac16..a065a9a 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs @@ -7,7 +7,7 @@ namespace TNode.Editor.Inspector.InspectorImplementation{ /// /// Force these element to bind native c# property /// - [NodeComponent] + [ViewComponent] public class StringFieldItem:InspectorItem{ public StringFieldItem():base(){ CreateBindable(new TextField()); diff --git a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs index b40cfcc..41c0328 100644 --- a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs +++ b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs @@ -4,7 +4,7 @@ using UnityEngine.UIElements; namespace TNode.Editor.Inspector.InspectorImplementation{ [Obsolete] - [NodeComponent] + [ViewComponent] public class ToggleFieldItem:InspectorItem{ public ToggleFieldItem(){ CreateBindable(new Toggle()); diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs b/TNode/Editor/Inspector/InspectorItemFactory.cs index d628307..4a97483 100644 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs +++ b/TNode/Editor/Inspector/InspectorItemFactory.cs @@ -15,12 +15,12 @@ namespace TNode.Editor.Inspector{ var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent>(); if (hasSpecificType){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType>(); + return NodeEditorExtensions.CreateViewComponentFromBaseType>(); } if (typeof(T).IsEnum){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType(typeof(InspectorItem)) as InspectorItem; + return NodeEditorExtensions.CreateViewComponentFromBaseType(typeof(InspectorItem)) as InspectorItem; } return null; } @@ -30,12 +30,12 @@ namespace TNode.Editor.Inspector{ var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent(genericType); if (hasSpecificType){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType(genericType) as INodeDataBindingBase; + return NodeEditorExtensions.CreateViewComponentFromBaseType(genericType) as INodeDataBindingBase; } if (t.IsEnum){ - return NodeEditorExtensions.CreateNodeComponentFromGenericType(typeof(InspectorItem)) as INodeDataBindingBase; + return NodeEditorExtensions.CreateViewComponentFromBaseType(typeof(InspectorItem)) as INodeDataBindingBase; } return null; } diff --git a/TNode/Editor/NodeViews/DragNodeView.cs b/TNode/Editor/NodeViews/DragNodeView.cs index 8ce31c7..5502fcc 100644 --- a/TNode/Editor/NodeViews/DragNodeView.cs +++ b/TNode/Editor/NodeViews/DragNodeView.cs @@ -3,7 +3,7 @@ using TNode.Editor.BaseViews; using TNode.Models; namespace TNode.Editor.NodeViews{ - [NodeComponent] + [ViewComponent] public class DragNodeView:NodeView>{ public DragNodeView() : base(){ //Make capsule like style diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs index acfbc82..dfec7a4 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNode/Editor/Search/BlackboardSearchWindowProvider.cs @@ -6,8 +6,8 @@ using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; -namespace TNode.Editor{ - public class BlackboardSearchWindowProvider:ISearchWindowProvider{ +namespace TNode.Editor.Search{ + public class BlackboardSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ private Type _graphType; private IDataGraphView _graphView; private EditorWindow _editor; @@ -20,15 +20,19 @@ namespace TNode.Editor{ public List CreateSearchTree(SearchWindowContext context){ var blackboardData = _graphView.GetBlackboardData(); var type = blackboardData.GetType(); - var entries = new List(); - if (entries == null) throw new ArgumentNullException(nameof(entries)); + var list = new List(){ + new SearchTreeGroupEntry(new GUIContent("Add New Blackboard Data"), 0), + }; + + if (list == null) throw new ArgumentNullException(nameof(list)); //search fields with List type Texture2D icon = new Texture2D(2,2); + foreach (var field in type.GetFields()){ if (field.FieldType.IsGenericType){ var genericType = field.FieldType.GetGenericTypeDefinition(); if (genericType == typeof(List<>)){ - entries.Add(new SearchTreeEntry(new GUIContent(field.Name,icon)){ + list.Add(new SearchTreeEntry(new GUIContent(field.Name,icon)){ level = 1, userData = new InternalSearchTreeUserData(){ List = field.GetValue(blackboardData) as IList, @@ -39,24 +43,20 @@ namespace TNode.Editor{ } } } - - return entries; + Debug.Log($"{list.Count}"); + return list; } public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ var userData = SearchTreeEntry.userData; - var relativePos = context.screenMousePosition - _editor.position.position; - var blackboardData = _graphView.GetBlackboardData(); - if (userData is InternalSearchTreeUserData){ var list = ((InternalSearchTreeUserData) userData).List; var type = ((InternalSearchTreeUserData) userData).Type; var newItem = Activator.CreateInstance(type); - list.Add(newItem); + list?.Add(newItem); return true; } - return false; } diff --git a/TNode/Editor/Search/NodeSearchWindowProvider.cs b/TNode/Editor/Search/NodeSearchWindowProvider.cs index e694f4a..55ec5ff 100644 --- a/TNode/Editor/Search/NodeSearchWindowProvider.cs +++ b/TNode/Editor/Search/NodeSearchWindowProvider.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Drawing; -using TNode.BaseViews; using TNode.Cache; using TNode.Editor.BaseViews; using TNode.Editor.Tools.NodeCreator; @@ -11,7 +9,7 @@ using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; -namespace TNode.Editor{ +namespace TNode.Editor.Search{ public class NodeSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ private Type _graphType; private GraphView _graphView; From 17f860adf4478fa943e4de55e85e1eed5343998a Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Wed, 13 Jul 2022 12:03:27 +0800 Subject: [PATCH 07/17] refactor: Move implementation level to another folder --- Sample/MathGraph/Editor/MathEditor.cs | 2 +- Sample/MathGraph/Editor/MathGraphView.cs | 5 +- TNode/Attribute/Ports/InputAttribute.cs | 4 +- TNode/Attribute/Ports/PortAttribute.cs | 3 +- TNode/Editor/BaseViews.meta | 3 - TNode/Editor/Cache/NodeEditorExtensions.cs | 28 ++-- .../Editor/GraphBlackboard/BlackboardField.cs | 12 -- TNode/Editor/GraphEditor.cs | 15 +- .../Inspector/InspectorImplementation.meta | 3 - .../InspectorImplementation/EnumFieldItem.cs | 21 --- .../EnumFieldItem.cs.meta | 3 - .../InspectorImplementation/FloatFieldItem.cs | 13 -- .../FloatFieldItem.cs.meta | 3 - .../PropertyFieldItem.cs | 25 ---- .../PropertyFieldItem.cs.meta | 3 - .../StringFieldItem.cs | 16 --- .../StringFieldItem.cs.meta | 3 - .../ToggleFieldItem.cs | 14 -- .../ToggleFieldItem.cs.meta | 3 - TNode/Editor/Inspector/InspectorItem.cs | 105 -------------- TNode/Editor/Inspector/InspectorItem.cs.meta | 3 - .../Editor/Inspector/InspectorItemFactory.cs | 45 ------ .../Inspector/InspectorItemFactory.cs.meta | 3 - TNode/Editor/Inspector/MonoScriptInspector.cs | 16 --- .../Inspector/MonoScriptInspector.cs.meta | 3 - TNode/Editor/Inspector/PropertyDrawer.meta | 3 - TNode/Editor/Manipulators.meta | 3 - TNode/Editor/NodeGraphView.meta | 3 + .../NodeGraphView/IBaseDataGraphView.cs | 11 ++ .../NodeGraphView/IBaseDataGraphView.cs.meta | 3 + TNode/Editor/NodeGraphView/IDataGraphView.cs | 7 + .../NodeGraphView/IDataGraphView.cs.meta | 3 + TNode/Editor/NodeViews/DefaultNodeView.cs | 11 -- TNodeGraphViewImpl.meta | 3 + TNodeGraphViewImpl/Editor.meta | 3 + .../Editor/GraphBlackboard.meta | 0 .../Editor/GraphBlackboard/BlackboardField.cs | 12 ++ .../GraphBlackboard/BlackboardField.cs.meta | 0 .../GraphBlackboard/BlackboardProperty.meta | 0 .../BlackboardProperty/BlackboardProperty.cs | 2 +- .../BlackboardProperty.cs.meta | 0 .../DefaultGraphBlackboardView.cs | 2 +- .../DefaultGraphBlackboardView.cs.meta | 0 .../GraphBlackboard/GraphBlackboardView.cs | 2 +- .../GraphBlackboardView.cs.meta | 0 TNodeGraphViewImpl/Editor/Inspector.meta | 3 + .../Editor/Inspector/NodeInspector.cs | 30 ++-- .../Editor/Inspector/NodeInspector.cs.meta | 0 .../Editor/Inspector/NodeInspectorInNode.cs | 23 --- .../Inspector/NodeInspectorInNode.cs.meta | 0 TNodeGraphViewImpl/Editor/NodeGraphView.meta | 3 + .../Editor/NodeGraphView}/DataGraphView.cs | 131 +++--------------- .../NodeGraphView}/DataGraphView.cs.meta | 0 .../NodeGraphView}/SimpleGraphSubWindow.cs | 2 +- .../SimpleGraphSubWindow.cs.meta | 0 .../Editor/NodeViews.meta | 0 .../Editor/NodeViews/DefaultNodeView.cs | 10 ++ .../Editor/NodeViews/DefaultNodeView.cs.meta | 0 .../Editor/NodeViews/DragNodeView.cs | 5 +- .../Editor/NodeViews/DragNodeView.cs.meta | 0 .../Editor/NodeViews/NodeView.cs | 20 ++- .../Editor/NodeViews/NodeView.cs.meta | 0 .../Editor/Search.meta | 0 .../Search/BlackboardSearchWindowProvider.cs | 6 +- .../BlackboardSearchWindowProvider.cs.meta | 0 .../Editor/Search/NodeSearchWindowProvider.cs | 4 +- .../Search/NodeSearchWindowProvider.cs.meta | 0 67 files changed, 140 insertions(+), 519 deletions(-) delete mode 100644 TNode/Editor/BaseViews.meta delete mode 100644 TNode/Editor/GraphBlackboard/BlackboardField.cs delete mode 100644 TNode/Editor/Inspector/InspectorImplementation.meta delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs.meta delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs.meta delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs delete mode 100644 TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs.meta delete mode 100644 TNode/Editor/Inspector/InspectorItem.cs delete mode 100644 TNode/Editor/Inspector/InspectorItem.cs.meta delete mode 100644 TNode/Editor/Inspector/InspectorItemFactory.cs delete mode 100644 TNode/Editor/Inspector/InspectorItemFactory.cs.meta delete mode 100644 TNode/Editor/Inspector/MonoScriptInspector.cs delete mode 100644 TNode/Editor/Inspector/MonoScriptInspector.cs.meta delete mode 100644 TNode/Editor/Inspector/PropertyDrawer.meta delete mode 100644 TNode/Editor/Manipulators.meta create mode 100644 TNode/Editor/NodeGraphView.meta create mode 100644 TNode/Editor/NodeGraphView/IBaseDataGraphView.cs create mode 100644 TNode/Editor/NodeGraphView/IBaseDataGraphView.cs.meta create mode 100644 TNode/Editor/NodeGraphView/IDataGraphView.cs create mode 100644 TNode/Editor/NodeGraphView/IDataGraphView.cs.meta delete mode 100644 TNode/Editor/NodeViews/DefaultNodeView.cs create mode 100644 TNodeGraphViewImpl.meta create mode 100644 TNodeGraphViewImpl/Editor.meta rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard.meta (100%) create mode 100644 TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/BlackboardField.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/BlackboardProperty.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs (85%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs (86%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/GraphBlackboardView.cs (87%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphBlackboard/GraphBlackboardView.cs.meta (100%) create mode 100644 TNodeGraphViewImpl/Editor/Inspector.meta rename {TNode => TNodeGraphViewImpl}/Editor/Inspector/NodeInspector.cs (61%) rename {TNode => TNodeGraphViewImpl}/Editor/Inspector/NodeInspector.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/Inspector/NodeInspectorInNode.cs (67%) rename {TNode => TNodeGraphViewImpl}/Editor/Inspector/NodeInspectorInNode.cs.meta (100%) create mode 100644 TNodeGraphViewImpl/Editor/NodeGraphView.meta rename {TNode/Editor/BaseViews => TNodeGraphViewImpl/Editor/NodeGraphView}/DataGraphView.cs (74%) rename {TNode/Editor/BaseViews => TNodeGraphViewImpl/Editor/NodeGraphView}/DataGraphView.cs.meta (100%) rename {TNode/Editor/BaseViews => TNodeGraphViewImpl/Editor/NodeGraphView}/SimpleGraphSubWindow.cs (97%) rename {TNode/Editor/BaseViews => TNodeGraphViewImpl/Editor/NodeGraphView}/SimpleGraphSubWindow.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/NodeViews.meta (100%) create mode 100644 TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs rename {TNode => TNodeGraphViewImpl}/Editor/NodeViews/DefaultNodeView.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/NodeViews/DragNodeView.cs (65%) rename {TNode => TNodeGraphViewImpl}/Editor/NodeViews/DragNodeView.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/NodeViews/NodeView.cs (94%) rename {TNode => TNodeGraphViewImpl}/Editor/NodeViews/NodeView.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/Search.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/Search/BlackboardSearchWindowProvider.cs (93%) rename {TNode => TNodeGraphViewImpl}/Editor/Search/BlackboardSearchWindowProvider.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/Search/NodeSearchWindowProvider.cs (93%) rename {TNode => TNodeGraphViewImpl}/Editor/Search/NodeSearchWindowProvider.cs.meta (100%) diff --git a/Sample/MathGraph/Editor/MathEditor.cs b/Sample/MathGraph/Editor/MathEditor.cs index 75ae61d..a5bb700 100644 --- a/Sample/MathGraph/Editor/MathEditor.cs +++ b/Sample/MathGraph/Editor/MathEditor.cs @@ -14,7 +14,7 @@ public class MathEditor : GraphEditor{ var wnd = GetWindow(); wnd.titleContent = new GUIContent("MathGraph Editor"); wnd.CreateGUI(); - wnd._graphView.Data = graph; + wnd.GraphView.Data = graph; return true; } return false; diff --git a/Sample/MathGraph/Editor/MathGraphView.cs b/Sample/MathGraph/Editor/MathGraphView.cs index 8fc1a08..05928c2 100644 --- a/Sample/MathGraph/Editor/MathGraphView.cs +++ b/Sample/MathGraph/Editor/MathGraphView.cs @@ -1,8 +1,9 @@ using TNode.Models; using TNode.Attribute; -using TNode.Editor.BaseViews; +using TNodeGraphViewImpl.Editor.NodeGraphView; + [ViewComponent] -public class MathGraphView : DataGraphView{ +public class MathGraphView : BaseDataGraphView{ diff --git a/TNode/Attribute/Ports/InputAttribute.cs b/TNode/Attribute/Ports/InputAttribute.cs index dd4b855..e0d4b96 100644 --- a/TNode/Attribute/Ports/InputAttribute.cs +++ b/TNode/Attribute/Ports/InputAttribute.cs @@ -1,9 +1,7 @@ using System; using JetBrains.Annotations; -using TNode.Models; -using UnityEditor.Experimental.GraphView; -namespace TNode.Attribute{ +namespace TNode.Attribute.Ports{ [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class InputAttribute : PortAttribute{ diff --git a/TNode/Attribute/Ports/PortAttribute.cs b/TNode/Attribute/Ports/PortAttribute.cs index 24feda5..cc3be06 100644 --- a/TNode/Attribute/Ports/PortAttribute.cs +++ b/TNode/Attribute/Ports/PortAttribute.cs @@ -1,8 +1,7 @@ using System; using JetBrains.Annotations; -using UnityEditor.Experimental.GraphView; -namespace TNode.Attribute{ +namespace TNode.Attribute.Ports{ public enum PortNameHandling{ Auto, diff --git a/TNode/Editor/BaseViews.meta b/TNode/Editor/BaseViews.meta deleted file mode 100644 index 54107dd..0000000 --- a/TNode/Editor/BaseViews.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: be6b702224dc40098aadadb3749d8c81 -timeCreated: 1655394343 \ No newline at end of file diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNode/Editor/Cache/NodeEditorExtensions.cs index f02c267..4f2de04 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNode/Editor/Cache/NodeEditorExtensions.cs @@ -2,12 +2,12 @@ using System.Collections.Generic; using System.Linq; using TNode.Attribute; -using TNode.BaseViews; using TNode.Editor; -using TNode.Editor.BaseViews; -using TNode.Editor.GraphBlackboard; using TNode.Editor.Inspector; +using TNode.Editor.NodeViews; using TNode.Models; +using TNodeGraphViewImpl.Editor.GraphBlackboard; +using TNodeGraphViewImpl.Editor.NodeGraphView; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.TestTools.Utils; @@ -99,13 +99,13 @@ namespace TNode.Cache{ } } } - private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(NodeView<>),typeof(DataGraphView<>),typeof(GraphBlackboardView<>)}; - private readonly Type[] _defaultTypes = new []{typeof(DefaultNodeView),typeof(DefaultGraphBlackboardView)}; + private readonly Type[] _acceptedTypesForGenericToSpecific = new Type[]{typeof(BaseNodeView<>),typeof(BaseDataGraphView<>),typeof(GraphBlackboardView<>)}; + private readonly Type[] _defaultTypes = new []{typeof(DefaultBaseNodeView),typeof(DefaultGraphBlackboardView)}; private void SetViewComponentAttribute(Type type){ foreach (var attribute in type.GetCustomAttributes(typeof(ViewComponentAttribute), false)){ //fetch this type 's parent class var parent = type.BaseType; - //Check if this type is a generic type and is a generic type of NodeView or DataGraphView, + //Check if this type is a generic type and is a generic type of BaseNodeView or BaseDataGraphView, //Two level generic definition is now supported by TNode //Deeper nested generic definition is not supported by TNode if (parent is{IsGenericType: true} && @@ -146,8 +146,8 @@ namespace TNode.Cache{ } //check if t is a generic type node view - if (t is{IsGenericType: true} && t.GetGenericTypeDefinition() == typeof(NodeView<>)){ - var instance = Activator.CreateInstance(typeof(NodeView)); + if (t is{IsGenericType: true} && t.GetGenericTypeDefinition() == typeof(BaseNodeView<>)){ + var instance = Activator.CreateInstance(typeof(BaseNodeView)); return instance; } return null; @@ -198,7 +198,7 @@ namespace TNode.Cache{ return null; } public static object CreateNodeViewFromNodeType(Type t){ - //Check the generic type of NodeView by t + //Check the generic type of BaseNodeView by t if (t.IsGenericType){ Debug.Log($"A generic type {t} is detected"); @@ -208,8 +208,8 @@ namespace TNode.Cache{ var genericTypeDefinition = t.GetGenericTypeDefinition(); - //What you want is a NodeView> to be created - var genericViewType = typeof(NodeView<>).MakeGenericType(genericTypeDefinition); + //What you want is a BaseNodeView> to be created + var genericViewType = typeof(BaseNodeView<>).MakeGenericType(genericTypeDefinition); Debug.Log($"The generic view type is {genericViewType}"); //search for the specific type of genericViewType in the dictionary @@ -226,11 +226,11 @@ namespace TNode.Cache{ } else{ - return new DefaultNodeView(); + return new DefaultBaseNodeView(); } } - var type = typeof(NodeView<>).MakeGenericType(t); + var type = typeof(BaseNodeView<>).MakeGenericType(t); if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(type)){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[type]; @@ -239,7 +239,7 @@ namespace TNode.Cache{ } else{ - return new DefaultNodeView(); + return new DefaultBaseNodeView(); } } diff --git a/TNode/Editor/GraphBlackboard/BlackboardField.cs b/TNode/Editor/GraphBlackboard/BlackboardField.cs deleted file mode 100644 index 87f5d9d..0000000 --- a/TNode/Editor/GraphBlackboard/BlackboardField.cs +++ /dev/null @@ -1,12 +0,0 @@ -using UnityEditor.Experimental.GraphView; - -namespace TNode.Editor.GraphBlackboard{ - public class BlackboardPropertyField:BlackboardField{ - public BlackboardProperty BlackboardProperty; - public BlackboardPropertyField(BlackboardProperty blackboardProperty):base(null,blackboardProperty.PropertyName,null){ - BlackboardProperty = blackboardProperty; - } - - - } -} \ No newline at end of file diff --git a/TNode/Editor/GraphEditor.cs b/TNode/Editor/GraphEditor.cs index 7d1b01a..93a272e 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNode/Editor/GraphEditor.cs @@ -1,10 +1,9 @@ using Codice.CM.Common; -using TNode.BaseViews; using TNode.Cache; -using TNode.Editor.BaseViews; using TNode.Editor.Inspector; using TNode.Editor.Model; using TNode.Models; +using TNodeGraphViewImpl.Editor.NodeGraphView; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; @@ -15,7 +14,7 @@ namespace TNode.Editor{ public abstract class GraphEditor : EditorWindow where T:GraphData{ - protected DataGraphView _graphView; + protected BaseDataGraphView GraphView; [SerializeField] private VisualTreeAsset mVisualTreeAsset = default; //Persist editor data ,such as node position,node size ,etc ,in this script object @@ -36,9 +35,9 @@ namespace TNode.Editor{ } private void BuildGraphView(){ - _graphView = NodeEditorExtensions.CreateViewComponentFromBaseType>(); - rootVisualElement.Add(_graphView); - _graphView.StretchToParentSize(); + GraphView = NodeEditorExtensions.CreateViewComponentFromBaseType>(); + rootVisualElement.Add(GraphView); + GraphView.StretchToParentSize(); } private void DefineGraphEditorActions(){ @@ -54,7 +53,7 @@ namespace TNode.Editor{ private void Save(){ //if no graph is loaded ,create a file save dialogue - if (_graphView.Data == null) + if (GraphView.Data == null) { string path = EditorUtility.SaveFilePanel("Save Graph", "", "", "asset"); if (path.Length != 0){ @@ -66,7 +65,7 @@ namespace TNode.Editor{ } } else{ - _graphView.SaveWithEditorData(graphEditorData); + GraphView.SaveWithEditorData(graphEditorData); AssetDatabase.Refresh(); } diff --git a/TNode/Editor/Inspector/InspectorImplementation.meta b/TNode/Editor/Inspector/InspectorImplementation.meta deleted file mode 100644 index d8de6bd..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 4cdebd0430794d32918ba8c63d71d0cc -timeCreated: 1656142311 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs deleted file mode 100644 index 362d8f7..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using TNode.Attribute; -using UnityEngine; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector.InspectorImplementation{ - [ViewComponent] - [Obsolete] - public class EnumFieldItem:InspectorItem{ - public EnumFieldItem() : base(){ - var field = new EnumField(); - Debug.Log("An Enum Field is created"); - CreateBindable(field); - OnDataChanged += () => { - - field.Init(Value); - Debug.Log(Value.GetType()); - }; - } - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta deleted file mode 100644 index 1a83a95..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/EnumFieldItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6eb83a1255d545e5998c7b3efd1b0d69 -timeCreated: 1657193097 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs deleted file mode 100644 index 5cbda65..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using TNode.Attribute; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector.InspectorImplementation{ - [Obsolete] - [ViewComponent] - public class FloatFieldItem:InspectorItem{ - public FloatFieldItem():base(){ - CreateBindable(new FloatField()); - } - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs.meta deleted file mode 100644 index 170c2d3..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/FloatFieldItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 932de5e7a487475aa764dd819cc33aa0 -timeCreated: 1656583186 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs deleted file mode 100644 index b1d6a01..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using UnityEditor; -using UnityEditor.UIElements; -using UnityEngine.UIElements; -using Object = UnityEngine.Object; - -namespace TNode.Editor.Inspector.InspectorImplementation{ - [Obsolete] - public class PropertyFieldItem:InspectorItem{ - - public PropertyFieldItem(){ - - - OnDataChanged += () => { - var data = new SerializedObject(Value as Object); - var testProperty = data.GetIterator().GetArrayElementAtIndex(0); - PropertyField propertyField = new PropertyField(testProperty); - this.Q()?.RemoveFromHierarchy(); - this.Add(propertyField); - - }; - } - - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta deleted file mode 100644 index bced887..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/PropertyFieldItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 98769c8b285d438197820fa366568fee -timeCreated: 1657280625 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs deleted file mode 100644 index a065a9a..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using TNode.Attribute; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector.InspectorImplementation{ - [Obsolete] - /// - /// Force these element to bind native c# property - /// - [ViewComponent] - public class StringFieldItem:InspectorItem{ - public StringFieldItem():base(){ - CreateBindable(new TextField()); - } - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs.meta deleted file mode 100644 index c837e6d..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/StringFieldItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6b4f88e6c094449280ba5e38cb508287 -timeCreated: 1656143219 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs deleted file mode 100644 index 41c0328..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using TNode.Attribute; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector.InspectorImplementation{ - [Obsolete] - [ViewComponent] - public class ToggleFieldItem:InspectorItem{ - public ToggleFieldItem(){ - CreateBindable(new Toggle()); - } - - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs.meta b/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs.meta deleted file mode 100644 index 7ab36a8..0000000 --- a/TNode/Editor/Inspector/InspectorImplementation/ToggleFieldItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: d009d4819d604971976932b1d8f40bad -timeCreated: 1656580623 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorItem.cs b/TNode/Editor/Inspector/InspectorItem.cs deleted file mode 100644 index 1575c7c..0000000 --- a/TNode/Editor/Inspector/InspectorItem.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using TNode.BaseViews; -using TNode.Models; -using UnityEngine; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector{ - [Obsolete] - public abstract class InspectorItem:VisualElement,INodeDataBinding { - protected NodeData _bindingNodeData; - protected string _bindingFieldName; - protected BaseField Bindable; - protected event System.Action OnDataChanged; - - public string BindingPath{ - get => _bindingFieldName; - set{ - _bindingFieldName = value; - if(_bindingFieldName!=null&&_bindingNodeData!=null){ - OnDataChanged?.Invoke(); - } - } - } - - public NodeData BindingNodeData{ - get => _bindingNodeData; - set{ - var oldWrapper = ((NodeDataWrapper) _bindingNodeData); - if(oldWrapper!=null){ - oldWrapper.OnValueChanged -= OnNodeDataValueChanged; - } - _bindingNodeData = value; - if(_bindingFieldName!=null&&_bindingNodeData!=null){ - OnDataChanged?.Invoke(); - } - if(_bindingNodeData!=null) - ((NodeDataWrapper) _bindingNodeData).OnValueChanged += OnNodeDataValueChanged; - } - } - - private T GetValue(){ - - var fieldInfo = _bindingNodeData.GetType().GetField(BindingPath, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - if (fieldInfo == null){ - throw new Exception("Null field info"); - } - if (fieldInfo.FieldType == typeof(T)){ - return (T)fieldInfo.GetValue(BindingNodeData); - } - - if (fieldInfo.FieldType.IsEnum){ - return (T)fieldInfo.GetValue(BindingNodeData); - } - Debug.LogError("Wrong Type for current node data"); - return default; - } - - protected T Value => GetValue(); - - protected void SetValue(T value){ - NodeDataWrapper wrapper = _bindingNodeData; - wrapper.SetValue(BindingPath,value); - } - public InspectorItem(){ - - OnDataChanged+= OnDataChangedHandler; - } - /* - * e => { - SetValue(e.newValue); - } - */ - private void OnInspectorItemValueChanged(ChangeEvent e){ - SetValue(e.newValue); - } - - public void CreateBindable(BaseField bindable){ - if (Bindable != null){ - Bindable.Clear(); - Bindable.UnregisterValueChangedCallback(OnInspectorItemValueChanged); - } - Bindable = bindable; - Add(Bindable); - Bindable?.RegisterValueChangedCallback(OnInspectorItemValueChanged); - } - private void OnDataChangedHandler(){ - Bindable = this.Q>(); - if(Bindable!= null){ - Bindable.value = Value; - Bindable.label = BindingPath; - } - } - - private void OnNodeDataValueChanged(NodeDataWrapper wrapper){ - var value = (T) wrapper.GetValue(BindingPath) ; - if(Bindable!=null){ - Bindable.value = value; - } - } - - ~InspectorItem(){ - OnDataChanged-= OnDataChangedHandler; - } - } -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorItem.cs.meta b/TNode/Editor/Inspector/InspectorItem.cs.meta deleted file mode 100644 index 9008d3f..0000000 --- a/TNode/Editor/Inspector/InspectorItem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 82902f281e4642f2be8b742866d38839 -timeCreated: 1656126272 \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs b/TNode/Editor/Inspector/InspectorItemFactory.cs deleted file mode 100644 index 4a97483..0000000 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using TNode.Cache; -using TNode.Editor.Inspector.InspectorImplementation; -using Unity.VisualScripting; -using UnityEditor; -using UnityEngine; -using UnityEngine.UIElements; - -namespace TNode.Editor.Inspector{ - [Obsolete] - public class InspectorItemFactory{ - - public InspectorItem Create(){ - //Check type of GraphDataType - var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent>(); - - if (hasSpecificType){ - return NodeEditorExtensions.CreateViewComponentFromBaseType>(); - } - - if (typeof(T).IsEnum){ - - return NodeEditorExtensions.CreateViewComponentFromBaseType(typeof(InspectorItem)) as InspectorItem; - } - return null; - } - - public INodeDataBindingBase Create(Type t){ - var genericType = typeof(InspectorItem<>).MakeGenericType(t); - var hasSpecificType = NodeEditorExtensions.HasSpecificTypeComponent(genericType); - - if (hasSpecificType){ - return NodeEditorExtensions.CreateViewComponentFromBaseType(genericType) as INodeDataBindingBase; - } - - if (t.IsEnum){ - - return NodeEditorExtensions.CreateViewComponentFromBaseType(typeof(InspectorItem)) as INodeDataBindingBase; - } - return null; - } - - } -} - \ No newline at end of file diff --git a/TNode/Editor/Inspector/InspectorItemFactory.cs.meta b/TNode/Editor/Inspector/InspectorItemFactory.cs.meta deleted file mode 100644 index f9838bb..0000000 --- a/TNode/Editor/Inspector/InspectorItemFactory.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 83b9e37f79cf4a18b265e3e22e7e3ced -timeCreated: 1656142463 \ No newline at end of file diff --git a/TNode/Editor/Inspector/MonoScriptInspector.cs b/TNode/Editor/Inspector/MonoScriptInspector.cs deleted file mode 100644 index a06049a..0000000 --- a/TNode/Editor/Inspector/MonoScriptInspector.cs +++ /dev/null @@ -1,16 +0,0 @@ -using UnityEditor; -using UnityEditor.AssetImporters; -using UnityEngine; - -namespace TNode.Editor.Inspector{ - // [CustomEditor(typeof(MonoImporter))] - // public class MonoScriptInspector:AssetImporterEditor{ - // public override void OnInspectorGUI(){ - // base.OnInspectorGUI(); - // if(GUILayout.Button("Open")){ - // EditorUtility.OpenWithDefaultApp(AssetDatabase.GetAssetPath(target)); - // } - // } - // } - // -} \ No newline at end of file diff --git a/TNode/Editor/Inspector/MonoScriptInspector.cs.meta b/TNode/Editor/Inspector/MonoScriptInspector.cs.meta deleted file mode 100644 index 9441899..0000000 --- a/TNode/Editor/Inspector/MonoScriptInspector.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 192a51f6578144c5bbddb5cf77685c71 -timeCreated: 1656214219 \ No newline at end of file diff --git a/TNode/Editor/Inspector/PropertyDrawer.meta b/TNode/Editor/Inspector/PropertyDrawer.meta deleted file mode 100644 index 196eeba..0000000 --- a/TNode/Editor/Inspector/PropertyDrawer.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: cc8c20a304714599959643305857c804 -timeCreated: 1657486909 \ No newline at end of file diff --git a/TNode/Editor/Manipulators.meta b/TNode/Editor/Manipulators.meta deleted file mode 100644 index f9c9614..0000000 --- a/TNode/Editor/Manipulators.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 400542f3cec140e2b55e2bcf637b2d9b -timeCreated: 1657009018 \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView.meta b/TNode/Editor/NodeGraphView.meta new file mode 100644 index 0000000..007e02c --- /dev/null +++ b/TNode/Editor/NodeGraphView.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9e377285943b43278ea539231483fe6f +timeCreated: 1657683945 \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs new file mode 100644 index 0000000..e851505 --- /dev/null +++ b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs @@ -0,0 +1,11 @@ +using TNode.Models; +using UnityEngine; + +namespace TNode.Editor.NodeGraphView{ + public interface IBaseDataGraphView{ + public void AddTNode(NodeData nodeData, Rect rect); + public void RemoveTNode(NodeData nodeData); + + public BlackboardData GetBlackboardData(); + } +} \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs.meta b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs.meta new file mode 100644 index 0000000..fada334 --- /dev/null +++ b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9839105141d14b3aac3891bcaaa3fe50 +timeCreated: 1657684189 \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView/IDataGraphView.cs b/TNode/Editor/NodeGraphView/IDataGraphView.cs new file mode 100644 index 0000000..db2d69b --- /dev/null +++ b/TNode/Editor/NodeGraphView/IDataGraphView.cs @@ -0,0 +1,7 @@ +using TNode.Models; + +namespace TNode.Editor.NodeGraphView{ + public interface IDataGraphView : IBaseDataGraphView where T:GraphData{ + + } +} \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView/IDataGraphView.cs.meta b/TNode/Editor/NodeGraphView/IDataGraphView.cs.meta new file mode 100644 index 0000000..9b4ddd6 --- /dev/null +++ b/TNode/Editor/NodeGraphView/IDataGraphView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b0f8421124864a7d993bcbfb419987dd +timeCreated: 1657684182 \ No newline at end of file diff --git a/TNode/Editor/NodeViews/DefaultNodeView.cs b/TNode/Editor/NodeViews/DefaultNodeView.cs deleted file mode 100644 index 10f4713..0000000 --- a/TNode/Editor/NodeViews/DefaultNodeView.cs +++ /dev/null @@ -1,11 +0,0 @@ -using TNode.BaseViews; -using TNode.Editor.BaseViews; -using TNode.Models; - -namespace TNode.Editor{ - - - public class DefaultNodeView:NodeView{ - - } -} \ No newline at end of file diff --git a/TNodeGraphViewImpl.meta b/TNodeGraphViewImpl.meta new file mode 100644 index 0000000..b9e7a1d --- /dev/null +++ b/TNodeGraphViewImpl.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 792d2c6b4dca441981787b922b385f0a +timeCreated: 1657684260 \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor.meta b/TNodeGraphViewImpl/Editor.meta new file mode 100644 index 0000000..dabd39a --- /dev/null +++ b/TNodeGraphViewImpl/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1e6ee4cc74d84496a099ac0624bda536 +timeCreated: 1657684324 \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard.meta similarity index 100% rename from TNode/Editor/GraphBlackboard.meta rename to TNodeGraphViewImpl/Editor/GraphBlackboard.meta diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs new file mode 100644 index 0000000..93470ef --- /dev/null +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs @@ -0,0 +1,12 @@ +using UnityEditor.Experimental.GraphView; + +namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ + public class BlackboardPropertyField:BlackboardField{ + public BlackboardProperty.BlackboardProperty BlackboardProperty; + public BlackboardPropertyField(BlackboardProperty.BlackboardProperty blackboardProperty):base(null,blackboardProperty.PropertyName,null){ + BlackboardProperty = blackboardProperty; + } + + + } +} \ No newline at end of file diff --git a/TNode/Editor/GraphBlackboard/BlackboardField.cs.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/BlackboardField.cs.meta rename to TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardField.cs.meta diff --git a/TNode/Editor/GraphBlackboard/BlackboardProperty.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/BlackboardProperty.meta rename to TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty.meta diff --git a/TNode/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs similarity index 85% rename from TNode/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs rename to TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs index d7dff1a..eaa5f89 100644 --- a/TNode/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs @@ -1,6 +1,6 @@ using System; -namespace TNode.Editor.GraphBlackboard{ +namespace TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty{ public class BlackboardProperty{ public string PropertyName; public Type PropertyType; diff --git a/TNode/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs.meta rename to TNodeGraphViewImpl/Editor/GraphBlackboard/BlackboardProperty/BlackboardProperty.cs.meta diff --git a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs similarity index 86% rename from TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs rename to TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index 26c98c2..2ed561f 100644 --- a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -1,7 +1,7 @@ using TNode.Attribute; using TNode.Models; -namespace TNode.Editor.GraphBlackboard{ +namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ [ViewComponent] public class DefaultGraphBlackboardView:GraphBlackboardView{ public DefaultGraphBlackboardView(){ diff --git a/TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta rename to TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs.meta diff --git a/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs similarity index 87% rename from TNode/Editor/GraphBlackboard/GraphBlackboardView.cs rename to TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs index a59ce41..05fe3f5 100644 --- a/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs @@ -1,7 +1,7 @@ using TNode.Models; using UnityEditor.Experimental.GraphView; -namespace TNode.Editor.GraphBlackboard{ +namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ /// /// Implement this class to create graph black board for specified graph /// diff --git a/TNode/Editor/GraphBlackboard/GraphBlackboardView.cs.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs.meta similarity index 100% rename from TNode/Editor/GraphBlackboard/GraphBlackboardView.cs.meta rename to TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs.meta diff --git a/TNodeGraphViewImpl/Editor/Inspector.meta b/TNodeGraphViewImpl/Editor/Inspector.meta new file mode 100644 index 0000000..11bcf1a --- /dev/null +++ b/TNodeGraphViewImpl/Editor/Inspector.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 152e46659fee4d2fb09bc06f18d54c98 +timeCreated: 1657684641 \ No newline at end of file diff --git a/TNode/Editor/Inspector/NodeInspector.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs similarity index 61% rename from TNode/Editor/Inspector/NodeInspector.cs rename to TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs index 1d2c516..0367625 100644 --- a/TNode/Editor/Inspector/NodeInspector.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Reflection; using TNode.Attribute; -using TNode.BaseViews; -using TNode.Editor.BaseViews; +using TNode.Editor.NodeViews; using TNode.Models; +using TNodeGraphViewImpl.Editor.NodeGraphView; using Unity.VisualScripting; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -24,7 +24,7 @@ namespace TNode.Editor.Inspector{ } } - public INodeView NodeView; + public IBaseNodeView BaseNodeView; private void UpdateData(){ Debug.Log(_data); if (_data != null){ @@ -46,18 +46,18 @@ namespace TNode.Editor.Inspector{ var body = this.Q("InspectorBody"); body.Clear(); body.StretchToParentSize(); - foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ - var bindingPath = field.Name; - var type = field.FieldType; - InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); - //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection - var createdItem = inspectorItemFactory.Create(type); - if (createdItem is { } castedItem){ - castedItem.BindingNodeData = _data; - castedItem.BindingPath = bindingPath; - } - Add((VisualElement)createdItem); - } + // foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ + // var bindingPath = field.Name; + // var type = field.FieldType; + // InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); + // //Invoke generic function Create<> of default inspector item factory to create an inspector item of appropriate type by reflection + // var createdItem = inspectorItemFactory.Create(type); + // if (createdItem is { } castedItem){ + // castedItem.BindingNodeData = _data; + // castedItem.BindingPath = bindingPath; + // } + // Add((VisualElement)createdItem); + // } } } } \ No newline at end of file diff --git a/TNode/Editor/Inspector/NodeInspector.cs.meta b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs.meta similarity index 100% rename from TNode/Editor/Inspector/NodeInspector.cs.meta rename to TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs.meta diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs similarity index 67% rename from TNode/Editor/Inspector/NodeInspectorInNode.cs rename to TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs index 8a0bc88..de375a1 100644 --- a/TNode/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs @@ -40,9 +40,6 @@ namespace TNode.Editor.Inspector{ if (_data.GetType().IsSubclassOf(typeof(BlackboardDragNodeData<>))){ return; } - - - var serializedObject = new SerializedObject((NodeDataWrapper)_data); foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public|BindingFlags.NonPublic)){ //Create corresponding property field @@ -53,28 +50,8 @@ namespace TNode.Editor.Inspector{ var drawer = new PropertyField(serializedObject.FindProperty("Data").FindPropertyRelative(field.Name),field.Name); Debug.Log(serializedObject.FindProperty("Data")); drawer.Bind(serializedObject); - Add(drawer); } } - - private void RefreshItems(){ - InspectorItemFactory inspectorItemFactory = new InspectorItemFactory(); - foreach (var field in _data.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)){ - var bindingPath = field.Name; - var type = field.FieldType; - //check if the field has ShowInNodeView attribute - var showInNodeViewAttribute = field.GetCustomAttribute() != null; - if (!showInNodeViewAttribute) - continue; - var createdItem = inspectorItemFactory.Create(type); - if (createdItem is{ } castedItem){ - castedItem.BindingNodeData = _data; - castedItem.BindingPath = bindingPath; - } - - Add((VisualElement) createdItem); - } - } } } \ No newline at end of file diff --git a/TNode/Editor/Inspector/NodeInspectorInNode.cs.meta b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs.meta similarity index 100% rename from TNode/Editor/Inspector/NodeInspectorInNode.cs.meta rename to TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs.meta diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView.meta b/TNodeGraphViewImpl/Editor/NodeGraphView.meta new file mode 100644 index 0000000..eb09718 --- /dev/null +++ b/TNodeGraphViewImpl/Editor/NodeGraphView.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 509019c594fa494dba98f9910092b63e +timeCreated: 1657684502 \ No newline at end of file diff --git a/TNode/Editor/BaseViews/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs similarity index 74% rename from TNode/Editor/BaseViews/DataGraphView.cs rename to TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index ff2decd..bcc280c 100644 --- a/TNode/Editor/BaseViews/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -3,116 +3,25 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; -using TNode.BaseViews; using TNode.Cache; -using TNode.Editor.GraphBlackboard; +using TNode.Editor; using TNode.Editor.Inspector; using TNode.Editor.Model; +using TNode.Editor.NodeGraphView; +using TNode.Editor.NodeViews; using TNode.Editor.Search; using TNode.Editor.Tools.NodeCreator; using TNode.Models; -using Unity.VisualScripting; +using TNodeGraphViewImpl.Editor.GraphBlackboard; +using TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; using Edge = UnityEditor.Experimental.GraphView.Edge; -namespace TNode.Editor.BaseViews{ - /* - public class DialogueGraphView : DataGraphView{ - public Action onNodeAdded; - public Action onNodeSelected; - public Action onNodeRemoved; - public Action onNodeUnselected; - // public DialogueGraphView(DialogueGraph graph):base(){ - // this.Data = graph; - // - // //Set background to a bit of darker - // - // - // //Register a data context change callback - // - // } - - public override void OnGraphViewCreate(){ - AddNode(GenerateEntryPoint()); - RegisterCallback(evt => { - var pos = evt.mousePosition; - - evt.menu.AppendAction("Add NodeAttribute", (dropMenuAction) => { - DialogueNodeView nodeView = new DialogueNodeView{ - GUID = Guid.NewGuid().ToString(), - title = "New NodeAttribute" - }; - // make it a 200x100 box - nodeView.SetPosition(new Rect(pos.x - 100, pos.y - 50, 200, 100)); - - - AddNode(nodeView); - }, DropdownMenuAction.AlwaysEnabled); - }); - this.OnDataChanged += OnOnDataChanged; - } - private void OnOnDataChanged(object sender, DataChangedEventArgs e){ - //clean all nodes from the graphview - foreach (var graphViewNode in nodes){ - RemoveElement(graphViewNode); - } - - foreach (var edge in edges){ - RemoveElement(edge); - } - //add all nodes from the new graph - foreach (var node in e.NewData.nodes){ - //AddNode(node); - } - } - - public void AddNode(DialogueNodeData dialogueNodeData){ - var res = InstantiateFromDialogueNodeData(dialogueNodeData); - AddNode(res); - } - public void AddNode(DialogueNodeView nodeView){ - AddElement(nodeView); - onNodeAdded?.Invoke(nodeView); - //Register nodeView selection callback - nodeView.RegisterCallback(evt => { - if (evt.clickCount == 1){ - onNodeSelected?.Invoke(nodeView); - } - }); - nodeView.OnUnselect += () => { onNodeUnselected?.Invoke(nodeView); }; - } - - public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter) => this.ports.ToList() - .Where(x => x != startPort && - x.direction != startPort.direction).ToList(); - - public DialogueNodeView GenerateEntryPoint(){ - var entryPoint = new DialogueNodeView{ - title = "Entry Point", - GUID = Guid.NewGuid().ToString(), - EntryPoint = true - }; - //Add output port to the nodeView - entryPoint.AddPort(Orientation.Horizontal, Direction.Output, "Next"); - //Set nodeView position to top center side of screen - entryPoint.SetPosition(new Rect(this.layout.width / 2 - 100, 0, 200, 200)); - return entryPoint; - } - protected DialogueNodeView InstantiateFromDialogueNodeData(DialogueNodeData dialogueNodeData){ - var node = new DialogueNodeView(); - node.title = dialogueNodeData.nodeName; - node.GUID = Guid.NewGuid().ToString(); - //TODO:after completing the separation of the node data and the node editor data,this should be switch to the node editor data - //node.SetPosition(dialogueNodeData.rect); - this.AddNode(node); - return node; - } - } - */ - public abstract class DataGraphView:GraphView,IDataGraphView where T:GraphData{ +namespace TNodeGraphViewImpl.Editor.NodeGraphView{ + public abstract class BaseDataGraphView:GraphView,IBaseDataGraphView where T:GraphData{ #region variables and properties private T _data; private bool _isInspectorOn; @@ -138,11 +47,11 @@ namespace TNode.Editor.BaseViews{ #endregion - //A Constructor for the DataGraphView ,never to override it + //A Constructor for the BaseDataGraphView ,never to override it #region construct default behaviour - public DataGraphView(){ + public BaseDataGraphView(){ styleSheets.Add(Resources.Load("GraphViewBackground")); var grid = new GridBackground(); Insert(0,grid); @@ -350,7 +259,7 @@ namespace TNode.Editor.BaseViews{ var nodeEditorData = new GraphElementEditorData{ pos = node.GetPosition(), }; - if (node is INodeView nodeView){ + if (node is IBaseNodeView nodeView){ nodeEditorData.guid = nodeView.GetNodeData().id; } graphEditorData.graphElementsData.Add(nodeEditorData); @@ -366,7 +275,7 @@ namespace TNode.Editor.BaseViews{ private void SaveNode(){ foreach (var node in nodes){ - if (node is INodeView nodeView){ + if (node is IBaseNodeView nodeView){ var nodeData = nodeView.GetNodeData(); if (!_data.NodeDictionary.ContainsKey(nodeData.id)){ _data.NodeDictionary.Add(nodeData.id, nodeData); @@ -377,8 +286,8 @@ namespace TNode.Editor.BaseViews{ private void SaveEdge(){ var links = new List(); foreach (var edge in edges){ - var inputNode = edge.input.node as INodeView; - var outputNode = edge.output.node as INodeView; + var inputNode = edge.input.node as IBaseNodeView; + var outputNode = edge.output.node as IBaseNodeView; if (inputNode != null && outputNode != null){ var inputNodeData = inputNode.GetNodeData(); var outputNodeData = outputNode.GetNodeData(); @@ -417,7 +326,7 @@ namespace TNode.Editor.BaseViews{ public virtual void OnGraphViewDestroy(){ } - ~DataGraphView(){ + ~BaseDataGraphView(){ OnGraphViewDestroy(); } @@ -434,11 +343,11 @@ namespace TNode.Editor.BaseViews{ if (evt.clickCount == 1){ if (_isInspectorOn){ _nodeInspector.Data = nodeData; - _nodeInspector.NodeView = nodeView as INodeView; + _nodeInspector.BaseNodeView = nodeView as IBaseNodeView; } } }); - if(nodeView is INodeView nodeViewInterface){ + if(nodeView is IBaseNodeView nodeViewInterface){ nodeViewInterface.SetNodeData(nodeData); } _nodeDict.Add(nodeData.id, nodeView); @@ -448,7 +357,7 @@ namespace TNode.Editor.BaseViews{ var menu = new GenericMenu(); menu.AddItem(new GUIContent("Delete"), false, () => { RemoveElement(nodeView); - if (nodeView is INodeView tNodeView){ + if (nodeView is IBaseNodeView tNodeView){ RemoveTNode(tNodeView.GetNodeData()); } }); @@ -477,12 +386,6 @@ namespace TNode.Editor.BaseViews{ } } - public interface IDataGraphView{ - public void AddTNode(NodeData nodeData, Rect rect); - public void RemoveTNode(NodeData nodeData); - - public BlackboardData GetBlackboardData(); - } public class DataChangedEventArgs{ public DataChangedEventArgs(T data){ diff --git a/TNode/Editor/BaseViews/DataGraphView.cs.meta b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs.meta similarity index 100% rename from TNode/Editor/BaseViews/DataGraphView.cs.meta rename to TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs.meta diff --git a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs similarity index 97% rename from TNode/Editor/BaseViews/SimpleGraphSubWindow.cs rename to TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs index da03952..da69ff1 100644 --- a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs @@ -5,7 +5,7 @@ using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine.UIElements; -namespace TNode.BaseViews{ +namespace TNodeGraphViewImpl.Editor.NodeGraphView{ public class SimpleGraphSubWindow:GraphElement,IGraphViewPersistence{ private readonly Dragger _dragger = new Dragger(); diff --git a/TNode/Editor/BaseViews/SimpleGraphSubWindow.cs.meta b/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs.meta similarity index 100% rename from TNode/Editor/BaseViews/SimpleGraphSubWindow.cs.meta rename to TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs.meta diff --git a/TNode/Editor/NodeViews.meta b/TNodeGraphViewImpl/Editor/NodeViews.meta similarity index 100% rename from TNode/Editor/NodeViews.meta rename to TNodeGraphViewImpl/Editor/NodeViews.meta diff --git a/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs new file mode 100644 index 0000000..caec25e --- /dev/null +++ b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs @@ -0,0 +1,10 @@ +using TNode.Editor.NodeViews; +using TNode.Models; + +namespace TNode.Editor{ + + + public class DefaultBaseNodeView:BaseNodeView{ + + } +} \ No newline at end of file diff --git a/TNode/Editor/NodeViews/DefaultNodeView.cs.meta b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs.meta similarity index 100% rename from TNode/Editor/NodeViews/DefaultNodeView.cs.meta rename to TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs.meta diff --git a/TNode/Editor/NodeViews/DragNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs similarity index 65% rename from TNode/Editor/NodeViews/DragNodeView.cs rename to TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs index 5502fcc..dbcd21c 100644 --- a/TNode/Editor/NodeViews/DragNodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs @@ -1,11 +1,10 @@ using TNode.Attribute; -using TNode.Editor.BaseViews; using TNode.Models; namespace TNode.Editor.NodeViews{ [ViewComponent] - public class DragNodeView:NodeView>{ - public DragNodeView() : base(){ + public class DragBaseNodeView:BaseNodeView>{ + public DragBaseNodeView() : base(){ //Make capsule like style this.titleContainer.visible = false; diff --git a/TNode/Editor/NodeViews/DragNodeView.cs.meta b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs.meta similarity index 100% rename from TNode/Editor/NodeViews/DragNodeView.cs.meta rename to TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs.meta diff --git a/TNode/Editor/NodeViews/NodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs similarity index 94% rename from TNode/Editor/NodeViews/NodeView.cs rename to TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs index 0079cb6..5cdc716 100644 --- a/TNode/Editor/NodeViews/NodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs @@ -5,17 +5,13 @@ using TNode.Attribute; using TNode.Attribute.Ports; using TNode.Editor.Inspector; using TNode.Models; -using UnityEditor; using UnityEditor.Experimental.GraphView; -using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; -namespace TNode.Editor.BaseViews{ +namespace TNode.Editor.NodeViews{ - //A NodeAttribute monitor some type of node in the graph - - public abstract class NodeView : Node,INodeView where T:NodeData,new(){ + public abstract class BaseNodeView : Node,INodeView where T:NodeData,new(){ protected T _data; private readonly NodeInspectorInNode _nodeInspectorInNode; @@ -42,7 +38,7 @@ namespace TNode.Editor.BaseViews{ } public event System.Action OnDataChanged; - protected NodeView(){ + protected BaseNodeView(){ OnDataChanged+=OnDataChangedHandler; _nodeInspectorInNode = new NodeInspectorInNode(){ @@ -69,10 +65,8 @@ namespace TNode.Editor.BaseViews{ switch (portAttribute.NameHandling){ case PortNameHandling.Auto: return portAttribute.Name.Trim(' ').Length>0?portAttribute.Name:propertyInfo.Name; - break; case PortNameHandling.Manual: return portAttribute.Name; - break; case PortNameHandling.MemberName: return propertyInfo.Name; case PortNameHandling.Format: @@ -169,11 +163,15 @@ namespace TNode.Editor.BaseViews{ } } - public interface INodeView{ + public interface IBaseNodeView{ public void SetNodeData(NodeData nodeData); public NodeData GetNodeData(); - public void OnDataModified(); } + + public interface INodeView:IBaseNodeView where T:NodeData,new(){ + public T Data{ get; set; } + + } } \ No newline at end of file diff --git a/TNode/Editor/NodeViews/NodeView.cs.meta b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs.meta similarity index 100% rename from TNode/Editor/NodeViews/NodeView.cs.meta rename to TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs.meta diff --git a/TNode/Editor/Search.meta b/TNodeGraphViewImpl/Editor/Search.meta similarity index 100% rename from TNode/Editor/Search.meta rename to TNodeGraphViewImpl/Editor/Search.meta diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs similarity index 93% rename from TNode/Editor/Search/BlackboardSearchWindowProvider.cs rename to TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs index dfec7a4..ac91d2e 100644 --- a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; -using TNode.Editor.BaseViews; +using TNode.Editor.NodeGraphView; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; @@ -9,7 +9,7 @@ using UnityEngine; namespace TNode.Editor.Search{ public class BlackboardSearchWindowProvider:ScriptableObject,ISearchWindowProvider{ private Type _graphType; - private IDataGraphView _graphView; + private IBaseDataGraphView _graphView; private EditorWindow _editor; private struct InternalSearchTreeUserData{ @@ -60,7 +60,7 @@ namespace TNode.Editor.Search{ return false; } - public void Setup(Type graph,IDataGraphView graphView,EditorWindow editor){ + public void Setup(Type graph,IBaseDataGraphView graphView,EditorWindow editor){ _graphType = graph; _graphView = graphView; _editor = editor; diff --git a/TNode/Editor/Search/BlackboardSearchWindowProvider.cs.meta b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs.meta similarity index 100% rename from TNode/Editor/Search/BlackboardSearchWindowProvider.cs.meta rename to TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs.meta diff --git a/TNode/Editor/Search/NodeSearchWindowProvider.cs b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs similarity index 93% rename from TNode/Editor/Search/NodeSearchWindowProvider.cs rename to TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs index 55ec5ff..058d07b 100644 --- a/TNode/Editor/Search/NodeSearchWindowProvider.cs +++ b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using TNode.Cache; -using TNode.Editor.BaseViews; +using TNode.Editor.NodeGraphView; using TNode.Editor.Tools.NodeCreator; using TNode.Models; using UnityEditor; @@ -48,7 +48,7 @@ namespace TNode.Editor.Search{ //Make an instance of the type if (NodeCreator.InstantiateNodeData(type) is { } nodeData){ nodeData.nodeName = $"New {type.Name}"; - ((IDataGraphView) _graphView).AddTNode(nodeData, new Rect(localPos.x, localPos.y, 100, 100)); + ((IBaseDataGraphView) _graphView).AddTNode(nodeData, new Rect(localPos.x, localPos.y, 100, 100)); } } return true; diff --git a/TNode/Editor/Search/NodeSearchWindowProvider.cs.meta b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs.meta similarity index 100% rename from TNode/Editor/Search/NodeSearchWindowProvider.cs.meta rename to TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs.meta From fb2ee29c5a35efd6ca9ad82a339d9a78df2d63b5 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Wed, 13 Jul 2022 12:23:29 +0800 Subject: [PATCH 08/17] refactor: again refactor this --- TNode/Editor/Blackboard.meta | 3 +++ TNode/Editor/Blackboard/IBlackboardView.cs | 7 +++++++ TNode/Editor/Blackboard/IBlackboardView.cs.meta | 3 +++ TNode/Editor/NodeGraphView/IBaseDataGraphView.cs | 4 +++- TNode/Editor/NodeGraphView/IDataGraphView.cs | 2 +- .../Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs | 1 - .../GraphEditorCreator/SourceGeneratorForGraphEditor.cs | 7 +------ {TNode => TNodeGraphViewImpl}/Editor/Cache.meta | 0 .../Editor/Cache/NodeEditorExtensions.cs | 4 +--- .../Editor/Cache/NodeEditorExtensions.cs.meta | 0 {TNode => TNodeGraphViewImpl}/Editor/GraphEditor.cs | 2 +- {TNode => TNodeGraphViewImpl}/Editor/GraphEditor.cs.meta | 0 TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs | 4 ++-- .../Editor/Search/NodeSearchWindowProvider.cs | 2 +- 14 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 TNode/Editor/Blackboard.meta create mode 100644 TNode/Editor/Blackboard/IBlackboardView.cs create mode 100644 TNode/Editor/Blackboard/IBlackboardView.cs.meta rename {TNode => TNodeGraphViewImpl}/Editor/Cache.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/Cache/NodeEditorExtensions.cs (99%) rename {TNode => TNodeGraphViewImpl}/Editor/Cache/NodeEditorExtensions.cs.meta (100%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphEditor.cs (98%) rename {TNode => TNodeGraphViewImpl}/Editor/GraphEditor.cs.meta (100%) diff --git a/TNode/Editor/Blackboard.meta b/TNode/Editor/Blackboard.meta new file mode 100644 index 0000000..ab8049d --- /dev/null +++ b/TNode/Editor/Blackboard.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bf3b6f6e73b647e2a5421f482a0b0e8f +timeCreated: 1657686050 \ No newline at end of file diff --git a/TNode/Editor/Blackboard/IBlackboardView.cs b/TNode/Editor/Blackboard/IBlackboardView.cs new file mode 100644 index 0000000..6a7e0f0 --- /dev/null +++ b/TNode/Editor/Blackboard/IBlackboardView.cs @@ -0,0 +1,7 @@ +namespace TNode.Editor.Blackboard{ + public interface IBlackboardView{ + public void AddData(){ + + } + } +} \ No newline at end of file diff --git a/TNode/Editor/Blackboard/IBlackboardView.cs.meta b/TNode/Editor/Blackboard/IBlackboardView.cs.meta new file mode 100644 index 0000000..d57a0dd --- /dev/null +++ b/TNode/Editor/Blackboard/IBlackboardView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9c618ca8a5b0444284489b8a1942af91 +timeCreated: 1657686059 \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs index e851505..4800d8b 100644 --- a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs +++ b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs @@ -5,7 +5,9 @@ namespace TNode.Editor.NodeGraphView{ public interface IBaseDataGraphView{ public void AddTNode(NodeData nodeData, Rect rect); public void RemoveTNode(NodeData nodeData); - + public BlackboardData GetBlackboardData(); + + } } \ No newline at end of file diff --git a/TNode/Editor/NodeGraphView/IDataGraphView.cs b/TNode/Editor/NodeGraphView/IDataGraphView.cs index db2d69b..e0ed67b 100644 --- a/TNode/Editor/NodeGraphView/IDataGraphView.cs +++ b/TNode/Editor/NodeGraphView/IDataGraphView.cs @@ -2,6 +2,6 @@ namespace TNode.Editor.NodeGraphView{ public interface IDataGraphView : IBaseDataGraphView where T:GraphData{ - + public T Data{ get; set; } } } \ No newline at end of file diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs index 1248939..145792a 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs +++ b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs @@ -1,6 +1,5 @@ using System.IO; using System.Text.RegularExpressions; -using TNode.Editor.Model; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; diff --git a/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs b/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs index 8e4eeae..7529026 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs +++ b/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Text.RegularExpressions; -using Microsoft.CodeAnalysis; +using System.Text.RegularExpressions; using UnityEngine; namespace TNode.Editor.Tools.GraphEditorCreator{ diff --git a/TNode/Editor/Cache.meta b/TNodeGraphViewImpl/Editor/Cache.meta similarity index 100% rename from TNode/Editor/Cache.meta rename to TNodeGraphViewImpl/Editor/Cache.meta diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs similarity index 99% rename from TNode/Editor/Cache/NodeEditorExtensions.cs rename to TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs index 4f2de04..856f0c1 100644 --- a/TNode/Editor/Cache/NodeEditorExtensions.cs +++ b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs @@ -3,16 +3,14 @@ using System.Collections.Generic; using System.Linq; using TNode.Attribute; using TNode.Editor; -using TNode.Editor.Inspector; using TNode.Editor.NodeViews; using TNode.Models; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.NodeGraphView; using UnityEditor.Experimental.GraphView; using UnityEngine; -using UnityEngine.TestTools.Utils; -namespace TNode.Cache{ +namespace TNodeGraphViewImpl.Editor.Cache{ /// /// Internal singleton class for caching TNode reflection Data. /// diff --git a/TNode/Editor/Cache/NodeEditorExtensions.cs.meta b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs.meta similarity index 100% rename from TNode/Editor/Cache/NodeEditorExtensions.cs.meta rename to TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs.meta diff --git a/TNode/Editor/GraphEditor.cs b/TNodeGraphViewImpl/Editor/GraphEditor.cs similarity index 98% rename from TNode/Editor/GraphEditor.cs rename to TNodeGraphViewImpl/Editor/GraphEditor.cs index 93a272e..59c4b11 100644 --- a/TNode/Editor/GraphEditor.cs +++ b/TNodeGraphViewImpl/Editor/GraphEditor.cs @@ -1,8 +1,8 @@ using Codice.CM.Common; -using TNode.Cache; using TNode.Editor.Inspector; using TNode.Editor.Model; using TNode.Models; +using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.NodeGraphView; using UnityEditor; using UnityEditor.Experimental.GraphView; diff --git a/TNode/Editor/GraphEditor.cs.meta b/TNodeGraphViewImpl/Editor/GraphEditor.cs.meta similarity index 100% rename from TNode/Editor/GraphEditor.cs.meta rename to TNodeGraphViewImpl/Editor/GraphEditor.cs.meta diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index bcc280c..0a46a2b 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; -using TNode.Cache; using TNode.Editor; using TNode.Editor.Inspector; using TNode.Editor.Model; @@ -12,6 +11,7 @@ using TNode.Editor.NodeViews; using TNode.Editor.Search; using TNode.Editor.Tools.NodeCreator; using TNode.Models; +using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty; using UnityEditor; @@ -21,7 +21,7 @@ using UnityEngine.UIElements; using Edge = UnityEditor.Experimental.GraphView.Edge; namespace TNodeGraphViewImpl.Editor.NodeGraphView{ - public abstract class BaseDataGraphView:GraphView,IBaseDataGraphView where T:GraphData{ + public abstract class BaseDataGraphView:GraphView,IDataGraphView where T:GraphData{ #region variables and properties private T _data; private bool _isInspectorOn; diff --git a/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs index 058d07b..5ef4ced 100644 --- a/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs +++ b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -using TNode.Cache; using TNode.Editor.NodeGraphView; using TNode.Editor.Tools.NodeCreator; using TNode.Models; +using TNodeGraphViewImpl.Editor.Cache; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; From 42e06765ea47bce5321fa97ad64b9e288bb62dc7 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Wed, 13 Jul 2022 13:21:41 +0800 Subject: [PATCH 09/17] feat:create search window at right position --- TNode/Editor/Blackboard/IBlackboardView.cs | 20 ++++-- .../EditorPersistence/GraphEditorData.cs | 5 +- .../GraphElementEditorData.cs | 4 +- .../NodeGraphView/IBaseDataGraphView.cs | 2 + .../GraphEditorCreator/GraphEditorCreator.cs | 1 + .../Editor/Cache/NodeEditorExtensions.cs | 9 +-- .../DefaultGraphBlackboardView.cs | 38 ++++++++--- .../GraphBlackboard/GraphBlackboardView.cs | 45 +++++++++++-- TNodeGraphViewImpl/Editor/GraphEditor.cs | 2 +- .../Editor/NodeGraphView/DataGraphView.cs | 66 ++++++++----------- 10 files changed, 124 insertions(+), 68 deletions(-) diff --git a/TNode/Editor/Blackboard/IBlackboardView.cs b/TNode/Editor/Blackboard/IBlackboardView.cs index 6a7e0f0..eca1cf9 100644 --- a/TNode/Editor/Blackboard/IBlackboardView.cs +++ b/TNode/Editor/Blackboard/IBlackboardView.cs @@ -1,7 +1,19 @@ -namespace TNode.Editor.Blackboard{ +using TNode.Editor.NodeGraphView; +using TNode.Models; +using UnityEditor; +using UnityEngine; + +namespace TNode.Editor.Blackboard{ public interface IBlackboardView{ - public void AddData(){ - - } + public BlackboardData GetBlackboardData(); + public void SetBlackboardData(BlackboardData data); + + public void AddItem(); + + void Setup(IBaseDataGraphView graphView,EditorWindow ownerWindow); + } + public interface IBlackboardView : IBlackboardView where T : BlackboardData{ + + public T Data{ get; set; } } } \ No newline at end of file diff --git a/TNode/Editor/EditorPersistence/GraphEditorData.cs b/TNode/Editor/EditorPersistence/GraphEditorData.cs index 02fc71c..9c64722 100644 --- a/TNode/Editor/EditorPersistence/GraphEditorData.cs +++ b/TNode/Editor/EditorPersistence/GraphEditorData.cs @@ -1,10 +1,7 @@ using System.Collections.Generic; -using TNode.Editor.EditorPersistence; -using TNode.Editor.Model; using UnityEngine; -using UnityEngine.Serialization; -namespace TNode.Editor{ +namespace TNode.Editor.EditorPersistence{ [CreateAssetMenu(fileName = "Graph Editor Data", menuName = "TNode/Graph Editor Data")] public class GraphEditorData:ScriptableObject{ diff --git a/TNode/Editor/EditorPersistence/GraphElementEditorData.cs b/TNode/Editor/EditorPersistence/GraphElementEditorData.cs index f21170d..6c8809a 100644 --- a/TNode/Editor/EditorPersistence/GraphElementEditorData.cs +++ b/TNode/Editor/EditorPersistence/GraphElementEditorData.cs @@ -1,9 +1,7 @@ using System; -using TNode.Models; using UnityEngine; -using UnityEngine.Serialization; -namespace TNode.Editor.Model{ +namespace TNode.Editor.EditorPersistence{ [Serializable] public class GraphElementEditorData{ diff --git a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs index 4800d8b..16289d0 100644 --- a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs +++ b/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs @@ -6,6 +6,8 @@ namespace TNode.Editor.NodeGraphView{ public void AddTNode(NodeData nodeData, Rect rect); public void RemoveTNode(NodeData nodeData); + public void CreateBlackboard(); + public GraphData GetGraphData(); public BlackboardData GetBlackboardData(); diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs index 145792a..13c2ed3 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs +++ b/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs @@ -1,5 +1,6 @@ using System.IO; using System.Text.RegularExpressions; +using TNode.Editor.EditorPersistence; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; diff --git a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs index 856f0c1..7624080 100644 --- a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs +++ b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using TNode.Attribute; using TNode.Editor; +using TNode.Editor.Blackboard; using TNode.Editor.NodeViews; using TNode.Models; using TNodeGraphViewImpl.Editor.GraphBlackboard; @@ -151,14 +152,14 @@ namespace TNodeGraphViewImpl.Editor.Cache{ return null; } - public static Blackboard CreateBlackboardDataFromBlackboardDataType(Type t){ + public static IBlackboardView CreateBlackboardDataFromBlackboardDataType(Type t){ var type = typeof(GraphBlackboardView<>).MakeGenericType(t); - var res = CreateViewComponentFromBaseType(type) as Blackboard; + var res = CreateViewComponentFromBaseType(type) as IBlackboardView; return res ?? new DefaultGraphBlackboardView(); } - public static Blackboard CreateBlackboardWithGraphData(GraphData graphData){ + public static IBlackboardView CreateBlackboardWithGraphData(GraphData graphData){ var graphType = graphData.GetType(); if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; @@ -167,7 +168,7 @@ namespace TNodeGraphViewImpl.Editor.Cache{ } return null; } - public static Blackboard CreateBlackboardWithGraphData(Type graphType){ + public static IBlackboardView CreateBlackboardWithGraphData(Type graphType){ if (NodeEditorSingleton.Instance.GraphBlackboard.ContainsKey(graphType)){ var type = NodeEditorSingleton.Instance.GraphBlackboard[graphType]; return CreateBlackboardDataFromBlackboardDataType(type); diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index 2ed561f..4c0d01d 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -1,17 +1,39 @@ -using TNode.Attribute; +using System.Collections; +using System.Reflection; +using TNode.Attribute; +using TNode.Editor.NodeGraphView; +using TNode.Editor.Search; using TNode.Models; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine; namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ [ViewComponent] public class DefaultGraphBlackboardView:GraphBlackboardView{ - public DefaultGraphBlackboardView(){ - - } - public void ConstructView(){ - - } - public void AddParameter(){ + protected override void UpdateBlackboard(BlackboardData data){ + + foreach (var field in data.GetType() + .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ + //if the field is MonoBehaviour,add a property field for blackboard + //skip if the field is a list or Ilist + if (!typeof(IList).IsAssignableFrom(field.FieldType)){ + var propertyField = new BlackboardPropertyField(new BlackboardProperty.BlackboardProperty(field.Name,field.FieldType)); + this.Add(propertyField); + } + } + this.addItemRequested = (sender) => { + var res = ScriptableObject.CreateInstance(); + + //Get right top corner of the blackboard + var blackboardPos = GetPosition().position+OwnerWindow.position.position; + var searchWindowContext = new SearchWindowContext(blackboardPos,200,200); + //Call search window + res.Setup(Owner.GetGraphData().GetType(),Owner,OwnerWindow); + SearchWindow.Open(searchWindowContext, res); + }; } + } } \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs index 05fe3f5..8c2644d 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs @@ -1,15 +1,52 @@ -using TNode.Models; +using TNode.Editor.Blackboard; +using TNode.Editor.NodeGraphView; +using TNode.Editor.Search; +using TNode.Models; +using UnityEditor; using UnityEditor.Experimental.GraphView; +using UnityEngine; namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ /// /// Implement this class to create graph black board for specified graph /// - public class GraphBlackboardView:Blackboard where T:BlackboardData{ - public T BlackboardData; + public class GraphBlackboardView:Blackboard,IBlackboardView where T:BlackboardData{ + protected IBaseDataGraphView Owner; + protected EditorWindow OwnerWindow; + private T _data; - public GraphBlackboardView() : base(){ + public void Setup(IBaseDataGraphView graphView,EditorWindow ownerWindow){ + Owner = graphView; + OwnerWindow = ownerWindow; + } + + + + public new void SetPosition(Rect rect){ } + + protected virtual void UpdateBlackboard(BlackboardData data){ + + } + public T Data{ + get => (T) _data; + + set{ + _data = value; + UpdateBlackboard(value); + } + } + public BlackboardData GetBlackboardData(){ + return _data; + } + + public void SetBlackboardData(BlackboardData data){ + Data = (T) data; + } + + public void AddItem(){ + + } } } \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/GraphEditor.cs b/TNodeGraphViewImpl/Editor/GraphEditor.cs index 59c4b11..ade213b 100644 --- a/TNodeGraphViewImpl/Editor/GraphEditor.cs +++ b/TNodeGraphViewImpl/Editor/GraphEditor.cs @@ -1,6 +1,6 @@ using Codice.CM.Common; +using TNode.Editor.EditorPersistence; using TNode.Editor.Inspector; -using TNode.Editor.Model; using TNode.Models; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.NodeGraphView; diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index 0a46a2b..ec9a3ac 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -4,8 +4,9 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using TNode.Editor; +using TNode.Editor.Blackboard; +using TNode.Editor.EditorPersistence; using TNode.Editor.Inspector; -using TNode.Editor.Model; using TNode.Editor.NodeGraphView; using TNode.Editor.NodeViews; using TNode.Editor.Search; @@ -29,7 +30,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ private NodeInspector _nodeInspector; public GraphEditor Owner; private Dictionary _nodeDict = new(); - private Blackboard _blackboard; + private IBlackboardView _blackboard; public T Data{ get{ return _data; } set{ @@ -191,47 +192,14 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ miniMap.SetPosition(rect); } - public virtual void CreateBlackboard(){ - - _blackboard = NodeEditorExtensions.CreateBlackboardWithGraphData(typeof(T)); - - _blackboard.SetPosition(new Rect(0,0,200,600)); - Add(_blackboard); - - OnDataChanged+= (sender, e) => { BlackboardUpdate(); }; - - } private void BlackboardUpdate(){ if (_data.blackboardData == null || _data.blackboardData.GetType() == typeof(BlackboardData)){ _data.blackboardData = NodeEditorExtensions.GetAppropriateBlackboardData(_data.GetType()); if (_data.blackboardData == null) return; + _blackboard.SetBlackboardData(_data.blackboardData); } - - //Iterate field of the blackboard and add a button for each field - foreach (var field in _data.blackboardData.GetType() - .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ - //if the field is MonoBehaviour,add a property field for blackboard - //skip if the field is a list or Ilist - if (!typeof(IList).IsAssignableFrom(field.FieldType)){ - var propertyField = new BlackboardPropertyField(new BlackboardProperty(field.Name,field.FieldType)); - _blackboard.Add(propertyField); - } - - } - _blackboard.addItemRequested = (sender) => { - var res = ScriptableObject.CreateInstance(); - - //Get right top corner of the blackboard - var blackboardPos = _blackboard.GetPosition().position; - var searchWindowContext = new SearchWindowContext(blackboardPos,200,200); - //Call search window - res.Setup(typeof(T),this,Owner); - - SearchWindow.Open(searchWindowContext, res); - }; - } public virtual void DestroyInspector(){ @@ -330,10 +298,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ OnGraphViewDestroy(); } - public bool IsDroppable(){ - return true; - } - + #region implement interfaces public void AddTNode(NodeData nodeData, Rect rect){ if (NodeEditorExtensions.CreateNodeViewFromNodeType(nodeData.GetType()) is Node nodeView){ nodeView.SetPosition(rect); @@ -381,9 +346,30 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ Owner.graphEditorData.graphElementsData.RemoveAll(x => x.guid == nodeData.id); } + public void CreateBlackboard(){ + _blackboard = NodeEditorExtensions.CreateBlackboardWithGraphData(typeof(T)); + _blackboard.Setup(this,Owner); + + var castedBlackboard = _blackboard as Blackboard; + + Add(castedBlackboard); + + Rect blackboardPos = new Rect(0,0,200,700); + castedBlackboard?.SetPosition(blackboardPos); + + + OnDataChanged+= (sender, e) => { BlackboardUpdate(); }; + } + + public GraphData GetGraphData(){ + return _data; + } + + public BlackboardData GetBlackboardData(){ return this._data.blackboardData; } + #endregion } From 7934dd767d778db3af7eaee863e1940cd177b7d4 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Wed, 13 Jul 2022 16:44:41 +0800 Subject: [PATCH 10/17] fix: better serialization --- TNode/Attribute/BlackboardSection.cs | 16 --- TNode/Attribute/BlackboardSection.cs.meta | 3 - TNode/Editor/Serialization.meta | 3 + .../Serialization/BlackboardDataWrapper.cs | 10 ++ .../BlackboardDataWrapper.cs.meta | 3 + TNode/Editor/Serialization/DataWrapper.cs | 53 +++++++++ .../Editor/Serialization/DataWrapper.cs.meta | 3 + TNode/Editor/Serialization/NodeDataWrapper.cs | 110 ++++++++++++++++++ .../Serialization}/NodeDataWrapper.cs.meta | 0 TNode/JsonSerialize/JsonSerializeTool.cs | 2 +- TNode/JsonSerialize/UnityObjectConverter.cs | 24 ++++ .../UnityObjectConverter.cs.meta | 3 + TNode/Models/BlackboardData.cs | 4 +- TNode/Models/GraphData.cs | 51 ++++++-- TNode/Tools.meta | 3 - TNode/Tools/NodeDataWrapper.cs | 90 -------------- .../Editor/Cache/NodeEditorExtensions.cs | 4 +- .../DefaultGraphBlackboardView.cs | 26 ++++- .../Editor/Inspector/NodeInspector.cs | 1 + .../Editor/Inspector/NodeInspectorInNode.cs | 5 +- .../Editor/NodeGraphView/DataGraphView.cs | 22 ++-- .../Editor/NodeViews/DefaultNodeView.cs | 1 + .../Editor/NodeViews/DragNodeView.cs | 1 + .../Editor/NodeViews/NodeView.cs | 7 +- 24 files changed, 299 insertions(+), 146 deletions(-) delete mode 100644 TNode/Attribute/BlackboardSection.cs delete mode 100644 TNode/Attribute/BlackboardSection.cs.meta create mode 100644 TNode/Editor/Serialization.meta create mode 100644 TNode/Editor/Serialization/BlackboardDataWrapper.cs create mode 100644 TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta create mode 100644 TNode/Editor/Serialization/DataWrapper.cs create mode 100644 TNode/Editor/Serialization/DataWrapper.cs.meta create mode 100644 TNode/Editor/Serialization/NodeDataWrapper.cs rename TNode/{Tools => Editor/Serialization}/NodeDataWrapper.cs.meta (100%) create mode 100644 TNode/JsonSerialize/UnityObjectConverter.cs create mode 100644 TNode/JsonSerialize/UnityObjectConverter.cs.meta delete mode 100644 TNode/Tools.meta delete mode 100644 TNode/Tools/NodeDataWrapper.cs diff --git a/TNode/Attribute/BlackboardSection.cs b/TNode/Attribute/BlackboardSection.cs deleted file mode 100644 index bbefd7a..0000000 --- a/TNode/Attribute/BlackboardSection.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using JetBrains.Annotations; - -namespace TNode.Attribute{ - - /// - /// Use this attribute to declare a blackboard section ,a blackboard section is a group of variables with same types - /// - [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] - [BaseTypeRequired(typeof(List<>))] - - public class BlackboardSection:System.Attribute{ - - } -} \ No newline at end of file diff --git a/TNode/Attribute/BlackboardSection.cs.meta b/TNode/Attribute/BlackboardSection.cs.meta deleted file mode 100644 index 1794987..0000000 --- a/TNode/Attribute/BlackboardSection.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 773d073006dc4dd488e18b38165efd5a -timeCreated: 1656942977 \ No newline at end of file diff --git a/TNode/Editor/Serialization.meta b/TNode/Editor/Serialization.meta new file mode 100644 index 0000000..03f9a0e --- /dev/null +++ b/TNode/Editor/Serialization.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4c1e0017367a4d448a68ed34b7540782 +timeCreated: 1657690936 \ No newline at end of file diff --git a/TNode/Editor/Serialization/BlackboardDataWrapper.cs b/TNode/Editor/Serialization/BlackboardDataWrapper.cs new file mode 100644 index 0000000..5d05035 --- /dev/null +++ b/TNode/Editor/Serialization/BlackboardDataWrapper.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using TNode.Models; +using UnityEngine; + +namespace TNode.Editor.Serialization{ + public class BlackboardDataWrapper:DataWrapper{ + + } +} \ No newline at end of file diff --git a/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta b/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta new file mode 100644 index 0000000..774afc6 --- /dev/null +++ b/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ac3fada821244e69b6b9a27a7b94eeee +timeCreated: 1657691334 \ No newline at end of file diff --git a/TNode/Editor/Serialization/DataWrapper.cs b/TNode/Editor/Serialization/DataWrapper.cs new file mode 100644 index 0000000..7fed251 --- /dev/null +++ b/TNode/Editor/Serialization/DataWrapper.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using TNode.Models; +using UnityEngine; + +namespace TNode.Editor.Serialization{ + [Serializable] + public class DataWrapper:ScriptableObject where TWrapper:DataWrapper where TData:IModel,new(){ + [SerializeReference] + public TData data; + private static readonly Dictionary Cache = new (); + public static TWrapper Get(TData data){ + if (data.GetType().IsGenericType){ + return CreateInstance(); + } + if(Cache.ContainsKey(data)){ + return Cache[data]; + } + var wrapper = CreateInstance(); + wrapper.data = data; + Cache.Add(data,wrapper); + return wrapper; + } + public event Action> OnValueChanged; + + public void SetValue(string path, object value){ + var fieldInfo = data.GetType().GetField(path); + fieldInfo.SetValue(data,value); + OnValueChanged?.Invoke(this); + } + + public object GetValue(string path){ + var fieldInfo = data.GetType().GetField(path); + return fieldInfo.GetValue(data); + } + public static implicit operator TData(DataWrapper wrapper){ + if (wrapper == null) + return default(TData); + return wrapper.data; + + } + /// + /// Use this to get the wrapped data directly. + /// + /// + /// + public static implicit operator DataWrapper(TData unWrapper){ + if (unWrapper == null) + return null; + return Get(unWrapper); + } + } +} \ No newline at end of file diff --git a/TNode/Editor/Serialization/DataWrapper.cs.meta b/TNode/Editor/Serialization/DataWrapper.cs.meta new file mode 100644 index 0000000..ec3dcc7 --- /dev/null +++ b/TNode/Editor/Serialization/DataWrapper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3b4407f1670d4359b807377900c83583 +timeCreated: 1657693507 \ No newline at end of file diff --git a/TNode/Editor/Serialization/NodeDataWrapper.cs b/TNode/Editor/Serialization/NodeDataWrapper.cs new file mode 100644 index 0000000..cff0ea0 --- /dev/null +++ b/TNode/Editor/Serialization/NodeDataWrapper.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using TNode.Models; +using UnityEngine; +using UnityEngine.Serialization; + + +namespace TNode.Editor.Serialization{ + [Obsolete] + + public class NodeDataWrapper : ScriptableObject where T : NodeData{ + public T Data; + private static readonly Dictionary> Cache = new (); + public event Action> OnValueChanged; + public static NodeDataWrapper Get(T data){ + if(Cache.ContainsKey(data)){ + return Cache[data]; + } + var wrapper = ScriptableObject.CreateInstance>(); + Cache.Add(data,wrapper); + return wrapper; + } + public NodeDataWrapper(T data){ + this.Data = data; + } + + public void SetValue(string path, object value){ + var fieldInfo = Data.GetType().GetField(path); + fieldInfo.SetValue(Data,value); + OnValueChanged?.Invoke(this); + } + + public object GetValue(string path){ + var fieldInfo = Data.GetType().GetField(path); + return fieldInfo.GetValue(Data); + } + public static implicit operator T(NodeDataWrapper wrapper){ + if (wrapper == null) + return null; + return wrapper.Data; + + } + public static implicit operator NodeDataWrapper(T unWrapper){ + if (unWrapper == null) + return null; + return Get(unWrapper); + } + } + public class NodeDataWrapper:DataWrapper{ + + } + /// + /// Scriptable object wrapper enable property drawer for t-node + /// instance create automatically when using get function,generic node data is not support yet because of unity serialization system. + /// TODO : support generic node data + /// + // public class NodeDataWrapper:ScriptableObject{ + // [SerializeReference] + // public NodeData data; + // private static readonly Dictionary Cache = new (); + // public event Action OnValueChanged; + // /// + // /// Create a new wrapper or get a cached wrapper for the given data + // /// + // /// node data,an implemented type is acceptable + // /// + // public static NodeDataWrapper Get(NodeData data){ + // if (data.GetType().IsGenericType){ + // return CreateInstance(); + // } + // if(Cache.ContainsKey(data)){ + // return Cache[data]; + // } + // var wrapper = CreateInstance(); + // wrapper.data = data; + // Cache.Add(data,wrapper); + // return wrapper; + // } + // + // + // public void SetValue(string path, object value){ + // var fieldInfo = data.GetType().GetField(path); + // fieldInfo.SetValue(data,value); + // OnValueChanged?.Invoke(this); + // } + // + // public object GetValue(string path){ + // var fieldInfo = data.GetType().GetField(path); + // return fieldInfo.GetValue(data); + // } + // public static implicit operator NodeData(NodeDataWrapper wrapper){ + // if (wrapper == null) + // return null; + // return wrapper.data; + // + // } + // /// + // /// Use this to get the wrapped data directly. + // /// + // /// + // /// + // public static implicit operator NodeDataWrapper(NodeData unWrapper){ + // if (unWrapper == null) + // return null; + // return Get(unWrapper); + // } + // } + + +} \ No newline at end of file diff --git a/TNode/Tools/NodeDataWrapper.cs.meta b/TNode/Editor/Serialization/NodeDataWrapper.cs.meta similarity index 100% rename from TNode/Tools/NodeDataWrapper.cs.meta rename to TNode/Editor/Serialization/NodeDataWrapper.cs.meta diff --git a/TNode/JsonSerialize/JsonSerializeTool.cs b/TNode/JsonSerialize/JsonSerializeTool.cs index 58888ba..77194ac 100644 --- a/TNode/JsonSerialize/JsonSerializeTool.cs +++ b/TNode/JsonSerialize/JsonSerializeTool.cs @@ -19,7 +19,7 @@ namespace TNode.JsonSerialize{ ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore, DateFormatString = "yyyy-MM-dd HH:mm:ss", - Converters = new List { new Vector3Converter() }, + Converters = new List { new Vector3Converter(),new UnityObjectConverter() }, TypeNameHandling = TypeNameHandling.Auto, ContractResolver = new WritablePropertiesOnlyResolver(), Formatting = Formatting.Indented diff --git a/TNode/JsonSerialize/UnityObjectConverter.cs b/TNode/JsonSerialize/UnityObjectConverter.cs new file mode 100644 index 0000000..0d7555d --- /dev/null +++ b/TNode/JsonSerialize/UnityObjectConverter.cs @@ -0,0 +1,24 @@ +using System; +using Newtonsoft.Json; +using UnityEditor; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace TNode.JsonSerialize{ + public class UnityObjectConverter:JsonConverter{ + public override void WriteJson(JsonWriter writer, Object value, JsonSerializer serializer){ + //Holding the object reference in a string + var go = value; + var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(go)); + writer.WriteValue(value.GetInstanceID().ToString()); + } + + public override Object ReadJson(JsonReader reader, Type objectType, Object existingValue, bool hasExistingValue, + JsonSerializer serializer){ + //Reading the object reference from the string + var guid = reader.Value.ToString(); + var go = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + return go; + } + } +} \ No newline at end of file diff --git a/TNode/JsonSerialize/UnityObjectConverter.cs.meta b/TNode/JsonSerialize/UnityObjectConverter.cs.meta new file mode 100644 index 0000000..346f409 --- /dev/null +++ b/TNode/JsonSerialize/UnityObjectConverter.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1c430c5760df439690d22ab18daa9d72 +timeCreated: 1657700744 \ No newline at end of file diff --git a/TNode/Models/BlackboardData.cs b/TNode/Models/BlackboardData.cs index fc0b66a..14cff62 100644 --- a/TNode/Models/BlackboardData.cs +++ b/TNode/Models/BlackboardData.cs @@ -1,5 +1,7 @@ -namespace TNode.Models{ +using System; +namespace TNode.Models{ + [Serializable] public class BlackboardData:IModel{ } diff --git a/TNode/Models/GraphData.cs b/TNode/Models/GraphData.cs index 3937714..8f7031b 100644 --- a/TNode/Models/GraphData.cs +++ b/TNode/Models/GraphData.cs @@ -2,37 +2,64 @@ using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; -using TNode.Editor; using TNode.JsonSerialize; -using UnityEditor.Experimental.GraphView; using UnityEngine.Serialization; namespace TNode.Models{ [Serializable] public class GraphData:ScriptableObject,ISerializationCallbackReceiver{ - [SerializeField] public Dictionary NodeDictionary = new Dictionary(); - public List nodeLinks = new(); - public BlackboardData blackboardData = new(); + + + [SerializeField] + protected List nodeLinks; [TextArea(1,10)] [SerializeField] //[HideInInspector] - private string jsonObject; + private string jsonNodeData; [TextArea(1,10)] [SerializeField] private string jsonBlackboard; + + + public BlackboardData blackboardData; + + public List NodeLinks{ + get{ + return nodeLinks ??= new List(); + + } + set => nodeLinks = value; + } + + public void OnBeforeSerialize(){ - jsonObject = JsonConvert.SerializeObject(NodeDictionary,JsonSerializeTool.JsonSerializerSettings); - jsonBlackboard = JsonConvert.SerializeObject(blackboardData,JsonSerializeTool.JsonSerializerSettings); + if (nodeLinks != null){ + jsonNodeData = JsonConvert.SerializeObject(NodeDictionary,JsonSerializeTool.JsonSerializerSettings); + + } + + if (jsonBlackboard != null){ + jsonBlackboard = JsonConvert.SerializeObject(blackboardData,typeof(object),JsonSerializeTool.JsonSerializerSettings); + + } } public void OnAfterDeserialize(){ //Deserialize node dictionary - var deserializedData = JsonConvert.DeserializeObject>(jsonObject,JsonSerializeTool.JsonSerializerSettings); + var deserializedData = JsonConvert.DeserializeObject>(jsonNodeData,JsonSerializeTool.JsonSerializerSettings); NodeDictionary = deserializedData; //Deserialize blackboard data - var deserializedBlackboard = JsonConvert.DeserializeObject(jsonBlackboard,JsonSerializeTool.JsonSerializerSettings); - blackboardData = deserializedBlackboard; - + // var deserializedBlackboard = + // JsonConvert.DeserializeObject(jsonBlackboard,JsonSerializeTool.JsonSerializerSettings); + // blackboardData = deserializedBlackboard as BlackboardData; + // Debug.Log(deserializedBlackboard); + } + + public void OnEnable(){ + var deserializedBlackboard = + JsonConvert.DeserializeObject(jsonBlackboard,JsonSerializeTool.JsonSerializerSettings); + blackboardData = deserializedBlackboard as BlackboardData; + Debug.Log(deserializedBlackboard); } } } \ No newline at end of file diff --git a/TNode/Tools.meta b/TNode/Tools.meta deleted file mode 100644 index 15e65f1..0000000 --- a/TNode/Tools.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 206b9a7ba6b54706b02c6aa2cb9a18b0 -timeCreated: 1656762017 \ No newline at end of file diff --git a/TNode/Tools/NodeDataWrapper.cs b/TNode/Tools/NodeDataWrapper.cs deleted file mode 100644 index 1170590..0000000 --- a/TNode/Tools/NodeDataWrapper.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using TNode.Models; -using UnityEngine; - -namespace TNode.Editor{ - /// - /// Scriptable object wrapper enable property drawer for t-node - /// - public class NodeDataWrapper : ScriptableObject where T : NodeData{ - public T Data; - private static readonly Dictionary> Cache = new (); - public event Action> OnValueChanged; - public static NodeDataWrapper Get(T data){ - if(Cache.ContainsKey(data)){ - return Cache[data]; - } - var wrapper = ScriptableObject.CreateInstance>(); - Cache.Add(data,wrapper); - return wrapper; - } - public NodeDataWrapper(T data){ - this.Data = data; - } - - public void SetValue(string path, object value){ - var fieldInfo = Data.GetType().GetField(path); - fieldInfo.SetValue(Data,value); - OnValueChanged?.Invoke(this); - } - - public object GetValue(string path){ - var fieldInfo = Data.GetType().GetField(path); - return fieldInfo.GetValue(Data); - } - public static implicit operator T(NodeDataWrapper wrapper){ - if (wrapper == null) - return null; - return wrapper.Data; - - } - public static implicit operator NodeDataWrapper(T unWrapper){ - if (unWrapper == null) - return null; - return Get(unWrapper); - } - } - - public class NodeDataWrapper:ScriptableObject{ - [SerializeReference] - public NodeData Data; - private static readonly Dictionary Cache = new (); - public event Action OnValueChanged; - public static NodeDataWrapper Get(NodeData data){ - if (data.GetType().IsGenericType){ - return ScriptableObject.CreateInstance(); - } - if(Cache.ContainsKey(data)){ - return Cache[data]; - } - var wrapper = ScriptableObject.CreateInstance(); - wrapper.Data = data; - Cache.Add(data,wrapper); - return wrapper; - } - - - public void SetValue(string path, object value){ - var fieldInfo = Data.GetType().GetField(path); - fieldInfo.SetValue(Data,value); - OnValueChanged?.Invoke(this); - } - - public object GetValue(string path){ - var fieldInfo = Data.GetType().GetField(path); - return fieldInfo.GetValue(Data); - } - public static implicit operator NodeData(NodeDataWrapper wrapper){ - if (wrapper == null) - return null; - return wrapper.Data; - - } - public static implicit operator NodeDataWrapper(NodeData unWrapper){ - if (unWrapper == null) - return null; - return Get(unWrapper); - } - } -} \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs index 7624080..f8fe8b6 100644 --- a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs +++ b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs @@ -8,6 +8,7 @@ using TNode.Editor.NodeViews; using TNode.Models; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.NodeGraphView; +using TNodeGraphViewImpl.Editor.NodeViews; using UnityEditor.Experimental.GraphView; using UnityEngine; @@ -200,7 +201,6 @@ namespace TNodeGraphViewImpl.Editor.Cache{ //Check the generic type of BaseNodeView by t if (t.IsGenericType){ - Debug.Log($"A generic type {t} is detected"); //AKA if BlackboardDragNodeData is pulled //Get BlackboardDragNodeData as generic type @@ -209,14 +209,12 @@ namespace TNodeGraphViewImpl.Editor.Cache{ //What you want is a BaseNodeView> to be created var genericViewType = typeof(BaseNodeView<>).MakeGenericType(genericTypeDefinition); - Debug.Log($"The generic view type is {genericViewType}"); //search for the specific type of genericViewType in the dictionary if (NodeEditorSingleton.Instance.FromGenericToSpecific.ContainsKey(genericViewType)){ var implementedType = NodeEditorSingleton.Instance.FromGenericToSpecific[genericViewType]; //The implementedType is still a generic type ,so we make it a specific type by using MakeGenericType - Debug.Log($"{implementedType}"); //Get argument type of t var argumentType = t.GetGenericArguments()[0]; var instance = Activator.CreateInstance(implementedType.MakeGenericType(argumentType)); diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index 4c0d01d..80eaeb2 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -3,27 +3,45 @@ using System.Reflection; using TNode.Attribute; using TNode.Editor.NodeGraphView; using TNode.Editor.Search; +using TNode.Editor.Serialization; using TNode.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; +using UnityEditor.UIElements; using UnityEngine; +using UnityEngine.UIElements; namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ [ViewComponent] public class DefaultGraphBlackboardView:GraphBlackboardView{ protected override void UpdateBlackboard(BlackboardData data){ - - + var serializedObject = new SerializedObject((BlackboardDataWrapper)data); foreach (var field in data.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ //if the field is MonoBehaviour,add a property field for blackboard //skip if the field is a list or Ilist if (!typeof(IList).IsAssignableFrom(field.FieldType)){ + VisualElement visualElement = new VisualElement(); var propertyField = new BlackboardPropertyField(new BlackboardProperty.BlackboardProperty(field.Name,field.FieldType)); - this.Add(propertyField); + var foldoutData = new Foldout{ + text = field.Name + }; + var drawer = new PropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name); + drawer.Bind(serializedObject); + foldoutData.Add(drawer); + visualElement.Add(propertyField); + visualElement.Add(foldoutData); + this.Add(visualElement); + + } + else{ + var blackboardList = new BlackboardSection{ + title = field.Name + }; + this.Add(blackboardList); } } - this.addItemRequested = (sender) => { + addItemRequested = (sender) => { var res = ScriptableObject.CreateInstance(); //Get right top corner of the blackboard diff --git a/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs index 0367625..96c833e 100644 --- a/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs @@ -5,6 +5,7 @@ using TNode.Attribute; using TNode.Editor.NodeViews; using TNode.Models; using TNodeGraphViewImpl.Editor.NodeGraphView; +using TNodeGraphViewImpl.Editor.NodeViews; using Unity.VisualScripting; using UnityEditor; using UnityEditor.Experimental.GraphView; diff --git a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs index de375a1..b0c573c 100644 --- a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs @@ -1,5 +1,6 @@ using System.Reflection; using TNode.Attribute; +using TNode.Editor.Serialization; using TNode.Models; using UnityEditor; using UnityEditor.UIElements; @@ -47,11 +48,11 @@ namespace TNode.Editor.Inspector{ var showInNodeViewAttribute = field.GetCustomAttribute() != null; if (!showInNodeViewAttribute) continue; - var drawer = new PropertyField(serializedObject.FindProperty("Data").FindPropertyRelative(field.Name),field.Name); - Debug.Log(serializedObject.FindProperty("Data")); + var drawer = new PropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name); drawer.Bind(serializedObject); Add(drawer); } } + } } \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index ec9a3ac..7ef4c68 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -15,6 +15,7 @@ using TNode.Models; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty; +using TNodeGraphViewImpl.Editor.NodeViews; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; @@ -156,7 +157,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ 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]; @@ -194,12 +195,13 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ private void BlackboardUpdate(){ - if (_data.blackboardData == null || _data.blackboardData.GetType() == typeof(BlackboardData)){ + if (_data.blackboardData == null || _data.blackboardData.GetType()==(typeof(BlackboardData))){ _data.blackboardData = NodeEditorExtensions.GetAppropriateBlackboardData(_data.GetType()); if (_data.blackboardData == null) return; - _blackboard.SetBlackboardData(_data.blackboardData); + } + _blackboard.SetBlackboardData(_data.blackboardData); } public virtual void DestroyInspector(){ @@ -272,17 +274,23 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ } - _data.nodeLinks = links; + _data.NodeLinks = links; } private void SaveGraphData(){ _data.NodeDictionary.Clear(); - _data.nodeLinks.Clear(); + _data.NodeLinks.Clear(); SaveNode(); SaveEdge(); + SaveBlackboard(); EditorUtility.SetDirty(_data); } - + private void SaveBlackboard(){ + if (_data.blackboardData == null){ + _data.blackboardData = NodeEditorExtensions.GetAppropriateBlackboardData(_data.GetType()); + } + } + public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter){ return ports.Where(x => x.portType == startPort.portType).ToList(); @@ -354,7 +362,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ Add(castedBlackboard); - Rect blackboardPos = new Rect(0,0,200,700); + Rect blackboardPos = new Rect(0,0,300,700); castedBlackboard?.SetPosition(blackboardPos); diff --git a/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs index caec25e..285ce31 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs @@ -1,5 +1,6 @@ using TNode.Editor.NodeViews; using TNode.Models; +using TNodeGraphViewImpl.Editor.NodeViews; namespace TNode.Editor{ diff --git a/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs index dbcd21c..a425150 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs @@ -1,5 +1,6 @@ using TNode.Attribute; using TNode.Models; +using TNodeGraphViewImpl.Editor.NodeViews; namespace TNode.Editor.NodeViews{ [ViewComponent] diff --git a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs index 5cdc716..9a6bd90 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs @@ -1,15 +1,15 @@ using System; using System.Linq; using System.Reflection; -using TNode.Attribute; using TNode.Attribute.Ports; using TNode.Editor.Inspector; +using TNode.Editor.Serialization; using TNode.Models; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; -namespace TNode.Editor.NodeViews{ +namespace TNodeGraphViewImpl.Editor.NodeViews{ public abstract class BaseNodeView : Node,INodeView where T:NodeData,new(){ protected T _data; @@ -28,10 +28,9 @@ namespace TNode.Editor.NodeViews{ } } - private void OnDataValueChanged(NodeDataWrapper obj){ + private void OnDataValueChanged(DataWrapper obj){ Refresh(); } - public sealed override string title{ get => base.title; set => base.title = value; From e1d39cd9b29603d4bfb9f0455d7e4e1de98ce59d Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Wed, 13 Jul 2022 19:42:30 +0800 Subject: [PATCH 11/17] fix: fix serialization bugs --- TNode/Attribute/Ports/InputAttribute.cs | 2 +- TNode/Attribute/Ports/OutputAttribute.cs | 4 +- TNode/Attribute/Ports/PortAttribute.cs | 13 ++++- TNode/JsonSerialize.meta | 3 -- TNode/JsonSerialize/JsonSerializeTool.cs | 36 -------------- TNode/JsonSerialize/JsonSerializeTool.cs.meta | 3 -- TNode/JsonSerialize/NodeDataConverter.cs | 42 ---------------- TNode/JsonSerialize/NodeDataConverter.cs.meta | 3 -- TNode/JsonSerialize/UnityObjectConverter.cs | 24 ---------- .../UnityObjectConverter.cs.meta | 3 -- TNode/JsonSerialize/Vector3Converter.cs | 28 ----------- TNode/JsonSerialize/Vector3Converter.cs.meta | 3 -- TNode/Models/BlackboardDragNodeData.cs | 15 +++--- TNode/Models/GraphData.cs | 48 ++++++------------- TNode/RuntimeCache/RuntimeCache.cs | 5 ++ .../DefaultGraphBlackboardView.cs | 5 ++ .../Editor/Inspector/NodeInspectorInNode.cs | 2 +- .../Editor/NodeGraphView/DataGraphView.cs | 9 ++-- .../Editor/NodeViews/DragNodeView.cs | 6 +-- .../Editor/NodeViews/NodeView.cs | 16 ++++++- TNodeGraphViewImpl/Editor/Resources.meta | 3 ++ .../Resources/GraphViewPropertyField.uss | 5 ++ .../Resources/GraphViewPropertyField.uss.meta | 3 ++ 23 files changed, 80 insertions(+), 201 deletions(-) delete mode 100644 TNode/JsonSerialize.meta delete mode 100644 TNode/JsonSerialize/JsonSerializeTool.cs delete mode 100644 TNode/JsonSerialize/JsonSerializeTool.cs.meta delete mode 100644 TNode/JsonSerialize/NodeDataConverter.cs delete mode 100644 TNode/JsonSerialize/NodeDataConverter.cs.meta delete mode 100644 TNode/JsonSerialize/UnityObjectConverter.cs delete mode 100644 TNode/JsonSerialize/UnityObjectConverter.cs.meta delete mode 100644 TNode/JsonSerialize/Vector3Converter.cs delete mode 100644 TNode/JsonSerialize/Vector3Converter.cs.meta create mode 100644 TNodeGraphViewImpl/Editor/Resources.meta create mode 100644 TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss create mode 100644 TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss.meta diff --git a/TNode/Attribute/Ports/InputAttribute.cs b/TNode/Attribute/Ports/InputAttribute.cs index e0d4b96..3755188 100644 --- a/TNode/Attribute/Ports/InputAttribute.cs +++ b/TNode/Attribute/Ports/InputAttribute.cs @@ -5,7 +5,7 @@ namespace TNode.Attribute.Ports{ [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class InputAttribute : PortAttribute{ - public InputAttribute(string name="", PortNameHandling nameHandling = PortNameHandling.Auto) : base(name, nameHandling){ + public InputAttribute(string name="", PortNameHandling nameHandling = PortNameHandling.Auto,TypeHandling typeHandling=TypeHandling.Declared) : base(name, nameHandling,typeHandling){ } } } \ No newline at end of file diff --git a/TNode/Attribute/Ports/OutputAttribute.cs b/TNode/Attribute/Ports/OutputAttribute.cs index a0c3908..b9c6888 100644 --- a/TNode/Attribute/Ports/OutputAttribute.cs +++ b/TNode/Attribute/Ports/OutputAttribute.cs @@ -1,6 +1,8 @@ namespace TNode.Attribute.Ports{ public class OutputAttribute:PortAttribute{ - public OutputAttribute(string name="", PortNameHandling nameHandling = PortNameHandling.Auto) : base(name, nameHandling){ + + + public OutputAttribute(string name="", PortNameHandling nameHandling = PortNameHandling.Auto,TypeHandling typeHandling = TypeHandling.Declared) : base(name, nameHandling,typeHandling){ } } } \ No newline at end of file diff --git a/TNode/Attribute/Ports/PortAttribute.cs b/TNode/Attribute/Ports/PortAttribute.cs index cc3be06..1ade1cc 100644 --- a/TNode/Attribute/Ports/PortAttribute.cs +++ b/TNode/Attribute/Ports/PortAttribute.cs @@ -9,17 +9,26 @@ namespace TNode.Attribute.Ports{ Manual, Format, MemberType + } + public enum TypeHandling{ + Declared, + Implemented, + Specified } [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class PortAttribute:System.Attribute{ public readonly string Name; public readonly PortNameHandling NameHandling; - - public PortAttribute(string name,PortNameHandling nameHandling=PortNameHandling.Auto){ + public Type HandledType; + public TypeHandling TypeHandling{ get; set; } + public PortAttribute(string name,PortNameHandling nameHandling=PortNameHandling.Auto,TypeHandling typeHandling=TypeHandling.Declared){ this.Name = name; this.NameHandling = nameHandling; + this.TypeHandling = typeHandling; } + + } } \ No newline at end of file diff --git a/TNode/JsonSerialize.meta b/TNode/JsonSerialize.meta deleted file mode 100644 index 68eeed3..0000000 --- a/TNode/JsonSerialize.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ec6119d082a947f58ed6402290b65596 -timeCreated: 1656817965 \ No newline at end of file diff --git a/TNode/JsonSerialize/JsonSerializeTool.cs b/TNode/JsonSerialize/JsonSerializeTool.cs deleted file mode 100644 index 77194ac..0000000 --- a/TNode/JsonSerialize/JsonSerializeTool.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - - -namespace TNode.JsonSerialize{ - public static class JsonSerializeTool{ - class WritablePropertiesOnlyResolver : DefaultContractResolver - { - protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) - { - IList props = base.CreateProperties(type, memberSerialization); - return props.Where(p => p.Writable).ToList(); - } - } - public static JsonSerializerSettings JsonSerializerSettings = new JsonSerializerSettings(){ - ReferenceLoopHandling = ReferenceLoopHandling.Ignore, - NullValueHandling = NullValueHandling.Ignore, - DateFormatString = "yyyy-MM-dd HH:mm:ss", - Converters = new List { new Vector3Converter(),new UnityObjectConverter() }, - TypeNameHandling = TypeNameHandling.Auto, - ContractResolver = new WritablePropertiesOnlyResolver(), - Formatting = Formatting.Indented - - - }; - - 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 deleted file mode 100644 index 4480c5b..0000000 --- a/TNode/JsonSerialize/JsonSerializeTool.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 14067671fe28434e9ae2e67a34074c52 -timeCreated: 1656819161 \ No newline at end of file diff --git a/TNode/JsonSerialize/NodeDataConverter.cs b/TNode/JsonSerialize/NodeDataConverter.cs deleted file mode 100644 index a3c5f26..0000000 --- a/TNode/JsonSerialize/NodeDataConverter.cs +++ /dev/null @@ -1,42 +0,0 @@ -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 deleted file mode 100644 index e29d3c5..0000000 --- a/TNode/JsonSerialize/NodeDataConverter.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 6f960539f2744729b35ff3011677d8ba -timeCreated: 1656857829 \ No newline at end of file diff --git a/TNode/JsonSerialize/UnityObjectConverter.cs b/TNode/JsonSerialize/UnityObjectConverter.cs deleted file mode 100644 index 0d7555d..0000000 --- a/TNode/JsonSerialize/UnityObjectConverter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using Newtonsoft.Json; -using UnityEditor; -using UnityEngine; -using Object = UnityEngine.Object; - -namespace TNode.JsonSerialize{ - public class UnityObjectConverter:JsonConverter{ - public override void WriteJson(JsonWriter writer, Object value, JsonSerializer serializer){ - //Holding the object reference in a string - var go = value; - var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(go)); - writer.WriteValue(value.GetInstanceID().ToString()); - } - - public override Object ReadJson(JsonReader reader, Type objectType, Object existingValue, bool hasExistingValue, - JsonSerializer serializer){ - //Reading the object reference from the string - var guid = reader.Value.ToString(); - var go = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); - return go; - } - } -} \ No newline at end of file diff --git a/TNode/JsonSerialize/UnityObjectConverter.cs.meta b/TNode/JsonSerialize/UnityObjectConverter.cs.meta deleted file mode 100644 index 346f409..0000000 --- a/TNode/JsonSerialize/UnityObjectConverter.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1c430c5760df439690d22ab18daa9d72 -timeCreated: 1657700744 \ No newline at end of file diff --git a/TNode/JsonSerialize/Vector3Converter.cs b/TNode/JsonSerialize/Vector3Converter.cs deleted file mode 100644 index 00d4f93..0000000 --- a/TNode/JsonSerialize/Vector3Converter.cs +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index dbbbc50..0000000 --- a/TNode/JsonSerialize/Vector3Converter.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: fecb77054ad348239341a58c50549879 -timeCreated: 1656817975 \ No newline at end of file diff --git a/TNode/Models/BlackboardDragNodeData.cs b/TNode/Models/BlackboardDragNodeData.cs index 6b1680b..3fb0891 100644 --- a/TNode/Models/BlackboardDragNodeData.cs +++ b/TNode/Models/BlackboardDragNodeData.cs @@ -4,15 +4,18 @@ using Newtonsoft.Json; using TNode.Attribute; using TNode.Attribute.Ports; using TNode.RuntimeCache; +using UnityEngine; +using UnityEngine.Serialization; namespace TNode.Models{ - public class BlackboardDragNodeData:NodeData{ - private string _blackDragData; - [JsonIgnore] - private BlackboardData _blackboardData; + [Serializable] + public class BlackboardDragNodeData:NodeData{ + public string blackDragData; + [SerializeReference] + public BlackboardData blackboardData; - [Output("",PortNameHandling.MemberType)] - public T Value => _blackboardData.GetValue(_blackDragData); + [Output("",PortNameHandling.MemberType,TypeHandling.Implemented)] + public object Value => blackboardData.GetValue(blackDragData); public BlackboardDragNodeData(){ diff --git a/TNode/Models/GraphData.cs b/TNode/Models/GraphData.cs index 8f7031b..d5c01e4 100644 --- a/TNode/Models/GraphData.cs +++ b/TNode/Models/GraphData.cs @@ -1,8 +1,7 @@ using System; using System.Collections.Generic; -using UnityEngine; using Newtonsoft.Json; -using TNode.JsonSerialize; +using UnityEngine; using UnityEngine.Serialization; namespace TNode.Models{ @@ -10,18 +9,12 @@ namespace TNode.Models{ public class GraphData:ScriptableObject,ISerializationCallbackReceiver{ public Dictionary NodeDictionary = new Dictionary(); + [SerializeReference] + public List nodeList = new List(); [SerializeField] protected List nodeLinks; - [TextArea(1,10)] - [SerializeField] - //[HideInInspector] - private string jsonNodeData; - [TextArea(1,10)] - [SerializeField] - private string jsonBlackboard; - - + [SerializeReference] public BlackboardData blackboardData; public List NodeLinks{ @@ -34,32 +27,19 @@ namespace TNode.Models{ public void OnBeforeSerialize(){ - if (nodeLinks != null){ - jsonNodeData = JsonConvert.SerializeObject(NodeDictionary,JsonSerializeTool.JsonSerializerSettings); - - } - - if (jsonBlackboard != null){ - jsonBlackboard = JsonConvert.SerializeObject(blackboardData,typeof(object),JsonSerializeTool.JsonSerializerSettings); - + + + nodeList.Clear(); + foreach(var node in NodeDictionary.Values){ + nodeList.Add(node); } } public void OnAfterDeserialize(){ - //Deserialize node dictionary - var deserializedData = JsonConvert.DeserializeObject>(jsonNodeData,JsonSerializeTool.JsonSerializerSettings); - NodeDictionary = deserializedData; - //Deserialize blackboard data - // var deserializedBlackboard = - // JsonConvert.DeserializeObject(jsonBlackboard,JsonSerializeTool.JsonSerializerSettings); - // blackboardData = deserializedBlackboard as BlackboardData; - // Debug.Log(deserializedBlackboard); - } - - public void OnEnable(){ - var deserializedBlackboard = - JsonConvert.DeserializeObject(jsonBlackboard,JsonSerializeTool.JsonSerializerSettings); - blackboardData = deserializedBlackboard as BlackboardData; - Debug.Log(deserializedBlackboard); + NodeDictionary.Clear(); + foreach(var node in nodeList){ + NodeDictionary.Add(node.id,node); + } } + } } \ No newline at end of file diff --git a/TNode/RuntimeCache/RuntimeCache.cs b/TNode/RuntimeCache/RuntimeCache.cs index 4310a3e..b46593a 100644 --- a/TNode/RuntimeCache/RuntimeCache.cs +++ b/TNode/RuntimeCache/RuntimeCache.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using EasyRandomGenerator.Blackboard; using JetBrains.Annotations; using TNode.Models; using Unity.VisualScripting; @@ -21,6 +22,10 @@ namespace TNode.RuntimeCache{ new (); private static readonly string[] ExcludedAssemblies = new string[]{"Microsoft", "UnityEngine","UnityEditor","mscorlib","System"}; + + public RuntimeCache(){ + RegisterRuntimeBlackboard(typeof(EasyBlackboardData)); + } public void RegisterRuntimeBlackboard(Type type){ if(!CachedDelegatesForGettingValue.ContainsKey(type)){ CachedDelegatesForGettingValue.Add(type, new Dictionary()); diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index 80eaeb2..69ffebc 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -14,6 +14,11 @@ using UnityEngine.UIElements; namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ [ViewComponent] public class DefaultGraphBlackboardView:GraphBlackboardView{ + public DefaultGraphBlackboardView():base(){ + //the label and the field gap smaller + styleSheets.Add( Resources.Load("GraphViewPropertyField")); + + } protected override void UpdateBlackboard(BlackboardData data){ var serializedObject = new SerializedObject((BlackboardDataWrapper)data); foreach (var field in data.GetType() diff --git a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs index b0c573c..e016bfe 100644 --- a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs @@ -38,7 +38,7 @@ namespace TNode.Editor.Inspector{ private void RefreshPropertyDrawer(){ //Check if the data's type is a generic type of BlackboardDragNodeData<> - if (_data.GetType().IsSubclassOf(typeof(BlackboardDragNodeData<>))){ + if (_data.GetType().IsSubclassOf(typeof(BlackboardDragNodeData))){ return; } var serializedObject = new SerializedObject((NodeDataWrapper)_data); diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index 7ef4c68..ae5d75a 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -105,11 +105,10 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ foreach (var selectable in blackboardFields){ if(selectable is { } field) { //Make a constructor of BlackboardDragNodeData by reflection - var specifiedType = - typeof(BlackboardDragNodeData<>).MakeGenericType(field.BlackboardProperty.PropertyType); - //Create a new instance of specified type - var dragNodeData = NodeCreator.InstantiateNodeData(specifiedType); - this.AddTNode(dragNodeData,new Rect(evt.mousePosition,new Vector2(200,200))); + var dragNodeData = NodeCreator.InstantiateNodeData(); + dragNodeData.blackboardData = _data.blackboardData; + dragNodeData.blackDragData = field.BlackboardProperty.PropertyName; + AddTNode(dragNodeData,new Rect(evt.mousePosition,new Vector2(200,200))); } } diff --git a/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs index a425150..ad80fae 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs @@ -4,11 +4,9 @@ using TNodeGraphViewImpl.Editor.NodeViews; namespace TNode.Editor.NodeViews{ [ViewComponent] - public class DragBaseNodeView:BaseNodeView>{ + public class DragBaseNodeView:BaseNodeView{ public DragBaseNodeView() : base(){ - //Make capsule like style - - this.titleContainer.visible = false; + this.titleContainer.visible = false; this.titleContainer.RemoveFromHierarchy(); } } diff --git a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs index 9a6bd90..cdbf1ba 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs @@ -76,6 +76,18 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ throw new ArgumentOutOfRangeException(); } } + protected virtual Type BuildPortType(PortAttribute portAttribute,PropertyInfo propertyInfo){ + switch (portAttribute.TypeHandling){ + case TypeHandling.Declared : + return propertyInfo.PropertyType; + case TypeHandling.Implemented: + return propertyInfo.GetValue(_data)?.GetType(); + case TypeHandling.Specified: + return portAttribute.HandledType??typeof(object); + default: + throw new ArgumentOutOfRangeException(); + } + } /// /// of course you can override this method to build your own port builder /// @@ -84,7 +96,7 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ foreach (var propertyInfo in propertyInfos){ if (propertyInfo.GetCustomAttributes(typeof(OutputAttribute),true).FirstOrDefault() is OutputAttribute attribute){ - Port port = InstantiatePort(Orientation.Horizontal, Direction.Output,Port.Capacity.Multi,propertyInfo.PropertyType); + Port port = InstantiatePort(Orientation.Horizontal, Direction.Output,Port.Capacity.Multi,BuildPortType(attribute,propertyInfo)); this.outputContainer.Add(port); var portName = BuildPortName(attribute,propertyInfo); port.portName = portName; @@ -93,7 +105,7 @@ namespace TNodeGraphViewImpl.Editor.NodeViews{ } foreach (var propertyInfo in propertyInfos){ if(propertyInfo.GetCustomAttributes(typeof(InputAttribute),true).FirstOrDefault() is InputAttribute attribute){ - Port port = InstantiatePort(Orientation.Horizontal, Direction.Input,Port.Capacity.Single,propertyInfo.PropertyType); + Port port = InstantiatePort(Orientation.Horizontal, Direction.Input,Port.Capacity.Single,BuildPortType(attribute,propertyInfo)); this.inputContainer.Add(port); var portName = BuildPortName(attribute,propertyInfo); port.portName = portName; diff --git a/TNodeGraphViewImpl/Editor/Resources.meta b/TNodeGraphViewImpl/Editor/Resources.meta new file mode 100644 index 0000000..f5dfec6 --- /dev/null +++ b/TNodeGraphViewImpl/Editor/Resources.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d628735dd6d477c88ed608b684c50b4 +timeCreated: 1657702172 \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss b/TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss new file mode 100644 index 0000000..69a2c57 --- /dev/null +++ b/TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss @@ -0,0 +1,5 @@ +.unity-property-field__label { + width: 75px; + min-width: 100px; + max-width: 150px; +} \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss.meta b/TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss.meta new file mode 100644 index 0000000..74ae713 --- /dev/null +++ b/TNodeGraphViewImpl/Editor/Resources/GraphViewPropertyField.uss.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2b84790a3a0445f894b9c496ad1e716b +timeCreated: 1657702197 \ No newline at end of file From 26ddab5ff4fb06a67365f8c2f58339f50ae12cb7 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Thu, 14 Jul 2022 13:16:41 +0800 Subject: [PATCH 12/17] fix:work around on scene object serialization --- Scenes/SampleScene.unity | 96 +++++++++++++++++-- TNode/Attribute/GraphUsageAttribute.cs | 1 + .../{Editor/Serialization => }/DataWrapper.cs | 9 +- .../Serialization => }/DataWrapper.cs.meta | 0 TNode/Models/BlackboardData.cs | 7 +- TNode/Models/GraphData.cs | 3 + TNode/Models/SceneObjectWrapper.cs | 31 ++++++ TNode/Models/SceneObjectWrapper.cs.meta | 3 + .../DefaultGraphBlackboardView.cs | 1 + 9 files changed, 141 insertions(+), 10 deletions(-) rename TNode/{Editor/Serialization => }/DataWrapper.cs (87%) rename TNode/{Editor/Serialization => }/DataWrapper.cs.meta (100%) create mode 100644 TNode/Models/SceneObjectWrapper.cs create mode 100644 TNode/Models/SceneObjectWrapper.cs.meta diff --git a/Scenes/SampleScene.unity b/Scenes/SampleScene.unity index ad4cbd0..7c49f30 100644 --- a/Scenes/SampleScene.unity +++ b/Scenes/SampleScene.unity @@ -199,7 +199,7 @@ Canvas: m_OverrideSorting: 0 m_OverridePixelPerfect: 0 m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 0 + m_AdditionalShaderChannelsFlag: 25 m_UpdateRectTransformForStandalone: 0 m_SortingLayerID: 0 m_SortingOrder: 0 @@ -625,6 +625,90 @@ Transform: m_Father: {fileID: 507038910} m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1648230696 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1648230698} + - component: {fileID: 1648230697} + m_Layer: 0 + m_Name: Square + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!212 &1648230697 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1648230696} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1648230698 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1648230696} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1701140682 GameObject: m_ObjectHideFlags: 0 @@ -752,14 +836,14 @@ MonoBehaviour: m_Calls: [] m_text: Button m_isRightToLeft: 0 - m_fontAsset: {fileID: 0} - m_sharedMaterial: {fileID: 0} + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 + rgba: 4281479730 m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 @@ -772,7 +856,7 @@ MonoBehaviour: m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 + m_TextStyleHashCode: -1183493901 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 @@ -803,7 +887,7 @@ MonoBehaviour: checkPaddingRequired: 0 m_isRichText: 1 m_parseCtrlCharacters: 1 - m_isOrthographic: 0 + m_isOrthographic: 1 m_isCullingEnabled: 0 m_horizontalMapping: 0 m_verticalMapping: 0 diff --git a/TNode/Attribute/GraphUsageAttribute.cs b/TNode/Attribute/GraphUsageAttribute.cs index fd17135..67f1ff4 100644 --- a/TNode/Attribute/GraphUsageAttribute.cs +++ b/TNode/Attribute/GraphUsageAttribute.cs @@ -13,6 +13,7 @@ namespace TNode.Attribute{ /// [AttributeUsage(AttributeTargets.Class)] [BaseTypeRequired(typeof(IModel))] + [UsedImplicitly] public class GraphUsageAttribute:System.Attribute{ public readonly Type GraphDataType; public string Category; diff --git a/TNode/Editor/Serialization/DataWrapper.cs b/TNode/DataWrapper.cs similarity index 87% rename from TNode/Editor/Serialization/DataWrapper.cs rename to TNode/DataWrapper.cs index 7fed251..9aec6b7 100644 --- a/TNode/Editor/Serialization/DataWrapper.cs +++ b/TNode/DataWrapper.cs @@ -5,10 +5,10 @@ using UnityEngine; namespace TNode.Editor.Serialization{ [Serializable] - public class DataWrapper:ScriptableObject where TWrapper:DataWrapper where TData:IModel,new(){ + public class DataWrapper:ScriptableObject where TWrapper:DataWrapper,new(){ [SerializeReference] public TData data; - private static readonly Dictionary Cache = new (); + protected static readonly Dictionary Cache = new (); public static TWrapper Get(TData data){ if (data.GetType().IsGenericType){ return CreateInstance(); @@ -33,10 +33,13 @@ namespace TNode.Editor.Serialization{ var fieldInfo = data.GetType().GetField(path); return fieldInfo.GetValue(data); } + public virtual TData GetData(){ + return data; + } public static implicit operator TData(DataWrapper wrapper){ if (wrapper == null) return default(TData); - return wrapper.data; + return wrapper.GetData(); } /// diff --git a/TNode/Editor/Serialization/DataWrapper.cs.meta b/TNode/DataWrapper.cs.meta similarity index 100% rename from TNode/Editor/Serialization/DataWrapper.cs.meta rename to TNode/DataWrapper.cs.meta diff --git a/TNode/Models/BlackboardData.cs b/TNode/Models/BlackboardData.cs index 14cff62..ad1a97e 100644 --- a/TNode/Models/BlackboardData.cs +++ b/TNode/Models/BlackboardData.cs @@ -1,8 +1,13 @@ using System; +using System.Collections.Generic; +using Object = UnityEngine.Object; namespace TNode.Models{ + /// + /// Black board data can store scene data + /// [Serializable] + public class BlackboardData:IModel{ - } } \ No newline at end of file diff --git a/TNode/Models/GraphData.cs b/TNode/Models/GraphData.cs index d5c01e4..31fcb39 100644 --- a/TNode/Models/GraphData.cs +++ b/TNode/Models/GraphData.cs @@ -17,6 +17,9 @@ namespace TNode.Models{ [SerializeReference] public BlackboardData blackboardData; + [HideInInspector] + public string sceneReference; + public List NodeLinks{ get{ return nodeLinks ??= new List(); diff --git a/TNode/Models/SceneObjectWrapper.cs b/TNode/Models/SceneObjectWrapper.cs new file mode 100644 index 0000000..cc75204 --- /dev/null +++ b/TNode/Models/SceneObjectWrapper.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using System.Linq; +using TNode.Editor.Serialization; +using UnityEngine; + +namespace TNode.Models{ + + /// + /// Scene Object wrapper use to serialize blackboard data + /// + public class SceneObjectWrapper:DataWrapper{ + public bool loadedFromScene =false; + + public List sceneObjects = new List(); + public void LoadFromScene(){ + + } + public override BlackboardData GetData(){ + if (data == null) return null; + if (!Cache.ContainsKey(this)){ + Cache.Add(data,this); + } + + if (loadedFromScene==false){ + loadedFromScene = true; + } + + return data; + } + } +} \ No newline at end of file diff --git a/TNode/Models/SceneObjectWrapper.cs.meta b/TNode/Models/SceneObjectWrapper.cs.meta new file mode 100644 index 0000000..9c22ed3 --- /dev/null +++ b/TNode/Models/SceneObjectWrapper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9603719ce2e546968394c0f2a0c83ef3 +timeCreated: 1657774760 \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index 69ffebc..e848d1c 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -20,6 +20,7 @@ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ } protected override void UpdateBlackboard(BlackboardData data){ + if (data == null) return; var serializedObject = new SerializedObject((BlackboardDataWrapper)data); foreach (var field in data.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ From 1738d00b8c25a27771735fcf6aa35ee9d90f6897 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Fri, 15 Jul 2022 17:27:20 +0800 Subject: [PATCH 13/17] feat: force blackboard select no scene object --- Resources.meta | 8 + ...Newtonsoft.Json-for-Unity.Converters.asset | 162 +++++++++++++++++ ...nsoft.Json-for-Unity.Converters.asset.meta | 8 + Sample/TestExposedReference.cs | 10 ++ Sample/TestExposedReference.cs.meta | 3 + TNode/DataWrapper.cs | 2 + TNode/Editor/Serialization/NodeDataWrapper.cs | 2 +- TNode/Models/SceneObjectWrapper.cs | 167 +++++++++++++++++- TNode/Runtime/SceneSerializedData.cs | 9 + TNode/Runtime/SceneSerializedData.cs.meta | 3 + TNode/RuntimeCache/RuntimeCache.cs | 41 +++-- .../DefaultGraphBlackboardView.cs | 5 +- .../GraphBlackboardPropertyField.cs | 21 +++ .../GraphBlackboardPropertyField.cs.meta | 3 + TextMesh Pro.meta | 8 + 15 files changed, 430 insertions(+), 22 deletions(-) create mode 100644 Resources.meta create mode 100644 Resources/Newtonsoft.Json-for-Unity.Converters.asset create mode 100644 Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta create mode 100644 Sample/TestExposedReference.cs create mode 100644 Sample/TestExposedReference.cs.meta create mode 100644 TNode/Runtime/SceneSerializedData.cs create mode 100644 TNode/Runtime/SceneSerializedData.cs.meta create mode 100644 TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs create mode 100644 TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs.meta create mode 100644 TextMesh Pro.meta diff --git a/Resources.meta b/Resources.meta new file mode 100644 index 0000000..d428cde --- /dev/null +++ b/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 630fb8569cca3804a80f2fb55f7890f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Resources/Newtonsoft.Json-for-Unity.Converters.asset b/Resources/Newtonsoft.Json-for-Unity.Converters.asset new file mode 100644 index 0000000..b01ce28 --- /dev/null +++ b/Resources/Newtonsoft.Json-for-Unity.Converters.asset @@ -0,0 +1,162 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ce56e4dbb13e1644aa983b6dd170e4a7, type: 3} + m_Name: Newtonsoft.Json-for-Unity.Converters + m_EditorClassIdentifier: + useUnityContractResolver: 1 + useAllOutsideConverters: 0 + outsideConverters: + - enabled: 0 + converterName: TNode.JsonSerialize.NodeDataConverter + settings: [] + - enabled: 0 + converterName: TNode.JsonSerialize.UnityObjectConverter + settings: [] + - enabled: 0 + converterName: TNode.JsonSerialize.Vector3Converter + settings: [] + useAllUnityConverters: 1 + unityConverters: + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.AI.NavMesh.NavMeshQueryFilterConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.AI.NavMesh.NavMeshTriangulationConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Camera.CullingGroupEventConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Geometry.BoundsConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Geometry.BoundsIntConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Geometry.PlaneConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Geometry.RectConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Geometry.RectIntConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Geometry.RectOffsetConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Hashing.Hash128Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Color32Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.ColorConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Matrix4x4Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.QuaternionConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.SphericalHarmonicsL2Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Vector2Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Vector2IntConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Vector3Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Vector3IntConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Math.Vector4Converter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.NativeArray.NativeArrayConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Physics.JointDriveConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Physics.JointLimitsConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Physics.SoftJointLimitConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Physics2D.ColliderDistance2DConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Physics2D.ContactFilter2DConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Random.RandomStateConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Scripting.LayerMaskConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.UnityConverters.Scripting.RangeIntConverter + settings: [] + useAllJsonNetConverters: 1 + jsonNetConverters: + - enabled: 1 + converterName: Newtonsoft.Json.Converters.StringEnumConverter + settings: [] + - enabled: 1 + converterName: Newtonsoft.Json.Converters.VersionConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.BinaryConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.BsonObjectIdConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.DataSetConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.DataTableConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.DiscriminatedUnionConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.EntityKeyMemberConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.ExpandoObjectConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.IsoDateTimeConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.JavaScriptDateTimeConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.KeyValuePairConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.RegexConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.UnixDateTimeConverter + settings: [] + - enabled: 0 + converterName: Newtonsoft.Json.Converters.XmlNodeConverter + settings: [] diff --git a/Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta b/Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta new file mode 100644 index 0000000..ec4e066 --- /dev/null +++ b/Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 466d3febdbd656c4f9728b1116b1564f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Sample/TestExposedReference.cs b/Sample/TestExposedReference.cs new file mode 100644 index 0000000..a44add9 --- /dev/null +++ b/Sample/TestExposedReference.cs @@ -0,0 +1,10 @@ +using UnityEngine; + +namespace Sample{ + // Create at Asset/Test + [CreateAssetMenu(fileName = "NewData", menuName = "Test/Data", order = 1)] + public class TestExposedReference:ScriptableObject{ + public ExposedReference camera; + public ExposedReference go; + } +} \ No newline at end of file diff --git a/Sample/TestExposedReference.cs.meta b/Sample/TestExposedReference.cs.meta new file mode 100644 index 0000000..f6c4b0e --- /dev/null +++ b/Sample/TestExposedReference.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fed858872d394fb8896d48178f8a7d78 +timeCreated: 1657862979 \ No newline at end of file diff --git a/TNode/DataWrapper.cs b/TNode/DataWrapper.cs index 9aec6b7..95b3afd 100644 --- a/TNode/DataWrapper.cs +++ b/TNode/DataWrapper.cs @@ -21,6 +21,8 @@ namespace TNode.Editor.Serialization{ Cache.Add(data,wrapper); return wrapper; } + + public event Action> OnValueChanged; public void SetValue(string path, object value){ diff --git a/TNode/Editor/Serialization/NodeDataWrapper.cs b/TNode/Editor/Serialization/NodeDataWrapper.cs index cff0ea0..816df2e 100644 --- a/TNode/Editor/Serialization/NodeDataWrapper.cs +++ b/TNode/Editor/Serialization/NodeDataWrapper.cs @@ -60,7 +60,7 @@ namespace TNode.Editor.Serialization{ // private static readonly Dictionary Cache = new (); // public event Action OnValueChanged; // /// - // /// Create a new wrapper or get a cached wrapper for the given data + // /// Create a new wrapper or get a infoCached wrapper for the given data // /// // /// node data,an implemented type is acceptable // /// diff --git a/TNode/Models/SceneObjectWrapper.cs b/TNode/Models/SceneObjectWrapper.cs index cc75204..169099c 100644 --- a/TNode/Models/SceneObjectWrapper.cs +++ b/TNode/Models/SceneObjectWrapper.cs @@ -1,7 +1,11 @@ -using System.Collections.Generic; -using System.Linq; +using System; +using System.Collections.Generic; using TNode.Editor.Serialization; +using TNode.RuntimeCache; using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.Serialization; +using Object = UnityEngine.Object; namespace TNode.Models{ @@ -9,23 +13,170 @@ namespace TNode.Models{ /// Scene Object wrapper use to serialize blackboard data /// public class SceneObjectWrapper:DataWrapper{ - public bool loadedFromScene =false; + public bool loadedFromScene = false; + [NonSerialized] + public List PossibleSceneFields; + public List SceneFields; + public struct SceneSerializationEntry{ + public string ScenePath; + public string FieldName; + public string SceneObject; - public List sceneObjects = new List(); - public void LoadFromScene(){ - } + public bool infoCached; + //Reflection may be expensive, so we cache the type + + public Type Type; + //we need to cache blackboard data info + public void LoadBlackboardInfo(){ + if (infoCached) return; + infoCached = true; + Type = data.GetType(); + PossibleSceneFields = new List(); + foreach (var field in Type.GetFields()){ + if (field.FieldType == typeof(Object)){ + PossibleSceneFields.Add(field.Name); + } + } + } + #region Oboselete Region for serialization + + // + // public string BuildThroughTransform(Object go, Transform root,int id){ + // if (root.gameObject == go) return $"/{id}"; + // var res = root.transform.Find(go.name); + // if (res != null){ + // for (int j = 0; j < root.transform.childCount; j++){ + // var child = root.transform.GetChild(j); + // var childRes = BuildThroughTransform(go,child,j); + // if(childRes=="") continue; + // return $"/{id}{childRes}"; + // } + // } + // return ""; + // } + // public string BuildPath(Object go,GameObject[] roots){ + // + // //Search root objects + // for(int i=0;i= '0' and <= '9'){ + // var index = int.Parse(path[i]); + // currentGo = currentGo.transform.GetChild(index).gameObject; + // data.SetValue(s.FieldName,currentGo); + // } + // else{ + // isBehaviour = true; + // behaviour= currentGo.GetComponent(path[i]) as Behaviour; + // data.SetValue(s.FieldName,behaviour); + // } + // } + // else{ + // var index = int.Parse(path[i]); + // currentGo = currentGo?.transform?.GetChild(index).gameObject; + // } + // } + // } + // } + // } + // } + // } + + #endregion + + public override BlackboardData GetData(){ if (data == null) return null; + LoadBlackboardInfo(); if (!Cache.ContainsKey(this)){ Cache.Add(data,this); } - if (loadedFromScene==false){ loadedFromScene = true; + Load(); } - return data; } + + private void Load(){ + var res = SceneManager.GetActiveScene(); + GameObject.FindGameObjectsWithTag("SerializedData"); + } } } \ No newline at end of file diff --git a/TNode/Runtime/SceneSerializedData.cs b/TNode/Runtime/SceneSerializedData.cs new file mode 100644 index 0000000..906c7f1 --- /dev/null +++ b/TNode/Runtime/SceneSerializedData.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +namespace TNode.Runtime{ + public class SceneSerializedData:MonoBehaviour{ + public GameObject serializedObject; + public Behaviour serializedFeature; + public bool isComponent; + } +} \ No newline at end of file diff --git a/TNode/Runtime/SceneSerializedData.cs.meta b/TNode/Runtime/SceneSerializedData.cs.meta new file mode 100644 index 0000000..b2b41a7 --- /dev/null +++ b/TNode/Runtime/SceneSerializedData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2f2dd6542406480ea3fec1d9527ffba8 +timeCreated: 1657874785 \ No newline at end of file diff --git a/TNode/RuntimeCache/RuntimeCache.cs b/TNode/RuntimeCache/RuntimeCache.cs index b46593a..cf0be53 100644 --- a/TNode/RuntimeCache/RuntimeCache.cs +++ b/TNode/RuntimeCache/RuntimeCache.cs @@ -16,33 +16,42 @@ namespace TNode.RuntimeCache{ } //delegate return a value from a nodedata public delegate object GetValueDelegate(IModel nodeData); - public delegate object SetValueDelegate(IModel nodeData,object value); + public delegate void SetValueDelegate(object nodeData,object value); public readonly Dictionary> CachedDelegatesForGettingValue = new (); - + public readonly Dictionary> CachedDelegatesForSettingValue = + new (); + private static readonly string[] ExcludedAssemblies = new string[]{"Microsoft", "UnityEngine","UnityEditor","mscorlib","System"}; public RuntimeCache(){ RegisterRuntimeBlackboard(typeof(EasyBlackboardData)); } public void RegisterRuntimeBlackboard(Type type){ + if (type == null) return; if(!CachedDelegatesForGettingValue.ContainsKey(type)){ CachedDelegatesForGettingValue.Add(type, new Dictionary()); + CachedDelegatesForSettingValue.Add(type,new Dictionary()); + var properties = type.GetProperties(); foreach(var property in properties){ //if the property only has a setter ,skip - if(property.GetMethod == null){ - continue; - } + var getValueDelegate = GetValueDelegateForProperty(property); CachedDelegatesForGettingValue[type].Add(property.Name,getValueDelegate); + + var setValueDelegate = SetValueDelegateForProperty(property); + CachedDelegatesForSettingValue[type].Add(property.Name,setValueDelegate); } //register the fields var fields = type.GetFields(); foreach(var field in fields){ var getValueDelegate = GetValueDelegateForField(field); CachedDelegatesForGettingValue[type].Add(field.Name,getValueDelegate); + + var setValueDelegate = SetValueDelegateForField(field); + CachedDelegatesForSettingValue[type].Add(field.Name,setValueDelegate); } } } @@ -50,15 +59,18 @@ namespace TNode.RuntimeCache{ private GetValueDelegate GetValueDelegateForField(FieldInfo field){ return field.GetValue; } - - + private SetValueDelegate SetValueDelegateForField(FieldInfo field){ + return field.SetValue; + } private GetValueDelegate GetValueDelegateForProperty(PropertyInfo property){ var getValueDelegate = (GetValueDelegate)Delegate.CreateDelegate(typeof(GetValueDelegate), property.GetGetMethod()); return getValueDelegate; } - - - + private SetValueDelegate SetValueDelegateForProperty(PropertyInfo property){ + var setValueDelegate = (SetValueDelegate)Delegate.CreateDelegate(typeof(SetValueDelegate), property.GetSetMethod()); + return setValueDelegate; + } + } public static class RuntimeExtension{ @@ -67,11 +79,18 @@ namespace TNode.RuntimeCache{ var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; return (T) method.Invoke(blackboardData); } - public static object GetValue(this BlackboardData blackboardData, string path){ var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; return method.Invoke(blackboardData); } + public static void SetValue(this BlackboardData blackboardData,string path,T value){ + var method = RuntimeCache.Instance.CachedDelegatesForSettingValue[blackboardData.GetType()][path]; + method.Invoke(blackboardData,value); + } + public static void SetValue(this BlackboardData blackboardData,string path,object value){ + var method = RuntimeCache.Instance.CachedDelegatesForSettingValue[blackboardData.GetType()][path]; + method.Invoke(blackboardData,value); + } public static RuntimeCache.GetValueDelegate GetValueDelegate(this BlackboardData blackboardData,string path){ var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; return method; diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index e848d1c..ac22902 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -32,12 +32,13 @@ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ var foldoutData = new Foldout{ text = field.Name }; - var drawer = new PropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name); + var drawer = new GraphBlackboardPropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name); drawer.Bind(serializedObject); foldoutData.Add(drawer); visualElement.Add(propertyField); visualElement.Add(foldoutData); - this.Add(visualElement); + + Add(visualElement); } else{ diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs new file mode 100644 index 0000000..fda833c --- /dev/null +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs @@ -0,0 +1,21 @@ +using UnityEditor; +using UnityEditor.UIElements; +using UnityEngine.UIElements; + +namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ + public class GraphBlackboardPropertyField:PropertyField{ + public GraphBlackboardPropertyField(SerializedProperty findPropertyRelative, string fieldName):base(findPropertyRelative, fieldName){ + + } + + protected override void ExecuteDefaultActionAtTarget(EventBase evt) + { + base.ExecuteDefaultActionAtTarget(evt); + if (this.Q() != null){ + this.Q().allowSceneObjects = false; + } + } + + + } +} \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs.meta b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs.meta new file mode 100644 index 0000000..c53a526 --- /dev/null +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 39e7ba9513c34ea0814f018befd8d7ad +timeCreated: 1657876733 \ No newline at end of file diff --git a/TextMesh Pro.meta b/TextMesh Pro.meta new file mode 100644 index 0000000..f9da8b5 --- /dev/null +++ b/TextMesh Pro.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f54d1bd14bd3ca042bd867b519fee8cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From fb19efe0d2fe462033de32d930aa191639b6a1cc Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Sat, 16 Jul 2022 10:38:42 +0800 Subject: [PATCH 14/17] refactor:Build TNodeCore --- Sample/MathGraph/Editor/MathGraphView.cs | 3 +- Sample/MathGraph/MathGraph.cs | 3 +- .../Serialization/BlackboardDataWrapper.cs | 10 ---- TNode/Runtime/RuntimeGraph.cs | 28 --------- TNode.meta => TNodeCore.meta | 0 {TNode => TNodeCore}/Attribute.meta | 0 .../Attribute/DisableOnInspector.cs | 2 +- .../Attribute/DisableOnInspector.cs.meta | 0 .../Attribute/GraphUsageAttribute.cs | 5 +- .../Attribute/GraphUsageAttribute.cs.meta | 0 .../Attribute/NodeAttribute.cs | 4 +- .../Attribute/NodeAttribute.cs.meta | 0 {TNode => TNodeCore}/Attribute/Ports.meta | 0 .../Attribute/Ports/BatchInputAttribute.cs | 2 +- .../Ports/BatchInputAttribute.cs.meta | 0 .../Attribute/Ports/BatchOutputAttribute.cs | 3 +- .../Ports/BatchOutputAttribute.cs.meta | 0 .../Attribute/Ports/InputAttribute.cs | 2 +- .../Attribute/Ports/InputAttribute.cs.meta | 0 .../Attribute/Ports/OutputAttribute.cs | 2 +- .../Attribute/Ports/OutputAttribute.cs.meta | 0 .../Attribute/Ports/PortAttribute.cs | 2 +- .../Attribute/Ports/PortAttribute.cs.meta | 0 .../Attribute/ShowInNodeViewAttribute.cs | 2 +- .../Attribute/ShowInNodeViewAttribute.cs.meta | 0 .../Attribute/ViewComponentAttribute.cs | 4 +- .../Attribute/ViewComponentAttribute.cs.meta | 0 {TNode => TNodeCore}/DataWrapper.cs | 3 +- {TNode => TNodeCore}/DataWrapper.cs.meta | 0 {TNode => TNodeCore}/Editor.meta | 0 {TNode => TNodeCore}/Editor/Blackboard.meta | 0 .../Editor/Blackboard/IBlackboardView.cs | 7 +-- .../Editor/Blackboard/IBlackboardView.cs.meta | 0 .../Editor/EditorPersistence.meta | 0 .../EditorPersistence/GraphEditorData.cs | 2 +- .../EditorPersistence/GraphEditorData.cs.meta | 0 .../GraphElementEditorData.cs | 2 +- .../GraphElementEditorData.cs.meta | 0 .../IGraphViewPersistence.cs | 2 +- .../IGraphViewPersistence.cs.meta | 0 .../EditorPersistence/SubWindowEditorData.cs | 2 +- .../SubWindowEditorData.cs.meta | 0 {TNode => TNodeCore}/Editor/Inspector.meta | 0 .../Editor/Inspector/INodeDataBinding.cs | 5 +- .../Editor/Inspector/INodeDataBinding.cs.meta | 0 .../Editor/Inspector/INodeDataBindingBase.cs | 4 +- .../Inspector/INodeDataBindingBase.cs.meta | 0 .../Editor/NodeGraphView.meta | 0 .../NodeGraphView/IBaseDataGraphView.cs | 4 +- .../NodeGraphView/IBaseDataGraphView.cs.meta | 0 .../Editor/NodeGraphView/IDataGraphView.cs | 4 +- .../NodeGraphView/IDataGraphView.cs.meta | 0 TNodeCore/Editor/PropertyDrawer.meta | 3 + .../Editor/PropertyDrawer/PropertyDrawer.cs | 60 +++++++++++++++++++ .../PropertyDrawer/PropertyDrawer.cs.meta | 3 + {TNode => TNodeCore}/Editor/Resources.meta | 0 .../Editor/Resources/DefaultNodeData.asset | 0 .../Resources/DefaultNodeData.asset.meta | 0 .../Editor/Resources/GraphEditor.uss | 0 .../Editor/Resources/GraphEditor.uss.meta | 0 .../Editor/Resources/GraphEditor.uxml | 0 .../Editor/Resources/GraphEditor.uxml.meta | 0 .../Editor/Resources/GraphViewBackground.uss | 0 .../Resources/GraphViewBackground.uss.meta | 0 .../Editor/Resources/NodeInspector.uss | 0 .../Editor/Resources/NodeInspector.uss.meta | 0 .../Editor/Resources/NodeInspector.uxml | 0 .../Editor/Resources/NodeInspector.uxml.meta | 0 .../Editor/Resources/ScriptTemplates.meta | 0 .../Resources/ScriptTemplates/NewGraph.cs.txt | 0 .../ScriptTemplates/NewGraph.cs.txt.meta | 0 .../ScriptTemplates/NewGraphEditor.cs.txt | 0 .../NewGraphEditor.cs.txt.meta | 0 .../ScriptTemplates/NewGraphView.cs.txt | 0 .../ScriptTemplates/NewGraphView.cs.txt.meta | 0 .../Editor/Serialization.meta | 0 .../Serialization/BlackboardDataWrapper.cs | 7 +++ .../BlackboardDataWrapper.cs.meta | 0 .../Editor/Serialization/NodeDataWrapper.cs | 6 +- .../Serialization/NodeDataWrapper.cs.meta | 0 {TNode => TNodeCore}/Editor/Tools.meta | 0 .../Editor/Tools/GraphEditorCreator.meta | 0 .../GraphEditorCreator/GraphEditorCreator.cs | 4 +- .../GraphEditorCreator.cs.meta | 0 .../GraphEditorCreator/GraphEditorCreator.uss | 0 .../GraphEditorCreator.uss.meta | 0 .../GraphEditorCreator.uxml | 0 .../GraphEditorCreator.uxml.meta | 0 .../SourceGeneratorForGraphEditor.cs | 2 +- .../SourceGeneratorForGraphEditor.cs.meta | 0 .../Editor/Tools/NodeCreator.meta | 0 .../Editor/Tools/NodeCreator/NodeCreator.cs | 4 +- .../Tools/NodeCreator/NodeCreator.cs.meta | 0 {TNode => TNodeCore}/Models.meta | 0 {TNode => TNodeCore}/Models/BlackboardData.cs | 4 +- .../Models/BlackboardData.cs.meta | 0 .../Models/BlackboardDragNodeData.cs | 10 +--- .../Models/BlackboardDragNodeData.cs.meta | 0 {TNode => TNodeCore}/Models/GraphData.cs | 4 +- {TNode => TNodeCore}/Models/GraphData.cs.meta | 0 {TNode => TNodeCore}/Models/IModel.cs | 2 +- {TNode => TNodeCore}/Models/IModel.cs.meta | 0 {TNode => TNodeCore}/Models/NodeData.cs | 5 +- {TNode => TNodeCore}/Models/NodeData.cs.meta | 0 {TNode => TNodeCore}/Models/NodeLink.cs | 4 +- {TNode => TNodeCore}/Models/NodeLink.cs.meta | 0 {TNode => TNodeCore}/Models/PortInfo.cs | 2 +- {TNode => TNodeCore}/Models/PortInfo.cs.meta | 0 .../Models/SceneObjectWrapper.cs | 5 +- .../Models/SceneObjectWrapper.cs.meta | 0 {TNode => TNodeCore}/Runtime.meta | 0 TNodeCore/Runtime/RuntimeGraph.cs | 23 +++++++ .../Runtime/RuntimeGraph.cs.meta | 0 {TNode => TNodeCore}/Runtime/RuntimeNode.cs | 9 +-- .../Runtime/RuntimeNode.cs.meta | 0 .../Runtime/Runtimeblackboard.cs | 5 +- .../Runtime/Runtimeblackboard.cs.meta | 0 .../Runtime/SceneSerializedData.cs | 2 +- .../Runtime/SceneSerializedData.cs.meta | 0 {TNode => TNodeCore}/RuntimeCache.meta | 0 .../RuntimeCache/RuntimeCache.cs | 59 +++++++++++++++--- .../RuntimeCache/RuntimeCache.cs.meta | 0 TNodeCore/TNodeCore.asmdef | 3 + TNodeCore/TNodeCore.asmdef.meta | 7 +++ .../Editor/Cache/NodeEditorExtensions.cs | 10 +--- .../DefaultGraphBlackboardView.cs | 7 +-- .../GraphBlackboardPropertyField.cs | 1 + .../GraphBlackboard/GraphBlackboardView.cs | 8 +-- TNodeGraphViewImpl/Editor/GraphEditor.cs | 4 +- .../Editor/Inspector/NodeInspector.cs | 3 +- .../Editor/Inspector/NodeInspectorInNode.cs | 6 +- .../Editor/NodeGraphView/DataGraphView.cs | 10 ++-- .../NodeGraphView/SimpleGraphSubWindow.cs | 2 +- .../Editor/NodeViews/DefaultNodeView.cs | 2 +- .../Editor/NodeViews/DragNodeView.cs | 4 +- .../Editor/NodeViews/NodeView.cs | 7 ++- .../Search/BlackboardSearchWindowProvider.cs | 2 +- .../Editor/Search/NodeSearchWindowProvider.cs | 6 +- 138 files changed, 246 insertions(+), 166 deletions(-) delete mode 100644 TNode/Editor/Serialization/BlackboardDataWrapper.cs delete mode 100644 TNode/Runtime/RuntimeGraph.cs rename TNode.meta => TNodeCore.meta (100%) rename {TNode => TNodeCore}/Attribute.meta (100%) rename {TNode => TNodeCore}/Attribute/DisableOnInspector.cs (90%) rename {TNode => TNodeCore}/Attribute/DisableOnInspector.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/GraphUsageAttribute.cs (92%) rename {TNode => TNodeCore}/Attribute/GraphUsageAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/NodeAttribute.cs (80%) rename {TNode => TNodeCore}/Attribute/NodeAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/Ports.meta (100%) rename {TNode => TNodeCore}/Attribute/Ports/BatchInputAttribute.cs (56%) rename {TNode => TNodeCore}/Attribute/Ports/BatchInputAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/Ports/BatchOutputAttribute.cs (83%) rename {TNode => TNodeCore}/Attribute/Ports/BatchOutputAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/Ports/InputAttribute.cs (91%) rename {TNode => TNodeCore}/Attribute/Ports/InputAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/Ports/OutputAttribute.cs (86%) rename {TNode => TNodeCore}/Attribute/Ports/OutputAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/Ports/PortAttribute.cs (95%) rename {TNode => TNodeCore}/Attribute/Ports/PortAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/ShowInNodeViewAttribute.cs (84%) rename {TNode => TNodeCore}/Attribute/ShowInNodeViewAttribute.cs.meta (100%) rename {TNode => TNodeCore}/Attribute/ViewComponentAttribute.cs (81%) rename {TNode => TNodeCore}/Attribute/ViewComponentAttribute.cs.meta (100%) rename {TNode => TNodeCore}/DataWrapper.cs (96%) rename {TNode => TNodeCore}/DataWrapper.cs.meta (100%) rename {TNode => TNodeCore}/Editor.meta (100%) rename {TNode => TNodeCore}/Editor/Blackboard.meta (100%) rename {TNode => TNodeCore}/Editor/Blackboard/IBlackboardView.cs (79%) rename {TNode => TNodeCore}/Editor/Blackboard/IBlackboardView.cs.meta (100%) rename {TNode => TNodeCore}/Editor/EditorPersistence.meta (100%) rename {TNode => TNodeCore}/Editor/EditorPersistence/GraphEditorData.cs (85%) rename {TNode => TNodeCore}/Editor/EditorPersistence/GraphEditorData.cs.meta (100%) rename {TNode => TNodeCore}/Editor/EditorPersistence/GraphElementEditorData.cs (77%) rename {TNode => TNodeCore}/Editor/EditorPersistence/GraphElementEditorData.cs.meta (100%) rename {TNode => TNodeCore}/Editor/EditorPersistence/IGraphViewPersistence.cs (84%) rename {TNode => TNodeCore}/Editor/EditorPersistence/IGraphViewPersistence.cs.meta (100%) rename {TNode => TNodeCore}/Editor/EditorPersistence/SubWindowEditorData.cs (51%) rename {TNode => TNodeCore}/Editor/EditorPersistence/SubWindowEditorData.cs.meta (100%) rename {TNode => TNodeCore}/Editor/Inspector.meta (100%) rename {TNode => TNodeCore}/Editor/Inspector/INodeDataBinding.cs (65%) rename {TNode => TNodeCore}/Editor/Inspector/INodeDataBinding.cs.meta (100%) rename {TNode => TNodeCore}/Editor/Inspector/INodeDataBindingBase.cs (69%) rename {TNode => TNodeCore}/Editor/Inspector/INodeDataBindingBase.cs.meta (100%) rename {TNode => TNodeCore}/Editor/NodeGraphView.meta (100%) rename {TNode => TNodeCore}/Editor/NodeGraphView/IBaseDataGraphView.cs (82%) rename {TNode => TNodeCore}/Editor/NodeGraphView/IBaseDataGraphView.cs.meta (100%) rename {TNode => TNodeCore}/Editor/NodeGraphView/IDataGraphView.cs (63%) rename {TNode => TNodeCore}/Editor/NodeGraphView/IDataGraphView.cs.meta (100%) create mode 100644 TNodeCore/Editor/PropertyDrawer.meta create mode 100644 TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs create mode 100644 TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs.meta rename {TNode => TNodeCore}/Editor/Resources.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/DefaultNodeData.asset (100%) rename {TNode => TNodeCore}/Editor/Resources/DefaultNodeData.asset.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/GraphEditor.uss (100%) rename {TNode => TNodeCore}/Editor/Resources/GraphEditor.uss.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/GraphEditor.uxml (100%) rename {TNode => TNodeCore}/Editor/Resources/GraphEditor.uxml.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/GraphViewBackground.uss (100%) rename {TNode => TNodeCore}/Editor/Resources/GraphViewBackground.uss.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/NodeInspector.uss (100%) rename {TNode => TNodeCore}/Editor/Resources/NodeInspector.uss.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/NodeInspector.uxml (100%) rename {TNode => TNodeCore}/Editor/Resources/NodeInspector.uxml.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates/NewGraph.cs.txt (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates/NewGraph.cs.txt.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt.meta (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt (100%) rename {TNode => TNodeCore}/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt.meta (100%) rename {TNode => TNodeCore}/Editor/Serialization.meta (100%) create mode 100644 TNodeCore/Editor/Serialization/BlackboardDataWrapper.cs rename {TNode => TNodeCore}/Editor/Serialization/BlackboardDataWrapper.cs.meta (100%) rename {TNode => TNodeCore}/Editor/Serialization/NodeDataWrapper.cs (97%) rename {TNode => TNodeCore}/Editor/Serialization/NodeDataWrapper.cs.meta (100%) rename {TNode => TNodeCore}/Editor/Tools.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs (98%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs (97%) rename {TNode => TNodeCore}/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/NodeCreator.meta (100%) rename {TNode => TNodeCore}/Editor/Tools/NodeCreator/NodeCreator.cs (90%) rename {TNode => TNodeCore}/Editor/Tools/NodeCreator/NodeCreator.cs.meta (100%) rename {TNode => TNodeCore}/Models.meta (100%) rename {TNode => TNodeCore}/Models/BlackboardData.cs (64%) rename {TNode => TNodeCore}/Models/BlackboardData.cs.meta (100%) rename {TNode => TNodeCore}/Models/BlackboardDragNodeData.cs (69%) rename {TNode => TNodeCore}/Models/BlackboardDragNodeData.cs.meta (100%) rename {TNode => TNodeCore}/Models/GraphData.cs (93%) rename {TNode => TNodeCore}/Models/GraphData.cs.meta (100%) rename {TNode => TNodeCore}/Models/IModel.cs (57%) rename {TNode => TNodeCore}/Models/IModel.cs.meta (100%) rename {TNode => TNodeCore}/Models/NodeData.cs (92%) rename {TNode => TNodeCore}/Models/NodeData.cs.meta (100%) rename {TNode => TNodeCore}/Models/NodeLink.cs (85%) rename {TNode => TNodeCore}/Models/NodeLink.cs.meta (100%) rename {TNode => TNodeCore}/Models/PortInfo.cs (82%) rename {TNode => TNodeCore}/Models/PortInfo.cs.meta (100%) rename {TNode => TNodeCore}/Models/SceneObjectWrapper.cs (98%) rename {TNode => TNodeCore}/Models/SceneObjectWrapper.cs.meta (100%) rename {TNode => TNodeCore}/Runtime.meta (100%) create mode 100644 TNodeCore/Runtime/RuntimeGraph.cs rename {TNode => TNodeCore}/Runtime/RuntimeGraph.cs.meta (100%) rename {TNode => TNodeCore}/Runtime/RuntimeNode.cs (58%) rename {TNode => TNodeCore}/Runtime/RuntimeNode.cs.meta (100%) rename {TNode => TNodeCore}/Runtime/Runtimeblackboard.cs (59%) rename {TNode => TNodeCore}/Runtime/Runtimeblackboard.cs.meta (100%) rename {TNode => TNodeCore}/Runtime/SceneSerializedData.cs (87%) rename {TNode => TNodeCore}/Runtime/SceneSerializedData.cs.meta (100%) rename {TNode => TNodeCore}/RuntimeCache.meta (100%) rename {TNode => TNodeCore}/RuntimeCache/RuntimeCache.cs (67%) rename {TNode => TNodeCore}/RuntimeCache/RuntimeCache.cs.meta (100%) create mode 100644 TNodeCore/TNodeCore.asmdef create mode 100644 TNodeCore/TNodeCore.asmdef.meta diff --git a/Sample/MathGraph/Editor/MathGraphView.cs b/Sample/MathGraph/Editor/MathGraphView.cs index 05928c2..2e366ef 100644 --- a/Sample/MathGraph/Editor/MathGraphView.cs +++ b/Sample/MathGraph/Editor/MathGraphView.cs @@ -1,5 +1,4 @@ -using TNode.Models; -using TNode.Attribute; +using TNodeCore.Attribute; using TNodeGraphViewImpl.Editor.NodeGraphView; [ViewComponent] diff --git a/Sample/MathGraph/MathGraph.cs b/Sample/MathGraph/MathGraph.cs index 31e37ee..d480670 100644 --- a/Sample/MathGraph/MathGraph.cs +++ b/Sample/MathGraph/MathGraph.cs @@ -1,7 +1,8 @@ -using TNode.Models; using UnityEngine; using UnityEditor; using System; +using TNodeCore.Models; + [CreateAssetMenu(fileName = "New MathGraph", menuName = "TNode/MathGraph")] [Serializable] public class MathGraph : GraphData{ diff --git a/TNode/Editor/Serialization/BlackboardDataWrapper.cs b/TNode/Editor/Serialization/BlackboardDataWrapper.cs deleted file mode 100644 index 5d05035..0000000 --- a/TNode/Editor/Serialization/BlackboardDataWrapper.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using System.Collections.Generic; -using TNode.Models; -using UnityEngine; - -namespace TNode.Editor.Serialization{ - public class BlackboardDataWrapper:DataWrapper{ - - } -} \ No newline at end of file diff --git a/TNode/Runtime/RuntimeGraph.cs b/TNode/Runtime/RuntimeGraph.cs deleted file mode 100644 index 1a140b7..0000000 --- a/TNode/Runtime/RuntimeGraph.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using TNode.Models; -using UnityEngine; - -namespace TNode.Runtime{ - public class RuntimeGraph:MonoBehaviour{ - public GraphData graphData; - public SortedSet _sortedSet; - - public void Start(){ - //iterate through all nodes and add them to the sorted set - foreach (var node in graphData.NodeDictionary.Values){ - - } - } - - public void StartProcessNode(ProcessingStrategy strategy, RuntimeNode entry){ - - } - - } - - public enum ProcessingStrategy{ - BreadthFirst, - DepthFirst - } -} \ No newline at end of file diff --git a/TNode.meta b/TNodeCore.meta similarity index 100% rename from TNode.meta rename to TNodeCore.meta diff --git a/TNode/Attribute.meta b/TNodeCore/Attribute.meta similarity index 100% rename from TNode/Attribute.meta rename to TNodeCore/Attribute.meta diff --git a/TNode/Attribute/DisableOnInspector.cs b/TNodeCore/Attribute/DisableOnInspector.cs similarity index 90% rename from TNode/Attribute/DisableOnInspector.cs rename to TNodeCore/Attribute/DisableOnInspector.cs index 841963c..158ccba 100644 --- a/TNode/Attribute/DisableOnInspector.cs +++ b/TNodeCore/Attribute/DisableOnInspector.cs @@ -1,6 +1,6 @@ using System; -namespace TNode.Attribute{ +namespace TNodeCore.Attribute{ /// /// Use this attribute to mark a field as disabled.An disable field will not be edit by the inspector. /// diff --git a/TNode/Attribute/DisableOnInspector.cs.meta b/TNodeCore/Attribute/DisableOnInspector.cs.meta similarity index 100% rename from TNode/Attribute/DisableOnInspector.cs.meta rename to TNodeCore/Attribute/DisableOnInspector.cs.meta diff --git a/TNode/Attribute/GraphUsageAttribute.cs b/TNodeCore/Attribute/GraphUsageAttribute.cs similarity index 92% rename from TNode/Attribute/GraphUsageAttribute.cs rename to TNodeCore/Attribute/GraphUsageAttribute.cs index 67f1ff4..af08872 100644 --- a/TNode/Attribute/GraphUsageAttribute.cs +++ b/TNodeCore/Attribute/GraphUsageAttribute.cs @@ -1,9 +1,8 @@ using System; using JetBrains.Annotations; -using TNode.Models; -using Unity.VisualScripting; +using TNodeCore.Models; -namespace TNode.Attribute{ +namespace TNodeCore.Attribute{ /// /// Use this attribute to claim the usage of a type derived IModel IModel /// it can be applied to the same node multiple times. diff --git a/TNode/Attribute/GraphUsageAttribute.cs.meta b/TNodeCore/Attribute/GraphUsageAttribute.cs.meta similarity index 100% rename from TNode/Attribute/GraphUsageAttribute.cs.meta rename to TNodeCore/Attribute/GraphUsageAttribute.cs.meta diff --git a/TNode/Attribute/NodeAttribute.cs b/TNodeCore/Attribute/NodeAttribute.cs similarity index 80% rename from TNode/Attribute/NodeAttribute.cs rename to TNodeCore/Attribute/NodeAttribute.cs index f27663f..447e36f 100644 --- a/TNode/Attribute/NodeAttribute.cs +++ b/TNodeCore/Attribute/NodeAttribute.cs @@ -1,7 +1,7 @@ using JetBrains.Annotations; -using TNode.Models; +using TNodeCore.Models; -namespace TNode.Attribute{ +namespace TNodeCore.Attribute{ [MeansImplicitUse] [BaseTypeRequired(typeof(NodeData))] diff --git a/TNode/Attribute/NodeAttribute.cs.meta b/TNodeCore/Attribute/NodeAttribute.cs.meta similarity index 100% rename from TNode/Attribute/NodeAttribute.cs.meta rename to TNodeCore/Attribute/NodeAttribute.cs.meta diff --git a/TNode/Attribute/Ports.meta b/TNodeCore/Attribute/Ports.meta similarity index 100% rename from TNode/Attribute/Ports.meta rename to TNodeCore/Attribute/Ports.meta diff --git a/TNode/Attribute/Ports/BatchInputAttribute.cs b/TNodeCore/Attribute/Ports/BatchInputAttribute.cs similarity index 56% rename from TNode/Attribute/Ports/BatchInputAttribute.cs rename to TNodeCore/Attribute/Ports/BatchInputAttribute.cs index 4786d55..76217b7 100644 --- a/TNode/Attribute/Ports/BatchInputAttribute.cs +++ b/TNodeCore/Attribute/Ports/BatchInputAttribute.cs @@ -1,4 +1,4 @@ -namespace TNode.Attribute.Ports{ +namespace TNodeCore.Attribute.Ports{ public class BatchInputAttribute{ } diff --git a/TNode/Attribute/Ports/BatchInputAttribute.cs.meta b/TNodeCore/Attribute/Ports/BatchInputAttribute.cs.meta similarity index 100% rename from TNode/Attribute/Ports/BatchInputAttribute.cs.meta rename to TNodeCore/Attribute/Ports/BatchInputAttribute.cs.meta diff --git a/TNode/Attribute/Ports/BatchOutputAttribute.cs b/TNodeCore/Attribute/Ports/BatchOutputAttribute.cs similarity index 83% rename from TNode/Attribute/Ports/BatchOutputAttribute.cs rename to TNodeCore/Attribute/Ports/BatchOutputAttribute.cs index 71a20c3..5b21830 100644 --- a/TNode/Attribute/Ports/BatchOutputAttribute.cs +++ b/TNodeCore/Attribute/Ports/BatchOutputAttribute.cs @@ -1,7 +1,6 @@ using System; -using UnityEditor.Experimental.GraphView; -namespace TNode.Attribute.Ports{ +namespace TNodeCore.Attribute.Ports{ /// /// Batch out port attribute could specify a batch out port,allowing large scale calculation. /// diff --git a/TNode/Attribute/Ports/BatchOutputAttribute.cs.meta b/TNodeCore/Attribute/Ports/BatchOutputAttribute.cs.meta similarity index 100% rename from TNode/Attribute/Ports/BatchOutputAttribute.cs.meta rename to TNodeCore/Attribute/Ports/BatchOutputAttribute.cs.meta diff --git a/TNode/Attribute/Ports/InputAttribute.cs b/TNodeCore/Attribute/Ports/InputAttribute.cs similarity index 91% rename from TNode/Attribute/Ports/InputAttribute.cs rename to TNodeCore/Attribute/Ports/InputAttribute.cs index 3755188..80a92a6 100644 --- a/TNode/Attribute/Ports/InputAttribute.cs +++ b/TNodeCore/Attribute/Ports/InputAttribute.cs @@ -1,7 +1,7 @@ using System; using JetBrains.Annotations; -namespace TNode.Attribute.Ports{ +namespace TNodeCore.Attribute.Ports{ [MeansImplicitUse] [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class InputAttribute : PortAttribute{ diff --git a/TNode/Attribute/Ports/InputAttribute.cs.meta b/TNodeCore/Attribute/Ports/InputAttribute.cs.meta similarity index 100% rename from TNode/Attribute/Ports/InputAttribute.cs.meta rename to TNodeCore/Attribute/Ports/InputAttribute.cs.meta diff --git a/TNode/Attribute/Ports/OutputAttribute.cs b/TNodeCore/Attribute/Ports/OutputAttribute.cs similarity index 86% rename from TNode/Attribute/Ports/OutputAttribute.cs rename to TNodeCore/Attribute/Ports/OutputAttribute.cs index b9c6888..7fb3c8d 100644 --- a/TNode/Attribute/Ports/OutputAttribute.cs +++ b/TNodeCore/Attribute/Ports/OutputAttribute.cs @@ -1,4 +1,4 @@ -namespace TNode.Attribute.Ports{ +namespace TNodeCore.Attribute.Ports{ public class OutputAttribute:PortAttribute{ diff --git a/TNode/Attribute/Ports/OutputAttribute.cs.meta b/TNodeCore/Attribute/Ports/OutputAttribute.cs.meta similarity index 100% rename from TNode/Attribute/Ports/OutputAttribute.cs.meta rename to TNodeCore/Attribute/Ports/OutputAttribute.cs.meta diff --git a/TNode/Attribute/Ports/PortAttribute.cs b/TNodeCore/Attribute/Ports/PortAttribute.cs similarity index 95% rename from TNode/Attribute/Ports/PortAttribute.cs rename to TNodeCore/Attribute/Ports/PortAttribute.cs index 1ade1cc..fe49e84 100644 --- a/TNode/Attribute/Ports/PortAttribute.cs +++ b/TNodeCore/Attribute/Ports/PortAttribute.cs @@ -1,7 +1,7 @@ using System; using JetBrains.Annotations; -namespace TNode.Attribute.Ports{ +namespace TNodeCore.Attribute.Ports{ public enum PortNameHandling{ Auto, diff --git a/TNode/Attribute/Ports/PortAttribute.cs.meta b/TNodeCore/Attribute/Ports/PortAttribute.cs.meta similarity index 100% rename from TNode/Attribute/Ports/PortAttribute.cs.meta rename to TNodeCore/Attribute/Ports/PortAttribute.cs.meta diff --git a/TNode/Attribute/ShowInNodeViewAttribute.cs b/TNodeCore/Attribute/ShowInNodeViewAttribute.cs similarity index 84% rename from TNode/Attribute/ShowInNodeViewAttribute.cs rename to TNodeCore/Attribute/ShowInNodeViewAttribute.cs index d516534..87f5ab6 100644 --- a/TNode/Attribute/ShowInNodeViewAttribute.cs +++ b/TNodeCore/Attribute/ShowInNodeViewAttribute.cs @@ -1,6 +1,6 @@ using System; -namespace TNode.Attribute{ +namespace TNodeCore.Attribute{ [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)] public class ShowInNodeViewAttribute:System.Attribute{ diff --git a/TNode/Attribute/ShowInNodeViewAttribute.cs.meta b/TNodeCore/Attribute/ShowInNodeViewAttribute.cs.meta similarity index 100% rename from TNode/Attribute/ShowInNodeViewAttribute.cs.meta rename to TNodeCore/Attribute/ShowInNodeViewAttribute.cs.meta diff --git a/TNode/Attribute/ViewComponentAttribute.cs b/TNodeCore/Attribute/ViewComponentAttribute.cs similarity index 81% rename from TNode/Attribute/ViewComponentAttribute.cs rename to TNodeCore/Attribute/ViewComponentAttribute.cs index 6399726..fd525f0 100644 --- a/TNode/Attribute/ViewComponentAttribute.cs +++ b/TNodeCore/Attribute/ViewComponentAttribute.cs @@ -1,9 +1,7 @@ using System; -using System.Diagnostics.CodeAnalysis; using JetBrains.Annotations; - -namespace TNode.Attribute{ +namespace TNodeCore.Attribute{ //Check if the ide is Rider diff --git a/TNode/Attribute/ViewComponentAttribute.cs.meta b/TNodeCore/Attribute/ViewComponentAttribute.cs.meta similarity index 100% rename from TNode/Attribute/ViewComponentAttribute.cs.meta rename to TNodeCore/Attribute/ViewComponentAttribute.cs.meta diff --git a/TNode/DataWrapper.cs b/TNodeCore/DataWrapper.cs similarity index 96% rename from TNode/DataWrapper.cs rename to TNodeCore/DataWrapper.cs index 95b3afd..64e96ea 100644 --- a/TNode/DataWrapper.cs +++ b/TNodeCore/DataWrapper.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; -using TNode.Models; using UnityEngine; -namespace TNode.Editor.Serialization{ +namespace TNodeCore{ [Serializable] public class DataWrapper:ScriptableObject where TWrapper:DataWrapper,new(){ [SerializeReference] diff --git a/TNode/DataWrapper.cs.meta b/TNodeCore/DataWrapper.cs.meta similarity index 100% rename from TNode/DataWrapper.cs.meta rename to TNodeCore/DataWrapper.cs.meta diff --git a/TNode/Editor.meta b/TNodeCore/Editor.meta similarity index 100% rename from TNode/Editor.meta rename to TNodeCore/Editor.meta diff --git a/TNode/Editor/Blackboard.meta b/TNodeCore/Editor/Blackboard.meta similarity index 100% rename from TNode/Editor/Blackboard.meta rename to TNodeCore/Editor/Blackboard.meta diff --git a/TNode/Editor/Blackboard/IBlackboardView.cs b/TNodeCore/Editor/Blackboard/IBlackboardView.cs similarity index 79% rename from TNode/Editor/Blackboard/IBlackboardView.cs rename to TNodeCore/Editor/Blackboard/IBlackboardView.cs index eca1cf9..e40f9d5 100644 --- a/TNode/Editor/Blackboard/IBlackboardView.cs +++ b/TNodeCore/Editor/Blackboard/IBlackboardView.cs @@ -1,9 +1,8 @@ -using TNode.Editor.NodeGraphView; -using TNode.Models; +using TNodeCore.Editor.NodeGraphView; +using TNodeCore.Models; using UnityEditor; -using UnityEngine; -namespace TNode.Editor.Blackboard{ +namespace TNodeCore.Editor.Blackboard{ public interface IBlackboardView{ public BlackboardData GetBlackboardData(); public void SetBlackboardData(BlackboardData data); diff --git a/TNode/Editor/Blackboard/IBlackboardView.cs.meta b/TNodeCore/Editor/Blackboard/IBlackboardView.cs.meta similarity index 100% rename from TNode/Editor/Blackboard/IBlackboardView.cs.meta rename to TNodeCore/Editor/Blackboard/IBlackboardView.cs.meta diff --git a/TNode/Editor/EditorPersistence.meta b/TNodeCore/Editor/EditorPersistence.meta similarity index 100% rename from TNode/Editor/EditorPersistence.meta rename to TNodeCore/Editor/EditorPersistence.meta diff --git a/TNode/Editor/EditorPersistence/GraphEditorData.cs b/TNodeCore/Editor/EditorPersistence/GraphEditorData.cs similarity index 85% rename from TNode/Editor/EditorPersistence/GraphEditorData.cs rename to TNodeCore/Editor/EditorPersistence/GraphEditorData.cs index 9c64722..c615a56 100644 --- a/TNode/Editor/EditorPersistence/GraphEditorData.cs +++ b/TNodeCore/Editor/EditorPersistence/GraphEditorData.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using UnityEngine; -namespace TNode.Editor.EditorPersistence{ +namespace TNodeCore.Editor.EditorPersistence{ [CreateAssetMenu(fileName = "Graph Editor Data", menuName = "TNode/Graph Editor Data")] public class GraphEditorData:ScriptableObject{ diff --git a/TNode/Editor/EditorPersistence/GraphEditorData.cs.meta b/TNodeCore/Editor/EditorPersistence/GraphEditorData.cs.meta similarity index 100% rename from TNode/Editor/EditorPersistence/GraphEditorData.cs.meta rename to TNodeCore/Editor/EditorPersistence/GraphEditorData.cs.meta diff --git a/TNode/Editor/EditorPersistence/GraphElementEditorData.cs b/TNodeCore/Editor/EditorPersistence/GraphElementEditorData.cs similarity index 77% rename from TNode/Editor/EditorPersistence/GraphElementEditorData.cs rename to TNodeCore/Editor/EditorPersistence/GraphElementEditorData.cs index 6c8809a..fb3e9e9 100644 --- a/TNode/Editor/EditorPersistence/GraphElementEditorData.cs +++ b/TNodeCore/Editor/EditorPersistence/GraphElementEditorData.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace TNode.Editor.EditorPersistence{ +namespace TNodeCore.Editor.EditorPersistence{ [Serializable] public class GraphElementEditorData{ diff --git a/TNode/Editor/EditorPersistence/GraphElementEditorData.cs.meta b/TNodeCore/Editor/EditorPersistence/GraphElementEditorData.cs.meta similarity index 100% rename from TNode/Editor/EditorPersistence/GraphElementEditorData.cs.meta rename to TNodeCore/Editor/EditorPersistence/GraphElementEditorData.cs.meta diff --git a/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs b/TNodeCore/Editor/EditorPersistence/IGraphViewPersistence.cs similarity index 84% rename from TNode/Editor/EditorPersistence/IGraphViewPersistence.cs rename to TNodeCore/Editor/EditorPersistence/IGraphViewPersistence.cs index bc9e60c..9c22f1a 100644 --- a/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs +++ b/TNodeCore/Editor/EditorPersistence/IGraphViewPersistence.cs @@ -1,4 +1,4 @@ -namespace TNode.Editor.EditorPersistence{ +namespace TNodeCore.Editor.EditorPersistence{ public interface IGraphViewPersistence{ public string GetPersistenceId(); public void ResetPos(GraphEditorData editorData); diff --git a/TNode/Editor/EditorPersistence/IGraphViewPersistence.cs.meta b/TNodeCore/Editor/EditorPersistence/IGraphViewPersistence.cs.meta similarity index 100% rename from TNode/Editor/EditorPersistence/IGraphViewPersistence.cs.meta rename to TNodeCore/Editor/EditorPersistence/IGraphViewPersistence.cs.meta diff --git a/TNode/Editor/EditorPersistence/SubWindowEditorData.cs b/TNodeCore/Editor/EditorPersistence/SubWindowEditorData.cs similarity index 51% rename from TNode/Editor/EditorPersistence/SubWindowEditorData.cs rename to TNodeCore/Editor/EditorPersistence/SubWindowEditorData.cs index ff64408..b174a79 100644 --- a/TNode/Editor/EditorPersistence/SubWindowEditorData.cs +++ b/TNodeCore/Editor/EditorPersistence/SubWindowEditorData.cs @@ -1,4 +1,4 @@ -namespace TNode.Editor.EditorPersistence{ +namespace TNodeCore.Editor.EditorPersistence{ public class SubWindowEditorData{ } diff --git a/TNode/Editor/EditorPersistence/SubWindowEditorData.cs.meta b/TNodeCore/Editor/EditorPersistence/SubWindowEditorData.cs.meta similarity index 100% rename from TNode/Editor/EditorPersistence/SubWindowEditorData.cs.meta rename to TNodeCore/Editor/EditorPersistence/SubWindowEditorData.cs.meta diff --git a/TNode/Editor/Inspector.meta b/TNodeCore/Editor/Inspector.meta similarity index 100% rename from TNode/Editor/Inspector.meta rename to TNodeCore/Editor/Inspector.meta diff --git a/TNode/Editor/Inspector/INodeDataBinding.cs b/TNodeCore/Editor/Inspector/INodeDataBinding.cs similarity index 65% rename from TNode/Editor/Inspector/INodeDataBinding.cs rename to TNodeCore/Editor/Inspector/INodeDataBinding.cs index d6f9613..7c109d0 100644 --- a/TNode/Editor/Inspector/INodeDataBinding.cs +++ b/TNodeCore/Editor/Inspector/INodeDataBinding.cs @@ -1,7 +1,4 @@ -using TNode.Models; -using UnityEngine; - -namespace TNode.Editor.Inspector{ +namespace TNodeCore.Editor.Inspector{ public interface INodeDataBinding:INodeDataBindingBase{ diff --git a/TNode/Editor/Inspector/INodeDataBinding.cs.meta b/TNodeCore/Editor/Inspector/INodeDataBinding.cs.meta similarity index 100% rename from TNode/Editor/Inspector/INodeDataBinding.cs.meta rename to TNodeCore/Editor/Inspector/INodeDataBinding.cs.meta diff --git a/TNode/Editor/Inspector/INodeDataBindingBase.cs b/TNodeCore/Editor/Inspector/INodeDataBindingBase.cs similarity index 69% rename from TNode/Editor/Inspector/INodeDataBindingBase.cs rename to TNodeCore/Editor/Inspector/INodeDataBindingBase.cs index bb367b9..b84492c 100644 --- a/TNode/Editor/Inspector/INodeDataBindingBase.cs +++ b/TNodeCore/Editor/Inspector/INodeDataBindingBase.cs @@ -1,6 +1,6 @@ -using TNode.Models; +using TNodeCore.Models; -namespace TNode.Editor.Inspector{ +namespace TNodeCore.Editor.Inspector{ public interface INodeDataBindingBase{ public string BindingPath{ get; set; } public NodeData BindingNodeData{ get; set; } diff --git a/TNode/Editor/Inspector/INodeDataBindingBase.cs.meta b/TNodeCore/Editor/Inspector/INodeDataBindingBase.cs.meta similarity index 100% rename from TNode/Editor/Inspector/INodeDataBindingBase.cs.meta rename to TNodeCore/Editor/Inspector/INodeDataBindingBase.cs.meta diff --git a/TNode/Editor/NodeGraphView.meta b/TNodeCore/Editor/NodeGraphView.meta similarity index 100% rename from TNode/Editor/NodeGraphView.meta rename to TNodeCore/Editor/NodeGraphView.meta diff --git a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs similarity index 82% rename from TNode/Editor/NodeGraphView/IBaseDataGraphView.cs rename to TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs index 16289d0..e30b7ca 100644 --- a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs +++ b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs @@ -1,7 +1,7 @@ -using TNode.Models; +using TNodeCore.Models; using UnityEngine; -namespace TNode.Editor.NodeGraphView{ +namespace TNodeCore.Editor.NodeGraphView{ public interface IBaseDataGraphView{ public void AddTNode(NodeData nodeData, Rect rect); public void RemoveTNode(NodeData nodeData); diff --git a/TNode/Editor/NodeGraphView/IBaseDataGraphView.cs.meta b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs.meta similarity index 100% rename from TNode/Editor/NodeGraphView/IBaseDataGraphView.cs.meta rename to TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs.meta diff --git a/TNode/Editor/NodeGraphView/IDataGraphView.cs b/TNodeCore/Editor/NodeGraphView/IDataGraphView.cs similarity index 63% rename from TNode/Editor/NodeGraphView/IDataGraphView.cs rename to TNodeCore/Editor/NodeGraphView/IDataGraphView.cs index e0ed67b..8d00d8a 100644 --- a/TNode/Editor/NodeGraphView/IDataGraphView.cs +++ b/TNodeCore/Editor/NodeGraphView/IDataGraphView.cs @@ -1,6 +1,6 @@ -using TNode.Models; +using TNodeCore.Models; -namespace TNode.Editor.NodeGraphView{ +namespace TNodeCore.Editor.NodeGraphView{ public interface IDataGraphView : IBaseDataGraphView where T:GraphData{ public T Data{ get; set; } } diff --git a/TNode/Editor/NodeGraphView/IDataGraphView.cs.meta b/TNodeCore/Editor/NodeGraphView/IDataGraphView.cs.meta similarity index 100% rename from TNode/Editor/NodeGraphView/IDataGraphView.cs.meta rename to TNodeCore/Editor/NodeGraphView/IDataGraphView.cs.meta diff --git a/TNodeCore/Editor/PropertyDrawer.meta b/TNodeCore/Editor/PropertyDrawer.meta new file mode 100644 index 0000000..d0afc7a --- /dev/null +++ b/TNodeCore/Editor/PropertyDrawer.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a117c02cea8248beadd23fb13f77c2d8 +timeCreated: 1657878045 \ No newline at end of file diff --git a/TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs b/TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs new file mode 100644 index 0000000..06274ac --- /dev/null +++ b/TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs @@ -0,0 +1,60 @@ + +// namespace TNode.Editor{ +// [CustomPropertyDrawer(typeof(BlackboardData))] +// public class BlackboardDataPropertyDrawer:PropertyDrawer{ +// public float height = 0; +// public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) +// { +// // Using BeginProperty / EndProperty on the parent property means that +// // prefab override logic works on the entire property. +// var to = property.serializedObject.targetObject; +// +// if (to is RuntimeGraph runtimeGraph){ +// var blackboardData = property.boxedValue; +// var graphType = runtimeGraph.graphData.GetType(); +// +// Debug.Log(blackboardData); +// +// if (blackboardData == null || blackboardData.GetType()==typeof(BlackboardData)) +// { blackboardData= NodeEditorExtensions.GetAppropriateBlackboardData(graphType); +// property.boxedValue = blackboardData; +// +// } +// +// +// var posy = position.y; +// EditorGUI.BeginProperty(position, label, property); +// +// // Draw label +// EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); +// height = EditorGUIUtility.singleLineHeight; +// +// // Don't make child fields be indented +// var indent = EditorGUI.indentLevel; +// EditorGUI.indentLevel = 0; +// +// //find the blackboard data +// +// var blackboardDataFields = blackboardData.GetType().GetFields(); +// posy += EditorGUIUtility.singleLineHeight; +// foreach (var blackboardDataField in blackboardDataFields){ +// var newPosition = new Rect(position.x, posy, position.width, EditorGUIUtility.singleLineHeight); +// EditorGUI.PropertyField(newPosition, property.FindPropertyRelative(blackboardDataField.Name), new GUIContent(blackboardDataField.Name)); +// posy += EditorGUIUtility.singleLineHeight; +// height+=EditorGUIUtility.singleLineHeight; +// } +// +// // Set indent back to what it was +// EditorGUI.indentLevel = indent; +// +// EditorGUI.EndProperty(); +// } +// +// +// } +// public override float GetPropertyHeight(SerializedProperty property, GUIContent label) +// { +// return base.GetPropertyHeight(property, label) + height; +// } +// } +// } \ No newline at end of file diff --git a/TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs.meta b/TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs.meta new file mode 100644 index 0000000..45945d5 --- /dev/null +++ b/TNodeCore/Editor/PropertyDrawer/PropertyDrawer.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e731c94a155641f39da7e1eb47f80f01 +timeCreated: 1657878003 \ No newline at end of file diff --git a/TNode/Editor/Resources.meta b/TNodeCore/Editor/Resources.meta similarity index 100% rename from TNode/Editor/Resources.meta rename to TNodeCore/Editor/Resources.meta diff --git a/TNode/Editor/Resources/DefaultNodeData.asset b/TNodeCore/Editor/Resources/DefaultNodeData.asset similarity index 100% rename from TNode/Editor/Resources/DefaultNodeData.asset rename to TNodeCore/Editor/Resources/DefaultNodeData.asset diff --git a/TNode/Editor/Resources/DefaultNodeData.asset.meta b/TNodeCore/Editor/Resources/DefaultNodeData.asset.meta similarity index 100% rename from TNode/Editor/Resources/DefaultNodeData.asset.meta rename to TNodeCore/Editor/Resources/DefaultNodeData.asset.meta diff --git a/TNode/Editor/Resources/GraphEditor.uss b/TNodeCore/Editor/Resources/GraphEditor.uss similarity index 100% rename from TNode/Editor/Resources/GraphEditor.uss rename to TNodeCore/Editor/Resources/GraphEditor.uss diff --git a/TNode/Editor/Resources/GraphEditor.uss.meta b/TNodeCore/Editor/Resources/GraphEditor.uss.meta similarity index 100% rename from TNode/Editor/Resources/GraphEditor.uss.meta rename to TNodeCore/Editor/Resources/GraphEditor.uss.meta diff --git a/TNode/Editor/Resources/GraphEditor.uxml b/TNodeCore/Editor/Resources/GraphEditor.uxml similarity index 100% rename from TNode/Editor/Resources/GraphEditor.uxml rename to TNodeCore/Editor/Resources/GraphEditor.uxml diff --git a/TNode/Editor/Resources/GraphEditor.uxml.meta b/TNodeCore/Editor/Resources/GraphEditor.uxml.meta similarity index 100% rename from TNode/Editor/Resources/GraphEditor.uxml.meta rename to TNodeCore/Editor/Resources/GraphEditor.uxml.meta diff --git a/TNode/Editor/Resources/GraphViewBackground.uss b/TNodeCore/Editor/Resources/GraphViewBackground.uss similarity index 100% rename from TNode/Editor/Resources/GraphViewBackground.uss rename to TNodeCore/Editor/Resources/GraphViewBackground.uss diff --git a/TNode/Editor/Resources/GraphViewBackground.uss.meta b/TNodeCore/Editor/Resources/GraphViewBackground.uss.meta similarity index 100% rename from TNode/Editor/Resources/GraphViewBackground.uss.meta rename to TNodeCore/Editor/Resources/GraphViewBackground.uss.meta diff --git a/TNode/Editor/Resources/NodeInspector.uss b/TNodeCore/Editor/Resources/NodeInspector.uss similarity index 100% rename from TNode/Editor/Resources/NodeInspector.uss rename to TNodeCore/Editor/Resources/NodeInspector.uss diff --git a/TNode/Editor/Resources/NodeInspector.uss.meta b/TNodeCore/Editor/Resources/NodeInspector.uss.meta similarity index 100% rename from TNode/Editor/Resources/NodeInspector.uss.meta rename to TNodeCore/Editor/Resources/NodeInspector.uss.meta diff --git a/TNode/Editor/Resources/NodeInspector.uxml b/TNodeCore/Editor/Resources/NodeInspector.uxml similarity index 100% rename from TNode/Editor/Resources/NodeInspector.uxml rename to TNodeCore/Editor/Resources/NodeInspector.uxml diff --git a/TNode/Editor/Resources/NodeInspector.uxml.meta b/TNodeCore/Editor/Resources/NodeInspector.uxml.meta similarity index 100% rename from TNode/Editor/Resources/NodeInspector.uxml.meta rename to TNodeCore/Editor/Resources/NodeInspector.uxml.meta diff --git a/TNode/Editor/Resources/ScriptTemplates.meta b/TNodeCore/Editor/Resources/ScriptTemplates.meta similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates.meta rename to TNodeCore/Editor/Resources/ScriptTemplates.meta diff --git a/TNode/Editor/Resources/ScriptTemplates/NewGraph.cs.txt b/TNodeCore/Editor/Resources/ScriptTemplates/NewGraph.cs.txt similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates/NewGraph.cs.txt rename to TNodeCore/Editor/Resources/ScriptTemplates/NewGraph.cs.txt diff --git a/TNode/Editor/Resources/ScriptTemplates/NewGraph.cs.txt.meta b/TNodeCore/Editor/Resources/ScriptTemplates/NewGraph.cs.txt.meta similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates/NewGraph.cs.txt.meta rename to TNodeCore/Editor/Resources/ScriptTemplates/NewGraph.cs.txt.meta diff --git a/TNode/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt b/TNodeCore/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt rename to TNodeCore/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt diff --git a/TNode/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt.meta b/TNodeCore/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt.meta similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt.meta rename to TNodeCore/Editor/Resources/ScriptTemplates/NewGraphEditor.cs.txt.meta diff --git a/TNode/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt b/TNodeCore/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt rename to TNodeCore/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt diff --git a/TNode/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt.meta b/TNodeCore/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt.meta similarity index 100% rename from TNode/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt.meta rename to TNodeCore/Editor/Resources/ScriptTemplates/NewGraphView.cs.txt.meta diff --git a/TNode/Editor/Serialization.meta b/TNodeCore/Editor/Serialization.meta similarity index 100% rename from TNode/Editor/Serialization.meta rename to TNodeCore/Editor/Serialization.meta diff --git a/TNodeCore/Editor/Serialization/BlackboardDataWrapper.cs b/TNodeCore/Editor/Serialization/BlackboardDataWrapper.cs new file mode 100644 index 0000000..d64b76d --- /dev/null +++ b/TNodeCore/Editor/Serialization/BlackboardDataWrapper.cs @@ -0,0 +1,7 @@ +using TNodeCore.Models; + +namespace TNodeCore.Editor.Serialization{ + public class BlackboardDataWrapper:DataWrapper{ + + } +} \ No newline at end of file diff --git a/TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta b/TNodeCore/Editor/Serialization/BlackboardDataWrapper.cs.meta similarity index 100% rename from TNode/Editor/Serialization/BlackboardDataWrapper.cs.meta rename to TNodeCore/Editor/Serialization/BlackboardDataWrapper.cs.meta diff --git a/TNode/Editor/Serialization/NodeDataWrapper.cs b/TNodeCore/Editor/Serialization/NodeDataWrapper.cs similarity index 97% rename from TNode/Editor/Serialization/NodeDataWrapper.cs rename to TNodeCore/Editor/Serialization/NodeDataWrapper.cs index 816df2e..772e9a8 100644 --- a/TNode/Editor/Serialization/NodeDataWrapper.cs +++ b/TNodeCore/Editor/Serialization/NodeDataWrapper.cs @@ -1,11 +1,9 @@ using System; using System.Collections.Generic; -using TNode.Models; +using TNodeCore.Models; using UnityEngine; -using UnityEngine.Serialization; - -namespace TNode.Editor.Serialization{ +namespace TNodeCore.Editor.Serialization{ [Obsolete] public class NodeDataWrapper : ScriptableObject where T : NodeData{ diff --git a/TNode/Editor/Serialization/NodeDataWrapper.cs.meta b/TNodeCore/Editor/Serialization/NodeDataWrapper.cs.meta similarity index 100% rename from TNode/Editor/Serialization/NodeDataWrapper.cs.meta rename to TNodeCore/Editor/Serialization/NodeDataWrapper.cs.meta diff --git a/TNode/Editor/Tools.meta b/TNodeCore/Editor/Tools.meta similarity index 100% rename from TNode/Editor/Tools.meta rename to TNodeCore/Editor/Tools.meta diff --git a/TNode/Editor/Tools/GraphEditorCreator.meta b/TNodeCore/Editor/Tools/GraphEditorCreator.meta similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator.meta rename to TNodeCore/Editor/Tools/GraphEditorCreator.meta diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs similarity index 98% rename from TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs rename to TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs index 13c2ed3..0d166b1 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs +++ b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs @@ -1,6 +1,6 @@ using System.IO; using System.Text.RegularExpressions; -using TNode.Editor.EditorPersistence; +using TNodeCore.Editor.EditorPersistence; using UnityEditor; using UnityEngine; using UnityEngine.UIElements; @@ -8,7 +8,7 @@ using UnityEngine.UIElements; //add an attribute right click asset panel and select "TNode/Create/Create New Graph Editor" to call this editor -namespace TNode.Editor.Tools.GraphEditorCreator{ +namespace TNodeCore.Editor.Tools.GraphEditorCreator{ public class GraphEditorCreator : EditorWindow { diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs.meta b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs.meta similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs.meta rename to TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.cs.meta diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss rename to TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss.meta b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss.meta similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss.meta rename to TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uss.meta diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml rename to TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml diff --git a/TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml.meta b/TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml.meta similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml.meta rename to TNodeCore/Editor/Tools/GraphEditorCreator/GraphEditorCreator.uxml.meta diff --git a/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs b/TNodeCore/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs similarity index 97% rename from TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs rename to TNodeCore/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs index 7529026..a501aae 100644 --- a/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs +++ b/TNodeCore/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs @@ -1,7 +1,7 @@ using System.Text.RegularExpressions; using UnityEngine; -namespace TNode.Editor.Tools.GraphEditorCreator{ +namespace TNodeCore.Editor.Tools.GraphEditorCreator{ public class SourceGeneratorForGraphEditor{ private readonly Regex Regex = new System.Text.RegularExpressions.Regex("^[a-zA-Z0-9_]+$"); public string GenerateGraphEditor(string editorClassName,string graphClassName,string templateName="NewGraphEditor.cs"){ diff --git a/TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs.meta b/TNodeCore/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs.meta similarity index 100% rename from TNode/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs.meta rename to TNodeCore/Editor/Tools/GraphEditorCreator/SourceGeneratorForGraphEditor.cs.meta diff --git a/TNode/Editor/Tools/NodeCreator.meta b/TNodeCore/Editor/Tools/NodeCreator.meta similarity index 100% rename from TNode/Editor/Tools/NodeCreator.meta rename to TNodeCore/Editor/Tools/NodeCreator.meta diff --git a/TNode/Editor/Tools/NodeCreator/NodeCreator.cs b/TNodeCore/Editor/Tools/NodeCreator/NodeCreator.cs similarity index 90% rename from TNode/Editor/Tools/NodeCreator/NodeCreator.cs rename to TNodeCore/Editor/Tools/NodeCreator/NodeCreator.cs index 416e8a1..3ed372b 100644 --- a/TNode/Editor/Tools/NodeCreator/NodeCreator.cs +++ b/TNodeCore/Editor/Tools/NodeCreator/NodeCreator.cs @@ -1,7 +1,7 @@ using System; -using TNode.Models; +using TNodeCore.Models; -namespace TNode.Editor.Tools.NodeCreator{ +namespace TNodeCore.Editor.Tools.NodeCreator{ public static class NodeCreator{ /// diff --git a/TNode/Editor/Tools/NodeCreator/NodeCreator.cs.meta b/TNodeCore/Editor/Tools/NodeCreator/NodeCreator.cs.meta similarity index 100% rename from TNode/Editor/Tools/NodeCreator/NodeCreator.cs.meta rename to TNodeCore/Editor/Tools/NodeCreator/NodeCreator.cs.meta diff --git a/TNode/Models.meta b/TNodeCore/Models.meta similarity index 100% rename from TNode/Models.meta rename to TNodeCore/Models.meta diff --git a/TNode/Models/BlackboardData.cs b/TNodeCore/Models/BlackboardData.cs similarity index 64% rename from TNode/Models/BlackboardData.cs rename to TNodeCore/Models/BlackboardData.cs index ad1a97e..95b35b6 100644 --- a/TNode/Models/BlackboardData.cs +++ b/TNodeCore/Models/BlackboardData.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; -using Object = UnityEngine.Object; -namespace TNode.Models{ +namespace TNodeCore.Models{ /// /// Black board data can store scene data /// diff --git a/TNode/Models/BlackboardData.cs.meta b/TNodeCore/Models/BlackboardData.cs.meta similarity index 100% rename from TNode/Models/BlackboardData.cs.meta rename to TNodeCore/Models/BlackboardData.cs.meta diff --git a/TNode/Models/BlackboardDragNodeData.cs b/TNodeCore/Models/BlackboardDragNodeData.cs similarity index 69% rename from TNode/Models/BlackboardDragNodeData.cs rename to TNodeCore/Models/BlackboardDragNodeData.cs index 3fb0891..773bcb5 100644 --- a/TNode/Models/BlackboardDragNodeData.cs +++ b/TNodeCore/Models/BlackboardDragNodeData.cs @@ -1,13 +1,9 @@ using System; -using System.Runtime.InteropServices; -using Newtonsoft.Json; -using TNode.Attribute; -using TNode.Attribute.Ports; -using TNode.RuntimeCache; +using TNodeCore.Attribute.Ports; +using TNodeCore.RuntimeCache; using UnityEngine; -using UnityEngine.Serialization; -namespace TNode.Models{ +namespace TNodeCore.Models{ [Serializable] public class BlackboardDragNodeData:NodeData{ public string blackDragData; diff --git a/TNode/Models/BlackboardDragNodeData.cs.meta b/TNodeCore/Models/BlackboardDragNodeData.cs.meta similarity index 100% rename from TNode/Models/BlackboardDragNodeData.cs.meta rename to TNodeCore/Models/BlackboardDragNodeData.cs.meta diff --git a/TNode/Models/GraphData.cs b/TNodeCore/Models/GraphData.cs similarity index 93% rename from TNode/Models/GraphData.cs rename to TNodeCore/Models/GraphData.cs index 31fcb39..cb400a4 100644 --- a/TNode/Models/GraphData.cs +++ b/TNodeCore/Models/GraphData.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; -using Newtonsoft.Json; using UnityEngine; -using UnityEngine.Serialization; -namespace TNode.Models{ +namespace TNodeCore.Models{ [Serializable] public class GraphData:ScriptableObject,ISerializationCallbackReceiver{ public Dictionary NodeDictionary = new Dictionary(); diff --git a/TNode/Models/GraphData.cs.meta b/TNodeCore/Models/GraphData.cs.meta similarity index 100% rename from TNode/Models/GraphData.cs.meta rename to TNodeCore/Models/GraphData.cs.meta diff --git a/TNode/Models/IModel.cs b/TNodeCore/Models/IModel.cs similarity index 57% rename from TNode/Models/IModel.cs rename to TNodeCore/Models/IModel.cs index 0328c7d..c2261e3 100644 --- a/TNode/Models/IModel.cs +++ b/TNodeCore/Models/IModel.cs @@ -1,4 +1,4 @@ -namespace TNode.Models{ +namespace TNodeCore.Models{ public interface IModel{ } diff --git a/TNode/Models/IModel.cs.meta b/TNodeCore/Models/IModel.cs.meta similarity index 100% rename from TNode/Models/IModel.cs.meta rename to TNodeCore/Models/IModel.cs.meta diff --git a/TNode/Models/NodeData.cs b/TNodeCore/Models/NodeData.cs similarity index 92% rename from TNode/Models/NodeData.cs rename to TNodeCore/Models/NodeData.cs index a9fc49b..79aeb10 100644 --- a/TNode/Models/NodeData.cs +++ b/TNodeCore/Models/NodeData.cs @@ -1,8 +1,7 @@ using System; -using TNode.Attribute; -using UnityEngine; +using TNodeCore.Attribute; -namespace TNode.Models{ +namespace TNodeCore.Models{ /// /// this class is used to store the data of a node /// inherit it to implement your own node diff --git a/TNode/Models/NodeData.cs.meta b/TNodeCore/Models/NodeData.cs.meta similarity index 100% rename from TNode/Models/NodeData.cs.meta rename to TNodeCore/Models/NodeData.cs.meta diff --git a/TNode/Models/NodeLink.cs b/TNodeCore/Models/NodeLink.cs similarity index 85% rename from TNode/Models/NodeLink.cs rename to TNodeCore/Models/NodeLink.cs index 932d7e7..dfccbcc 100644 --- a/TNode/Models/NodeLink.cs +++ b/TNodeCore/Models/NodeLink.cs @@ -1,8 +1,6 @@ using System; -using UnityEditor.Experimental.GraphView; - -namespace TNode.Models{ +namespace TNodeCore.Models{ //NodeAttribute links are stored in output side of the two node port. [Serializable] public class NodeLink{ diff --git a/TNode/Models/NodeLink.cs.meta b/TNodeCore/Models/NodeLink.cs.meta similarity index 100% rename from TNode/Models/NodeLink.cs.meta rename to TNodeCore/Models/NodeLink.cs.meta diff --git a/TNode/Models/PortInfo.cs b/TNodeCore/Models/PortInfo.cs similarity index 82% rename from TNode/Models/PortInfo.cs rename to TNodeCore/Models/PortInfo.cs index c4d16e2..dbd4e8c 100644 --- a/TNode/Models/PortInfo.cs +++ b/TNodeCore/Models/PortInfo.cs @@ -1,6 +1,6 @@ using System; -namespace TNode.Models{ +namespace TNodeCore.Models{ [Serializable] public class PortInfo{ public string portName; diff --git a/TNode/Models/PortInfo.cs.meta b/TNodeCore/Models/PortInfo.cs.meta similarity index 100% rename from TNode/Models/PortInfo.cs.meta rename to TNodeCore/Models/PortInfo.cs.meta diff --git a/TNode/Models/SceneObjectWrapper.cs b/TNodeCore/Models/SceneObjectWrapper.cs similarity index 98% rename from TNode/Models/SceneObjectWrapper.cs rename to TNodeCore/Models/SceneObjectWrapper.cs index 169099c..b932bbe 100644 --- a/TNode/Models/SceneObjectWrapper.cs +++ b/TNodeCore/Models/SceneObjectWrapper.cs @@ -1,13 +1,10 @@ using System; using System.Collections.Generic; -using TNode.Editor.Serialization; -using TNode.RuntimeCache; using UnityEngine; using UnityEngine.SceneManagement; -using UnityEngine.Serialization; using Object = UnityEngine.Object; -namespace TNode.Models{ +namespace TNodeCore.Models{ /// /// Scene Object wrapper use to serialize blackboard data diff --git a/TNode/Models/SceneObjectWrapper.cs.meta b/TNodeCore/Models/SceneObjectWrapper.cs.meta similarity index 100% rename from TNode/Models/SceneObjectWrapper.cs.meta rename to TNodeCore/Models/SceneObjectWrapper.cs.meta diff --git a/TNode/Runtime.meta b/TNodeCore/Runtime.meta similarity index 100% rename from TNode/Runtime.meta rename to TNodeCore/Runtime.meta diff --git a/TNodeCore/Runtime/RuntimeGraph.cs b/TNodeCore/Runtime/RuntimeGraph.cs new file mode 100644 index 0000000..1d019e4 --- /dev/null +++ b/TNodeCore/Runtime/RuntimeGraph.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using TNodeCore.Models; +using UnityEngine; + +namespace TNodeCore.Runtime{ + public class RuntimeGraph:MonoBehaviour{ + public GraphData graphData; + public SortedSet _sortedSet; + [SerializeReference] + public BlackboardData runtimeBlackboardData; + + public void OnValidate(){ + if(runtimeBlackboardData==null||runtimeBlackboardData.GetType()==typeof(BlackboardData)){ + runtimeBlackboardData = graphData?.blackboardData; + } + } + } + + public enum ProcessingStrategy{ + BreadthFirst, + DepthFirst + } +} \ No newline at end of file diff --git a/TNode/Runtime/RuntimeGraph.cs.meta b/TNodeCore/Runtime/RuntimeGraph.cs.meta similarity index 100% rename from TNode/Runtime/RuntimeGraph.cs.meta rename to TNodeCore/Runtime/RuntimeGraph.cs.meta diff --git a/TNode/Runtime/RuntimeNode.cs b/TNodeCore/Runtime/RuntimeNode.cs similarity index 58% rename from TNode/Runtime/RuntimeNode.cs rename to TNodeCore/Runtime/RuntimeNode.cs index 2376057..428b763 100644 --- a/TNode/Runtime/RuntimeNode.cs +++ b/TNodeCore/Runtime/RuntimeNode.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using TNode.Models; +using System.Collections.Generic; +using TNodeCore.Models; -namespace TNode.Runtime{ +namespace TNodeCore.Runtime{ public abstract class RuntimeNode{ public NodeData NodeData; public List NodeLinks; diff --git a/TNode/Runtime/RuntimeNode.cs.meta b/TNodeCore/Runtime/RuntimeNode.cs.meta similarity index 100% rename from TNode/Runtime/RuntimeNode.cs.meta rename to TNodeCore/Runtime/RuntimeNode.cs.meta diff --git a/TNode/Runtime/Runtimeblackboard.cs b/TNodeCore/Runtime/Runtimeblackboard.cs similarity index 59% rename from TNode/Runtime/Runtimeblackboard.cs rename to TNodeCore/Runtime/Runtimeblackboard.cs index 1a91406..b0e44e1 100644 --- a/TNode/Runtime/Runtimeblackboard.cs +++ b/TNodeCore/Runtime/Runtimeblackboard.cs @@ -1,7 +1,6 @@ -using System.Collections.Generic; -using TNode.Models; +using TNodeCore.Models; -namespace TNode.Runtime{ +namespace TNodeCore.Runtime{ public class RuntimeBlackboard where T:BlackboardData{ public T Data { get; set; } diff --git a/TNode/Runtime/Runtimeblackboard.cs.meta b/TNodeCore/Runtime/Runtimeblackboard.cs.meta similarity index 100% rename from TNode/Runtime/Runtimeblackboard.cs.meta rename to TNodeCore/Runtime/Runtimeblackboard.cs.meta diff --git a/TNode/Runtime/SceneSerializedData.cs b/TNodeCore/Runtime/SceneSerializedData.cs similarity index 87% rename from TNode/Runtime/SceneSerializedData.cs rename to TNodeCore/Runtime/SceneSerializedData.cs index 906c7f1..1cdd7ea 100644 --- a/TNode/Runtime/SceneSerializedData.cs +++ b/TNodeCore/Runtime/SceneSerializedData.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace TNode.Runtime{ +namespace TNodeCore.Runtime{ public class SceneSerializedData:MonoBehaviour{ public GameObject serializedObject; public Behaviour serializedFeature; diff --git a/TNode/Runtime/SceneSerializedData.cs.meta b/TNodeCore/Runtime/SceneSerializedData.cs.meta similarity index 100% rename from TNode/Runtime/SceneSerializedData.cs.meta rename to TNodeCore/Runtime/SceneSerializedData.cs.meta diff --git a/TNode/RuntimeCache.meta b/TNodeCore/RuntimeCache.meta similarity index 100% rename from TNode/RuntimeCache.meta rename to TNodeCore/RuntimeCache.meta diff --git a/TNode/RuntimeCache/RuntimeCache.cs b/TNodeCore/RuntimeCache/RuntimeCache.cs similarity index 67% rename from TNode/RuntimeCache/RuntimeCache.cs rename to TNodeCore/RuntimeCache/RuntimeCache.cs index cf0be53..6afe225 100644 --- a/TNode/RuntimeCache/RuntimeCache.cs +++ b/TNodeCore/RuntimeCache/RuntimeCache.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Reflection; -using EasyRandomGenerator.Blackboard; -using JetBrains.Annotations; -using TNode.Models; -using Unity.VisualScripting; -using UnityEngine.UI; +using TNodeCore.Attribute; +using TNodeCore.Models; -namespace TNode.RuntimeCache{ +namespace TNodeCore.RuntimeCache{ public class RuntimeCache{ //Singleton instance for the runtime cache private static RuntimeCache _instance; @@ -23,10 +21,57 @@ namespace TNode.RuntimeCache{ public readonly Dictionary> CachedDelegatesForSettingValue = new (); + private readonly Dictionary _graphBlackboardDictionary = new Dictionary(); + private static readonly string[] ExcludedAssemblies = new string[]{"Microsoft", "UnityEngine","UnityEditor","mscorlib","System"}; public RuntimeCache(){ - RegisterRuntimeBlackboard(typeof(EasyBlackboardData)); + //Get types in all assemblies except the excluded ones + var types = AppDomain.CurrentDomain.GetAssemblies().Where( + assembly => !ExcludedAssemblies.Contains(assembly.GetName().Name) + ).SelectMany(assembly => assembly.GetTypes()); + //iterate types to check if they have GraphUsageAttribute + foreach (var type in types){ + var attributes = type.GetCustomAttributes(); + foreach (var attribute in attributes){ + if (attribute is GraphUsageAttribute){ + //if the type has GraphUsageAttribute, add it to the cache + AddTypeToCache(type,attribute as GraphUsageAttribute); + + } + } + } + } + + private void AddTypeToCache(Type type,GraphUsageAttribute attribute){ + //Check if the type is a blackboard data type + if(typeof(BlackboardData).IsAssignableFrom(type)){ + //if it is, add it to the cache + AddBlackboardDataTypeToCache(type,attribute); + RegisterRuntimeBlackboard(type); + } + + } + + private void AddBlackboardDataTypeToCache(Type type,GraphUsageAttribute attribute){ + var graphData = attribute.GraphDataType; + _graphBlackboardDictionary.Add(graphData,type); + + } + + public Type GetAppropriateBlackboardDataType(GraphData graphData){ + var type = graphData.GetType(); + if(_graphBlackboardDictionary.ContainsKey(type)){ + return _graphBlackboardDictionary[type]; + } + return null; + } + public BlackboardData GetBlackboardData(GraphData graphData){ + var type = GetAppropriateBlackboardDataType(graphData); + if(type != null){ + return (BlackboardData) Activator.CreateInstance(type); + } + return null; } public void RegisterRuntimeBlackboard(Type type){ if (type == null) return; diff --git a/TNode/RuntimeCache/RuntimeCache.cs.meta b/TNodeCore/RuntimeCache/RuntimeCache.cs.meta similarity index 100% rename from TNode/RuntimeCache/RuntimeCache.cs.meta rename to TNodeCore/RuntimeCache/RuntimeCache.cs.meta diff --git a/TNodeCore/TNodeCore.asmdef b/TNodeCore/TNodeCore.asmdef new file mode 100644 index 0000000..959c6ee --- /dev/null +++ b/TNodeCore/TNodeCore.asmdef @@ -0,0 +1,3 @@ +{ + "name": "NewAssembly" +} diff --git a/TNodeCore/TNodeCore.asmdef.meta b/TNodeCore/TNodeCore.asmdef.meta new file mode 100644 index 0000000..182d303 --- /dev/null +++ b/TNodeCore/TNodeCore.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d9d6b4f0cdce23345bf2e956f8041ca2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs index f8fe8b6..68460b3 100644 --- a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs +++ b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; -using TNode.Attribute; using TNode.Editor; -using TNode.Editor.Blackboard; using TNode.Editor.NodeViews; -using TNode.Models; +using TNodeCore.Attribute; +using TNodeCore.Editor.Blackboard; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.NodeGraphView; using TNodeGraphViewImpl.Editor.NodeViews; @@ -17,10 +17,6 @@ namespace TNodeGraphViewImpl.Editor.Cache{ /// Internal singleton class for caching TNode reflection Data. /// internal class NodeEditorTypeDictionary:Dictionary{ - //Custom camparator for sorting the dictionary by key. - - - private class NodeEditorTypeDictionaryComparer : IEqualityComparer { public bool Equals(Type x, Type y){ diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index ac22902..0a74e1a 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -1,10 +1,9 @@ using System.Collections; using System.Reflection; -using TNode.Attribute; -using TNode.Editor.NodeGraphView; using TNode.Editor.Search; -using TNode.Editor.Serialization; -using TNode.Models; +using TNodeCore.Attribute; +using TNodeCore.Editor.Serialization; +using TNodeCore.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEditor.UIElements; diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs index fda833c..e96416f 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs @@ -13,6 +13,7 @@ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ base.ExecuteDefaultActionAtTarget(evt); if (this.Q() != null){ this.Q().allowSceneObjects = false; + } } diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs index 8c2644d..7d95719 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardView.cs @@ -1,7 +1,7 @@ -using TNode.Editor.Blackboard; -using TNode.Editor.NodeGraphView; -using TNode.Editor.Search; -using TNode.Models; +using TNode.Editor.Search; +using TNodeCore.Editor.Blackboard; +using TNodeCore.Editor.NodeGraphView; +using TNodeCore.Models; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; diff --git a/TNodeGraphViewImpl/Editor/GraphEditor.cs b/TNodeGraphViewImpl/Editor/GraphEditor.cs index ade213b..2a01b69 100644 --- a/TNodeGraphViewImpl/Editor/GraphEditor.cs +++ b/TNodeGraphViewImpl/Editor/GraphEditor.cs @@ -1,7 +1,7 @@ using Codice.CM.Common; -using TNode.Editor.EditorPersistence; using TNode.Editor.Inspector; -using TNode.Models; +using TNodeCore.Editor.EditorPersistence; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.NodeGraphView; using UnityEditor; diff --git a/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs index 96c833e..8d86869 100644 --- a/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspector.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; using System.Reflection; -using TNode.Attribute; using TNode.Editor.NodeViews; -using TNode.Models; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.NodeGraphView; using TNodeGraphViewImpl.Editor.NodeViews; using Unity.VisualScripting; diff --git a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs index e016bfe..4660f6a 100644 --- a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs @@ -1,7 +1,7 @@ using System.Reflection; -using TNode.Attribute; -using TNode.Editor.Serialization; -using TNode.Models; +using TNodeCore.Attribute; +using TNodeCore.Editor.Serialization; +using TNodeCore.Models; using UnityEditor; using UnityEditor.UIElements; using UnityEngine; diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index ae5d75a..dbd8619 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -4,14 +4,14 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using TNode.Editor; -using TNode.Editor.Blackboard; -using TNode.Editor.EditorPersistence; using TNode.Editor.Inspector; -using TNode.Editor.NodeGraphView; using TNode.Editor.NodeViews; using TNode.Editor.Search; -using TNode.Editor.Tools.NodeCreator; -using TNode.Models; +using TNodeCore.Editor.Blackboard; +using TNodeCore.Editor.EditorPersistence; +using TNodeCore.Editor.NodeGraphView; +using TNodeCore.Editor.Tools.NodeCreator; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty; diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs index da69ff1..4e39aa4 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/SimpleGraphSubWindow.cs @@ -1,6 +1,6 @@ using System.Linq; using TNode.Editor; -using TNode.Editor.EditorPersistence; +using TNodeCore.Editor.EditorPersistence; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine.UIElements; diff --git a/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs index 285ce31..4f837c0 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/DefaultNodeView.cs @@ -1,5 +1,5 @@ using TNode.Editor.NodeViews; -using TNode.Models; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.NodeViews; namespace TNode.Editor{ diff --git a/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs index ad80fae..8bce179 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/DragNodeView.cs @@ -1,5 +1,5 @@ -using TNode.Attribute; -using TNode.Models; +using TNodeCore.Attribute; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.NodeViews; namespace TNode.Editor.NodeViews{ diff --git a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs index cdbf1ba..fe6a69e 100644 --- a/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs +++ b/TNodeGraphViewImpl/Editor/NodeViews/NodeView.cs @@ -1,10 +1,11 @@ using System; using System.Linq; using System.Reflection; -using TNode.Attribute.Ports; using TNode.Editor.Inspector; -using TNode.Editor.Serialization; -using TNode.Models; +using TNodeCore; +using TNodeCore.Attribute.Ports; +using TNodeCore.Editor.Serialization; +using TNodeCore.Models; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; diff --git a/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs index ac91d2e..35341c4 100644 --- a/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; -using TNode.Editor.NodeGraphView; +using TNodeCore.Editor.NodeGraphView; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; diff --git a/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs index 5ef4ced..d7deafd 100644 --- a/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs +++ b/TNodeGraphViewImpl/Editor/Search/NodeSearchWindowProvider.cs @@ -1,8 +1,8 @@ using System; using System.Collections.Generic; -using TNode.Editor.NodeGraphView; -using TNode.Editor.Tools.NodeCreator; -using TNode.Models; +using TNodeCore.Editor.NodeGraphView; +using TNodeCore.Editor.Tools.NodeCreator; +using TNodeCore.Models; using TNodeGraphViewImpl.Editor.Cache; using UnityEditor; using UnityEditor.Experimental.GraphView; From 1b030c7cd427dff5c5a98a07dfc3a8652496f49d Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Sat, 16 Jul 2022 12:14:57 +0800 Subject: [PATCH 15/17] fix: daily commit --- Resources.meta | 8 - ...Newtonsoft.Json-for-Unity.Converters.asset | 162 ------------------ ...nsoft.Json-for-Unity.Converters.asset.meta | 8 - Sample.meta | 8 - Sample/MathGraph.meta | 8 - Sample/MathGraph/Editor.meta | 8 - Sample/MathGraph/Editor/MathEditor.cs | 22 --- Sample/MathGraph/Editor/MathEditor.cs.meta | 14 -- Sample/MathGraph/Editor/MathGraphView.cs | 9 - Sample/MathGraph/Editor/MathGraphView.cs.meta | 11 -- .../Editor/NodeAttribute Editor Config.asset | 15 -- .../NodeAttribute Editor Config.asset.meta | 8 - Sample/MathGraph/MathGraph.cs | 10 -- Sample/MathGraph/MathGraph.cs.meta | 11 -- Sample/MathGraph/New MathGraph.asset | 23 --- Sample/MathGraph/New MathGraph.asset.meta | 8 - Sample/TestExposedReference.cs | 10 -- Sample/TestExposedReference.cs.meta | 3 - TNodeCore/Editor/IGraphEditor.cs | 8 + TNodeCore/Editor/IGraphEditor.cs.meta | 3 + .../NodeGraphView/IBaseDataGraphView.cs | 5 +- .../Editor/Serialization/NodeDataWrapper.cs | 76 ++++---- TNodeGraphViewImpl/Editor/GraphEditor.cs | 75 ++++++-- .../Editor/NodeGraphView/DataGraphView.cs | 11 +- 24 files changed, 122 insertions(+), 402 deletions(-) delete mode 100644 Resources.meta delete mode 100644 Resources/Newtonsoft.Json-for-Unity.Converters.asset delete mode 100644 Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta delete mode 100644 Sample.meta delete mode 100644 Sample/MathGraph.meta delete mode 100644 Sample/MathGraph/Editor.meta delete mode 100644 Sample/MathGraph/Editor/MathEditor.cs delete mode 100644 Sample/MathGraph/Editor/MathEditor.cs.meta delete mode 100644 Sample/MathGraph/Editor/MathGraphView.cs delete mode 100644 Sample/MathGraph/Editor/MathGraphView.cs.meta delete mode 100644 Sample/MathGraph/Editor/NodeAttribute Editor Config.asset delete mode 100644 Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta delete mode 100644 Sample/MathGraph/MathGraph.cs delete mode 100644 Sample/MathGraph/MathGraph.cs.meta delete mode 100644 Sample/MathGraph/New MathGraph.asset delete mode 100644 Sample/MathGraph/New MathGraph.asset.meta delete mode 100644 Sample/TestExposedReference.cs delete mode 100644 Sample/TestExposedReference.cs.meta create mode 100644 TNodeCore/Editor/IGraphEditor.cs create mode 100644 TNodeCore/Editor/IGraphEditor.cs.meta diff --git a/Resources.meta b/Resources.meta deleted file mode 100644 index d428cde..0000000 --- a/Resources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 630fb8569cca3804a80f2fb55f7890f2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Resources/Newtonsoft.Json-for-Unity.Converters.asset b/Resources/Newtonsoft.Json-for-Unity.Converters.asset deleted file mode 100644 index b01ce28..0000000 --- a/Resources/Newtonsoft.Json-for-Unity.Converters.asset +++ /dev/null @@ -1,162 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ce56e4dbb13e1644aa983b6dd170e4a7, type: 3} - m_Name: Newtonsoft.Json-for-Unity.Converters - m_EditorClassIdentifier: - useUnityContractResolver: 1 - useAllOutsideConverters: 0 - outsideConverters: - - enabled: 0 - converterName: TNode.JsonSerialize.NodeDataConverter - settings: [] - - enabled: 0 - converterName: TNode.JsonSerialize.UnityObjectConverter - settings: [] - - enabled: 0 - converterName: TNode.JsonSerialize.Vector3Converter - settings: [] - useAllUnityConverters: 1 - unityConverters: - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.AI.NavMesh.NavMeshQueryFilterConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.AI.NavMesh.NavMeshTriangulationConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Camera.CullingGroupEventConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Geometry.BoundsConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Geometry.BoundsIntConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Geometry.PlaneConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Geometry.RectConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Geometry.RectIntConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Geometry.RectOffsetConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Hashing.Hash128Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Color32Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.ColorConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Matrix4x4Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.QuaternionConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.SphericalHarmonicsL2Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Vector2Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Vector2IntConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Vector3Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Vector3IntConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Math.Vector4Converter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.NativeArray.NativeArrayConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Physics.JointDriveConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Physics.JointLimitsConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Physics.SoftJointLimitConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Physics2D.ColliderDistance2DConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Physics2D.ContactFilter2DConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Random.RandomStateConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Scripting.LayerMaskConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.UnityConverters.Scripting.RangeIntConverter - settings: [] - useAllJsonNetConverters: 1 - jsonNetConverters: - - enabled: 1 - converterName: Newtonsoft.Json.Converters.StringEnumConverter - settings: [] - - enabled: 1 - converterName: Newtonsoft.Json.Converters.VersionConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.BinaryConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.BsonObjectIdConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.DataSetConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.DataTableConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.DiscriminatedUnionConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.EntityKeyMemberConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.ExpandoObjectConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.IsoDateTimeConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.JavaScriptDateTimeConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.KeyValuePairConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.RegexConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.UnixDateTimeConverter - settings: [] - - enabled: 0 - converterName: Newtonsoft.Json.Converters.XmlNodeConverter - settings: [] diff --git a/Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta b/Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta deleted file mode 100644 index ec4e066..0000000 --- a/Resources/Newtonsoft.Json-for-Unity.Converters.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 466d3febdbd656c4f9728b1116b1564f -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample.meta b/Sample.meta deleted file mode 100644 index 053ada4..0000000 --- a/Sample.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 18f38c39496afae47ab40fb512c3ce7c -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph.meta b/Sample/MathGraph.meta deleted file mode 100644 index 911ec5f..0000000 --- a/Sample/MathGraph.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 23ebabfc8f40d2c4689dc4ec9a5786d5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph/Editor.meta b/Sample/MathGraph/Editor.meta deleted file mode 100644 index 1a654ad..0000000 --- a/Sample/MathGraph/Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 73ee98eea19fa9b42b9c7990a8161d56 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph/Editor/MathEditor.cs b/Sample/MathGraph/Editor/MathEditor.cs deleted file mode 100644 index a5bb700..0000000 --- a/Sample/MathGraph/Editor/MathEditor.cs +++ /dev/null @@ -1,22 +0,0 @@ -using TNode.Editor; -using UnityEditor; -using UnityEditor.Callbacks; -using UnityEditor.Experimental.GraphView; -using UnityEngine; -using UnityEngine.UIElements; -using System; -public class MathEditor : GraphEditor{ - [OnOpenAsset] - public static bool OnOpenAsset(int instanceID, int line){ - var graph = EditorUtility.InstanceIDToObject(instanceID) as MathGraph; - if (graph != null) - { - var wnd = GetWindow(); - wnd.titleContent = new GUIContent("MathGraph Editor"); - wnd.CreateGUI(); - wnd.GraphView.Data = graph; - return true; - } - return false; - } -} \ No newline at end of file diff --git a/Sample/MathGraph/Editor/MathEditor.cs.meta b/Sample/MathGraph/Editor/MathEditor.cs.meta deleted file mode 100644 index 7b70665..0000000 --- a/Sample/MathGraph/Editor/MathEditor.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: c9041cb574597424fa4124edc3f99af1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - m_ViewDataDictionary: {instanceID: 0} - - mVisualTreeAsset: {fileID: 9197481963319205126, guid: b67f6dcbe2361b649ad2b7845207321b, type: 3} - - graphEditorData: {fileID: 11400000, guid: f582a62cc8e00144f97b4dff1f9ba8cc, type: 2} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph/Editor/MathGraphView.cs b/Sample/MathGraph/Editor/MathGraphView.cs deleted file mode 100644 index 2e366ef..0000000 --- a/Sample/MathGraph/Editor/MathGraphView.cs +++ /dev/null @@ -1,9 +0,0 @@ -using TNodeCore.Attribute; -using TNodeGraphViewImpl.Editor.NodeGraphView; - -[ViewComponent] -public class MathGraphView : BaseDataGraphView{ - - - -} \ No newline at end of file diff --git a/Sample/MathGraph/Editor/MathGraphView.cs.meta b/Sample/MathGraph/Editor/MathGraphView.cs.meta deleted file mode 100644 index c7e283a..0000000 --- a/Sample/MathGraph/Editor/MathGraphView.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7f4d84b648626d24eb29bfeb81c85e3f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset b/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset deleted file mode 100644 index 4445e6d..0000000 --- a/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset +++ /dev/null @@ -1,15 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 99ad0af56b40495cb6bd6165e652266c, type: 3} - m_Name: NodeAttribute Editor Config - m_EditorClassIdentifier: - nodesData: [] diff --git a/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta b/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta deleted file mode 100644 index f33c3eb..0000000 --- a/Sample/MathGraph/Editor/NodeAttribute Editor Config.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f582a62cc8e00144f97b4dff1f9ba8cc -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph/MathGraph.cs b/Sample/MathGraph/MathGraph.cs deleted file mode 100644 index d480670..0000000 --- a/Sample/MathGraph/MathGraph.cs +++ /dev/null @@ -1,10 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System; -using TNodeCore.Models; - -[CreateAssetMenu(fileName = "New MathGraph", menuName = "TNode/MathGraph")] -[Serializable] -public class MathGraph : GraphData{ - -} \ No newline at end of file diff --git a/Sample/MathGraph/MathGraph.cs.meta b/Sample/MathGraph/MathGraph.cs.meta deleted file mode 100644 index 1420f5b..0000000 --- a/Sample/MathGraph/MathGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 73baeb2c71a23da4ca06e3e3e52d5a78 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/MathGraph/New MathGraph.asset b/Sample/MathGraph/New MathGraph.asset deleted file mode 100644 index 154660b..0000000 --- a/Sample/MathGraph/New MathGraph.asset +++ /dev/null @@ -1,23 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 73baeb2c71a23da4ca06e3e3e52d5a78, type: 3} - m_Name: New MathGraph - m_EditorClassIdentifier: - nodes: [] - nodeLinks: [] - entryNode: - rid: -2 - references: - version: 2 - RefIds: - - rid: -2 - type: {class: , ns: , asm: } diff --git a/Sample/MathGraph/New MathGraph.asset.meta b/Sample/MathGraph/New MathGraph.asset.meta deleted file mode 100644 index 041e2b1..0000000 --- a/Sample/MathGraph/New MathGraph.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4b23c513fb78ea44b8a11a0bf7c8479e -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Sample/TestExposedReference.cs b/Sample/TestExposedReference.cs deleted file mode 100644 index a44add9..0000000 --- a/Sample/TestExposedReference.cs +++ /dev/null @@ -1,10 +0,0 @@ -using UnityEngine; - -namespace Sample{ - // Create at Asset/Test - [CreateAssetMenu(fileName = "NewData", menuName = "Test/Data", order = 1)] - public class TestExposedReference:ScriptableObject{ - public ExposedReference camera; - public ExposedReference go; - } -} \ No newline at end of file diff --git a/Sample/TestExposedReference.cs.meta b/Sample/TestExposedReference.cs.meta deleted file mode 100644 index f6c4b0e..0000000 --- a/Sample/TestExposedReference.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: fed858872d394fb8896d48178f8a7d78 -timeCreated: 1657862979 \ No newline at end of file diff --git a/TNodeCore/Editor/IGraphEditor.cs b/TNodeCore/Editor/IGraphEditor.cs new file mode 100644 index 0000000..2426868 --- /dev/null +++ b/TNodeCore/Editor/IGraphEditor.cs @@ -0,0 +1,8 @@ +using TNodeCore.Editor.NodeGraphView; + +namespace TNodeCore.Editor{ + public interface IGraphEditor{ + public void SetGraphView(IBaseDataGraphView graphView); + public IBaseDataGraphView GetGraphView(); + } +} \ No newline at end of file diff --git a/TNodeCore/Editor/IGraphEditor.cs.meta b/TNodeCore/Editor/IGraphEditor.cs.meta new file mode 100644 index 0000000..d22ea95 --- /dev/null +++ b/TNodeCore/Editor/IGraphEditor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d84e826fe49d4314b8cc1241faf38fd9 +timeCreated: 1657944822 \ No newline at end of file diff --git a/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs index e30b7ca..bd13be7 100644 --- a/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs +++ b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs @@ -9,7 +9,8 @@ namespace TNodeCore.Editor.NodeGraphView{ public void CreateBlackboard(); public GraphData GetGraphData(); public BlackboardData GetBlackboardData(); - - + + + void SetGraphData(GraphData graph); } } \ No newline at end of file diff --git a/TNodeCore/Editor/Serialization/NodeDataWrapper.cs b/TNodeCore/Editor/Serialization/NodeDataWrapper.cs index 772e9a8..5d1846e 100644 --- a/TNodeCore/Editor/Serialization/NodeDataWrapper.cs +++ b/TNodeCore/Editor/Serialization/NodeDataWrapper.cs @@ -4,46 +4,46 @@ using TNodeCore.Models; using UnityEngine; namespace TNodeCore.Editor.Serialization{ - [Obsolete] - public class NodeDataWrapper : ScriptableObject where T : NodeData{ - public T Data; - private static readonly Dictionary> Cache = new (); - public event Action> OnValueChanged; - public static NodeDataWrapper Get(T data){ - if(Cache.ContainsKey(data)){ - return Cache[data]; - } - var wrapper = ScriptableObject.CreateInstance>(); - Cache.Add(data,wrapper); - return wrapper; - } - public NodeDataWrapper(T data){ - this.Data = data; - } - - public void SetValue(string path, object value){ - var fieldInfo = Data.GetType().GetField(path); - fieldInfo.SetValue(Data,value); - OnValueChanged?.Invoke(this); - } - public object GetValue(string path){ - var fieldInfo = Data.GetType().GetField(path); - return fieldInfo.GetValue(Data); - } - public static implicit operator T(NodeDataWrapper wrapper){ - if (wrapper == null) - return null; - return wrapper.Data; - - } - public static implicit operator NodeDataWrapper(T unWrapper){ - if (unWrapper == null) - return null; - return Get(unWrapper); - } - } + // public class NodeDataWrapper : ScriptableObject where T : NodeData{ + // public T Data; + // private static readonly Dictionary> Cache = new (); + // public event Action> OnValueChanged; + // public static NodeDataWrapper Get(T data){ + // if(Cache.ContainsKey(data)){ + // return Cache[data]; + // } + // var wrapper = ScriptableObject.CreateInstance>(); + // Cache.Add(data,wrapper); + // return wrapper; + // } + // public NodeDataWrapper(T data){ + // this.Data = data; + // } + // + // public void SetValue(string path, object value){ + // var fieldInfo = Data.GetType().GetField(path); + // fieldInfo.SetValue(Data,value); + // OnValueChanged?.Invoke(this); + // } + // + // public object GetValue(string path){ + // var fieldInfo = Data.GetType().GetField(path); + // return fieldInfo.GetValue(Data); + // } + // public static implicit operator T(NodeDataWrapper wrapper){ + // if (wrapper == null) + // return null; + // return wrapper.Data; + // + // } + // public static implicit operator NodeDataWrapper(T unWrapper){ + // if (unWrapper == null) + // return null; + // return Get(unWrapper); + // } + // } public class NodeDataWrapper:DataWrapper{ } diff --git a/TNodeGraphViewImpl/Editor/GraphEditor.cs b/TNodeGraphViewImpl/Editor/GraphEditor.cs index 2a01b69..4721969 100644 --- a/TNodeGraphViewImpl/Editor/GraphEditor.cs +++ b/TNodeGraphViewImpl/Editor/GraphEditor.cs @@ -1,25 +1,60 @@ -using Codice.CM.Common; -using TNode.Editor.Inspector; +using System; +using TNodeCore.Editor; using TNodeCore.Editor.EditorPersistence; +using TNodeCore.Editor.NodeGraphView; using TNodeCore.Models; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.NodeGraphView; using UnityEditor; -using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UIElements; -namespace TNode.Editor{ +namespace TNodeGraphViewImpl.Editor{ - - public abstract class GraphEditor : EditorWindow where T:GraphData{ + // public class SelectGraphWindow : EditorWindow{ + // public EditorWindow parent; + // public Type graphType; + // public static void ShowWindow (GraphEditor parent) where T:GraphData{ + // var window = GetWindow(); + // window.graphType = typeof(T); + // window.Show(); + // window.parent = parent; + // } + // private void OnGUI(){ + // + // if(GUILayout.Button("Create An Graph")){ + // //Add a save file dialog to save the graph + // //Create the graph + // var graphAsset = ScriptableObject.CreateInstance(graphType); + // var path = EditorUtility.SaveFilePanel("Save Graph", "", "", "asset"); + // //Save the graph + // AssetDatabase.CreateAsset(graphAsset, path); + // AssetDatabase.SaveAssets(); + // AssetDatabase.Refresh(); + // //Load the graph + // var graph = AssetDatabase.LoadAssetAtPath(path) as GraphData; + // var graphEditor = parent as IGraphEditor; + // if (graphEditor.GetGraphView() != null){ + // graphEditor.GetGraphView().SetGraphData(graph); + // Debug.Log(graph); + // } + // } + // //Drag and drop a graph asset to load it + // if(Event.current.type == EventType.DragUpdated){ + // DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + // Event.current.Use(); + // } + // } + // } + public abstract class GraphEditor : EditorWindow,IGraphEditor where T:GraphData{ protected BaseDataGraphView GraphView; [SerializeField] private VisualTreeAsset mVisualTreeAsset = default; //Persist editor data ,such as node position,node size ,etc ,in this script object [FormerlySerializedAs("nodeEditorData")] public GraphEditorData graphEditorData; - + private bool _windowShowed=false; + public void CreateGUI(){ // Each editor window contains a root VisualElement object @@ -28,12 +63,25 @@ namespace TNode.Editor{ // Instantiate UXML VisualElement labelFromUXML = mVisualTreeAsset.Instantiate(); root.Add(labelFromUXML); - + BuildGraphView(); DefineGraphEditorActions(); OnCreate(); } - + + public void Update(){ + if (GraphView == null) return; + if (GraphView.Data != null) return; + if (_windowShowed==false){ + _windowShowed = true; + } + } + + + public void Setup(T graphData){ + GraphView.Owner = this; + GraphView.Data = graphData; + } private void BuildGraphView(){ GraphView = NodeEditorExtensions.CreateViewComponentFromBaseType>(); rootVisualElement.Add(GraphView); @@ -75,6 +123,13 @@ namespace TNode.Editor{ protected virtual void OnCreate(){ } - + + public void SetGraphView(IBaseDataGraphView graphView){ + GraphView = graphView as BaseDataGraphView; + } + + public IBaseDataGraphView GetGraphView(){ + return GraphView; + } } } diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index dbd8619..6c17f8f 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -1,11 +1,7 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Linq; -using System.Reflection; -using TNode.Editor; using TNode.Editor.Inspector; -using TNode.Editor.NodeViews; using TNode.Editor.Search; using TNodeCore.Editor.Blackboard; using TNodeCore.Editor.EditorPersistence; @@ -14,7 +10,6 @@ using TNodeCore.Editor.Tools.NodeCreator; using TNodeCore.Models; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.GraphBlackboard; -using TNodeGraphViewImpl.Editor.GraphBlackboard.BlackboardProperty; using TNodeGraphViewImpl.Editor.NodeViews; using UnityEditor; using UnityEditor.Experimental.GraphView; @@ -116,7 +111,6 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ } private void OnDragUpdated(DragUpdatedEvent evt){ - Debug.Log(evt); //check if the drag data is BlackboardField @@ -376,6 +370,11 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ public BlackboardData GetBlackboardData(){ return this._data.blackboardData; } + + public void SetGraphData(GraphData graph){ + Data = graph as T; + } + #endregion } From 7e422bff292164069c82dc00df61693c3a00b916 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Sat, 16 Jul 2022 14:04:51 +0800 Subject: [PATCH 16/17] feat:runtime graph support --- .../NodeGraphView/IBaseDataGraphView.cs | 6 +- .../Editor/Resources/GraphViewBackground.uss | 9 ++ TNodeCore/Runtime/RuntimeGraph.cs | 3 +- .../DefaultGraphBlackboardView.cs | 7 +- .../GraphBlackboardPropertyField.cs | 11 +- TNodeGraphViewImpl/Editor/GraphEditor.cs | 5 +- .../Editor/NodeGraphView/DataGraphView.cs | 106 ++++++++++++++++-- .../Search/BlackboardSearchWindowProvider.cs | 1 - 8 files changed, 128 insertions(+), 20 deletions(-) diff --git a/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs index bd13be7..14e0ae3 100644 --- a/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs +++ b/TNodeCore/Editor/NodeGraphView/IBaseDataGraphView.cs @@ -9,8 +9,10 @@ namespace TNodeCore.Editor.NodeGraphView{ public void CreateBlackboard(); public GraphData GetGraphData(); public BlackboardData GetBlackboardData(); + + public bool IsRuntimeGraph{ get; set; } - - void SetGraphData(GraphData graph); + public void SetGraphData(GraphData graph); + } } \ No newline at end of file diff --git a/TNodeCore/Editor/Resources/GraphViewBackground.uss b/TNodeCore/Editor/Resources/GraphViewBackground.uss index 44451b6..e9d3385 100644 --- a/TNodeCore/Editor/Resources/GraphViewBackground.uss +++ b/TNodeCore/Editor/Resources/GraphViewBackground.uss @@ -4,3 +4,12 @@ GridBackground{ --thick-line-color: rgba(211, 211, 211, 0.2); --spacing:50; } + +#HintLabel{ + position: absolute; + left: 45%; + top: 45%; + + font-size: 14; + +} \ No newline at end of file diff --git a/TNodeCore/Runtime/RuntimeGraph.cs b/TNodeCore/Runtime/RuntimeGraph.cs index 1d019e4..9df5282 100644 --- a/TNodeCore/Runtime/RuntimeGraph.cs +++ b/TNodeCore/Runtime/RuntimeGraph.cs @@ -11,7 +11,8 @@ namespace TNodeCore.Runtime{ public void OnValidate(){ if(runtimeBlackboardData==null||runtimeBlackboardData.GetType()==typeof(BlackboardData)){ - runtimeBlackboardData = graphData?.blackboardData; + if(graphData!=null) + runtimeBlackboardData = RuntimeCache.RuntimeCache.Instance.GetBlackboardData(graphData); } } } diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs index 0a74e1a..129d9ea 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/DefaultGraphBlackboardView.cs @@ -2,6 +2,7 @@ using System.Reflection; using TNode.Editor.Search; using TNodeCore.Attribute; +using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.Serialization; using TNodeCore.Models; using UnityEditor; @@ -21,6 +22,8 @@ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ protected override void UpdateBlackboard(BlackboardData data){ if (data == null) return; var serializedObject = new SerializedObject((BlackboardDataWrapper)data); + var currentGraphView = graphView as IBaseDataGraphView; + var isRuntimeGraph = currentGraphView?.IsRuntimeGraph ?? false; foreach (var field in data.GetType() .GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)){ //if the field is MonoBehaviour,add a property field for blackboard @@ -31,14 +34,12 @@ namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ var foldoutData = new Foldout{ text = field.Name }; - var drawer = new GraphBlackboardPropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name); + var drawer = new GraphBlackboardPropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name,isRuntimeGraph); drawer.Bind(serializedObject); foldoutData.Add(drawer); visualElement.Add(propertyField); visualElement.Add(foldoutData); - Add(visualElement); - } else{ var blackboardList = new BlackboardSection{ diff --git a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs index e96416f..33c40e6 100644 --- a/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs +++ b/TNodeGraphViewImpl/Editor/GraphBlackboard/GraphBlackboardPropertyField.cs @@ -4,15 +4,18 @@ using UnityEngine.UIElements; namespace TNodeGraphViewImpl.Editor.GraphBlackboard{ public class GraphBlackboardPropertyField:PropertyField{ - public GraphBlackboardPropertyField(SerializedProperty findPropertyRelative, string fieldName):base(findPropertyRelative, fieldName){ - - } + private readonly bool _runtime; + public GraphBlackboardPropertyField(SerializedProperty findPropertyRelative, string fieldName,bool runtime):base(findPropertyRelative, fieldName){ + _runtime = runtime; + } + protected override void ExecuteDefaultActionAtTarget(EventBase evt) { + base.ExecuteDefaultActionAtTarget(evt); if (this.Q() != null){ - this.Q().allowSceneObjects = false; + this.Q().allowSceneObjects = _runtime; } } diff --git a/TNodeGraphViewImpl/Editor/GraphEditor.cs b/TNodeGraphViewImpl/Editor/GraphEditor.cs index 4721969..f6c2460 100644 --- a/TNodeGraphViewImpl/Editor/GraphEditor.cs +++ b/TNodeGraphViewImpl/Editor/GraphEditor.cs @@ -66,6 +66,7 @@ namespace TNodeGraphViewImpl.Editor{ BuildGraphView(); DefineGraphEditorActions(); + GraphView.Owner = this; OnCreate(); } @@ -78,9 +79,9 @@ namespace TNodeGraphViewImpl.Editor{ } - public void Setup(T graphData){ - GraphView.Owner = this; + public void SetupNonRuntime(T graphData){ GraphView.Data = graphData; + GraphView.IsRuntimeGraph = false; } private void BuildGraphView(){ GraphView = NodeEditorExtensions.CreateViewComponentFromBaseType>(); diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index 6c17f8f..d2713d5 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -8,19 +8,25 @@ using TNodeCore.Editor.EditorPersistence; using TNodeCore.Editor.NodeGraphView; using TNodeCore.Editor.Tools.NodeCreator; using TNodeCore.Models; +using TNodeCore.Runtime; using TNodeGraphViewImpl.Editor.Cache; using TNodeGraphViewImpl.Editor.GraphBlackboard; using TNodeGraphViewImpl.Editor.NodeViews; + using UnityEditor; using UnityEditor.Experimental.GraphView; +using UnityEditor.VersionControl; using UnityEngine; using UnityEngine.UIElements; + using Edge = UnityEditor.Experimental.GraphView.Edge; namespace TNodeGraphViewImpl.Editor.NodeGraphView{ public abstract class BaseDataGraphView:GraphView,IDataGraphView where T:GraphData{ #region variables and properties private T _data; + private RuntimeGraph _runtimeGraph; + private bool _isInspectorOn; private NodeSearchWindowProvider _nodeSearchWindowProvider; private NodeInspector _nodeInspector; @@ -59,7 +65,91 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); RegisterDragEvent(); OnInit(); + CheckAfterInit(); } + /// + /// Probably reusable in later GTFs version + /// + private void WaitingForAGraph(){ + Debug.Log("hello"); + VisualElement visualElement = new VisualElement(); + //Set background color to white + visualElement.style.backgroundColor = new StyleColor(new Color(0.1f, 0.1f, 0.1f, 1)); + + Debug.Log("hello2"); + visualElement.StretchToParentSize(); + visualElement.name = "WaitingForAGraph"; + Add(visualElement); + visualElement.BringToFront(); + + + //Add a label at the center of the created element + Label label = new Label("drag a graph item here"){ + style ={ + position = Position.Absolute + }, + name = "HintLabel" + }; + + visualElement.RegisterCallback((evt) => { + //check if the dragged object is a graph data or a Game Object contains a runtime graph + var res = DragAndDrop.objectReferences; + foreach (var obj in res){ + if (obj is T graphData){ + Data = graphData; + IsRuntimeGraph = false; + } + else{ + if (obj is GameObject gameObject){ + + if (gameObject.GetComponent() != null){ + if (gameObject.GetComponent().graphData != null){ + + _runtimeGraph = gameObject.GetComponent(); + IsRuntimeGraph = true; + + + Data = gameObject.GetComponent().graphData as T; + if(Data==null){ + Debug.LogError($"Dragged a wrong graph data to editor,expected {typeof(T)} but got {gameObject.GetComponent().graphData.GetType()}"); + } + + } + } + } + } + } + }); + visualElement.RegisterCallback((evt) => { + //check if the dragged object is a graph data or a Game Object contains a runtime graph + var res = DragAndDrop.objectReferences; + foreach (var obj in res){ + if (obj is GraphData graphData){ + DragAndDrop.visualMode = DragAndDropVisualMode.Link; + } + else{ + if (obj is GameObject gameObject){ + if (gameObject.GetComponent() != null){ + DragAndDrop.visualMode = DragAndDropVisualMode.Link; + } + } + } + } + + }); + visualElement.Add(label); + OnDataChanged += (sender, e) => { + if (Data != null){ + visualElement.RemoveFromHierarchy(); + } + }; + } + private void CheckAfterInit(){ + if(Data == null){ + WaitingForAGraph(); + } + } + private void ConstructDefaultBehaviour(){ //Register a right click context menu ConstructViewContextualMenu(); @@ -101,7 +191,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ if(selectable is { } field) { //Make a constructor of BlackboardDragNodeData by reflection var dragNodeData = NodeCreator.InstantiateNodeData(); - dragNodeData.blackboardData = _data.blackboardData; + dragNodeData.blackboardData = GetBlackboardData(); dragNodeData.blackDragData = field.BlackboardProperty.PropertyName; AddTNode(dragNodeData,new Rect(evt.mousePosition,new Vector2(200,200))); } @@ -182,7 +272,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ public virtual void CreateMiniMap(Rect rect){ var miniMap = new MiniMap(); - this.Add(miniMap); + Add(miniMap); miniMap.SetPosition(rect); } @@ -194,7 +284,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ if (_data.blackboardData == null) return; } - _blackboard.SetBlackboardData(_data.blackboardData); + _blackboard.SetBlackboardData(GetBlackboardData()); } public virtual void DestroyInspector(){ @@ -352,13 +442,10 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ _blackboard.Setup(this,Owner); var castedBlackboard = _blackboard as Blackboard; - Add(castedBlackboard); - Rect blackboardPos = new Rect(0,0,300,700); castedBlackboard?.SetPosition(blackboardPos); - OnDataChanged+= (sender, e) => { BlackboardUpdate(); }; } @@ -368,9 +455,14 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ public BlackboardData GetBlackboardData(){ - return this._data.blackboardData; + if (IsRuntimeGraph){ + return _runtimeGraph.runtimeBlackboardData; + } + return _data.blackboardData; } + public bool IsRuntimeGraph{ get; set; } + public void SetGraphData(GraphData graph){ Data = graph as T; } diff --git a/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs index 35341c4..4eedc26 100644 --- a/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs +++ b/TNodeGraphViewImpl/Editor/Search/BlackboardSearchWindowProvider.cs @@ -45,7 +45,6 @@ namespace TNode.Editor.Search{ } Debug.Log($"{list.Count}"); return list; - } public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context){ From 85a684569e934a33a0654ff8ecc5157c990c0733 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Sat, 16 Jul 2022 19:53:08 +0800 Subject: [PATCH 17/17] feat:allowing runtime node traversal with non circular graph --- TNodeCore/Attribute/RuntimeNodeAttribute.cs | 6 + .../Attribute/RuntimeNodeAttribute.cs.meta | 3 + TNodeCore/Models/BlackboardData.cs | 5 +- TNodeCore/Models/NodeData.cs | 12 +- TNodeCore/Models/NodeLink.cs | 2 + TNodeCore/Runtime/RuntimeGraph.cs | 140 +++++++++++++++++- TNodeCore/Runtime/RuntimeNode.cs | 39 ++++- TNodeCore/RuntimeCache/RuntimeCache.cs | 69 +++++++-- .../Editor/Cache/NodeEditorExtensions.cs | 3 + .../Editor/Inspector/NodeInspectorInNode.cs | 14 ++ .../Editor/NodeGraphView/DataGraphView.cs | 2 +- 11 files changed, 266 insertions(+), 29 deletions(-) create mode 100644 TNodeCore/Attribute/RuntimeNodeAttribute.cs create mode 100644 TNodeCore/Attribute/RuntimeNodeAttribute.cs.meta diff --git a/TNodeCore/Attribute/RuntimeNodeAttribute.cs b/TNodeCore/Attribute/RuntimeNodeAttribute.cs new file mode 100644 index 0000000..6d2ad80 --- /dev/null +++ b/TNodeCore/Attribute/RuntimeNodeAttribute.cs @@ -0,0 +1,6 @@ +using JetBrains.Annotations; +using TNodeCore.Models; + +namespace TNodeCore.Attribute{ + +} \ No newline at end of file diff --git a/TNodeCore/Attribute/RuntimeNodeAttribute.cs.meta b/TNodeCore/Attribute/RuntimeNodeAttribute.cs.meta new file mode 100644 index 0000000..ec78521 --- /dev/null +++ b/TNodeCore/Attribute/RuntimeNodeAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e489ca10c5734869be9bce6e1a18297e +timeCreated: 1657952959 \ No newline at end of file diff --git a/TNodeCore/Models/BlackboardData.cs b/TNodeCore/Models/BlackboardData.cs index 95b35b6..1da25ce 100644 --- a/TNodeCore/Models/BlackboardData.cs +++ b/TNodeCore/Models/BlackboardData.cs @@ -6,6 +6,9 @@ namespace TNodeCore.Models{ /// [Serializable] - public class BlackboardData:IModel{ + public class BlackboardData:IModel,ICloneable{ + public object Clone(){ + return this.MemberwiseClone(); + } } } \ No newline at end of file diff --git a/TNodeCore/Models/NodeData.cs b/TNodeCore/Models/NodeData.cs index 79aeb10..3e1565a 100644 --- a/TNodeCore/Models/NodeData.cs +++ b/TNodeCore/Models/NodeData.cs @@ -1,5 +1,6 @@ using System; using TNodeCore.Attribute; +using UnityEngine; namespace TNodeCore.Models{ /// @@ -22,12 +23,15 @@ namespace TNodeCore.Models{ public bool entryPoint; - public virtual void OnProcess(){ + public virtual void Process(){ } -// #if UNITY_EDITOR -// public Rect rect; -// #endif +#if UNITY_EDITOR + [HideInInspector] public bool isTest; + public virtual void OnTest(){ + + } + #endif } } \ No newline at end of file diff --git a/TNodeCore/Models/NodeLink.cs b/TNodeCore/Models/NodeLink.cs index dfccbcc..1b929ac 100644 --- a/TNodeCore/Models/NodeLink.cs +++ b/TNodeCore/Models/NodeLink.cs @@ -7,9 +7,11 @@ namespace TNodeCore.Models{ // public DialogueNodePortData From{ get; } public PortInfo inPort; public PortInfo outPort; + public NodeLink(PortInfo inPort, PortInfo outPort){ this.inPort = inPort; this.outPort = outPort; } + } } \ No newline at end of file diff --git a/TNodeCore/Runtime/RuntimeGraph.cs b/TNodeCore/Runtime/RuntimeGraph.cs index 9df5282..06cae28 100644 --- a/TNodeCore/Runtime/RuntimeGraph.cs +++ b/TNodeCore/Runtime/RuntimeGraph.cs @@ -1,20 +1,152 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; using TNodeCore.Models; using UnityEngine; namespace TNodeCore.Runtime{ public class RuntimeGraph:MonoBehaviour{ public GraphData graphData; - public SortedSet _sortedSet; + + public readonly Dictionary RuntimeNodes = new Dictionary(); + + private GraphTool _graphTool; + + private class GraphTool{ + [NonSerialized] + public readonly List TopologicalOrder = new List(); + public readonly List EntryNodes = new List(); + public readonly Dictionary RuntimeNodes; + public void DependencyTraversal(RuntimeNode runtimeNode){ + var links = runtimeNode.InputLink; + foreach (var link in links){ + var outputNode = RuntimeNodes[link.outPort.nodeDataId]; + DependencyTraversal(outputNode); + HandlingLink(link); + } + runtimeNode.NodeData.Process(); + } + + public void HandlingLink(NodeLink nodeLink){ + var inNode = RuntimeNodes[nodeLink.inPort.nodeDataId]; + var outNode = RuntimeNodes[nodeLink.outPort.nodeDataId]; + + //out node is node output data + //in node is node receive data + var outValue = outNode.GetOutput(nodeLink.outPort.portName); + inNode.SetInput(nodeLink.inPort.portName, outValue); + } + public GraphTool(List list, Dictionary graphNodes){ + RuntimeNodes = graphNodes; + if (list == null) return; + Queue queue = new Queue(); + Dictionary inDegreeCounterForTopologicalSort = new Dictionary(); + foreach (var runtimeNode in list){ + var id = runtimeNode.NodeData.id; + if (!inDegreeCounterForTopologicalSort.ContainsKey(id)){ + inDegreeCounterForTopologicalSort.Add(id,runtimeNode.InputLink.Count); + } + if (inDegreeCounterForTopologicalSort[id] == 0){ + queue.Enqueue(runtimeNode); + EntryNodes.Add(runtimeNode); + } + } + + //Topological sort + while (queue.Count > 0){ + var node = queue.Dequeue(); + TopologicalOrder.Add(node); + foreach (var outputLink in node.OutputLink){ + inDegreeCounterForTopologicalSort[outputLink.inPort.nodeDataId]--; + if (inDegreeCounterForTopologicalSort[outputLink.inPort.nodeDataId] == 0){ + queue.Enqueue(RuntimeNodes[outputLink.inPort.nodeDataId]); + } + } + } + if(TopologicalOrder.Count!= list.Count){ + throw new Exception("Topological sort failed,circular dependency detected"); + } + RuntimeNodes.Clear(); + inDegreeCounterForTopologicalSort.Clear(); + queue.Clear(); + } + + + } [SerializeReference] public BlackboardData runtimeBlackboardData; + + private bool _build = false; + public void Build(){ + + var link = graphData.NodeLinks; + //iterate links and create runtime nodes + foreach (var linkData in link){ + ModifyOrCreateInNode(linkData); + ModifyOrCreateOutNode(linkData); + } + var nodeList = RuntimeNodes.Values; + _graphTool = new GraphTool(nodeList.ToList(),RuntimeNodes); + _build = true; + } + + public RuntimeNode Get(NodeData nodeData){ + if(!_build) + Build(); + + if(RuntimeNodes.ContainsKey(nodeData.id)){ + return RuntimeNodes[nodeData.id]; + } + return null; + } + + public RuntimeNode Get(string id){ + if (RuntimeNodes.ContainsKey(id)){ + return RuntimeNodes[id]; + } + + return null; + } + //DFS search for resolving dependency + public void StartDependencyTraversal(NodeData startNode,NodeData currentNode,int level=0){ + if (!_build) + Build(); + if(_graphTool==null) + return; + _graphTool.DependencyTraversal(Get(startNode)); + var inputNodesId = Get(currentNode).GetInputNodesId(); + foreach (var s in inputNodesId){ + var runtimeNode = Get(s); + } + } + private void ModifyOrCreateInNode(NodeLink linkData){ + var inNodeId = linkData.inPort.nodeDataId; + var inNode = graphData.NodeDictionary[inNodeId]; + if (!RuntimeNodes.ContainsKey(inNode.id)){ + var runtimeInNode = new RuntimeNode(inNode); + RuntimeNodes.Add(inNode.id,runtimeInNode); + } + RuntimeNodes[inNode.id].InputLink.Add(linkData); + + } + private void ModifyOrCreateOutNode(NodeLink linkData){ + var outNodeId = linkData.outPort.nodeDataId; + var outNode = graphData.NodeDictionary[outNodeId]; + if(!RuntimeNodes.ContainsKey(outNode.id)){ + var runtimeOutNode = new RuntimeNode(outNode); + RuntimeNodes.Add(outNode.id,runtimeOutNode); + } + RuntimeNodes[outNode.id].OutputLink.Add(linkData); + } public void OnValidate(){ if(runtimeBlackboardData==null||runtimeBlackboardData.GetType()==typeof(BlackboardData)){ - if(graphData!=null) - runtimeBlackboardData = RuntimeCache.RuntimeCache.Instance.GetBlackboardData(graphData); + if (graphData != null) + runtimeBlackboardData = graphData.blackboardData.Clone() as BlackboardData; } } + + } public enum ProcessingStrategy{ diff --git a/TNodeCore/Runtime/RuntimeNode.cs b/TNodeCore/Runtime/RuntimeNode.cs index 428b763..b83e15a 100644 --- a/TNodeCore/Runtime/RuntimeNode.cs +++ b/TNodeCore/Runtime/RuntimeNode.cs @@ -1,12 +1,39 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using Codice.Client.Common.TreeGrouper; using TNodeCore.Models; +using TNodeCore.RuntimeCache; namespace TNodeCore.Runtime{ - public abstract class RuntimeNode{ - public NodeData NodeData; - public List NodeLinks; - public void ProcessThisNode(){ - NodeData.OnProcess(); + public class RuntimeNode{ + public NodeData NodeData { get; set; } + //the link connect to node's in port + public List InputLink; + //the link connect to node's out port + public List OutputLink; + public Type type; + + + public void SetInput(string portName,object value){ + NodeData.SetValue(portName, value); + } + public object GetOutput(string portName){ + return NodeData.GetValue(portName); + } + + public RuntimeNode(NodeData nodeData){ + NodeData = nodeData; + //Caching the type of the node + type = nodeData.GetType(); + } + public List GetInputNodesId(){ + List dependencies = new List(); + foreach (NodeLink link in InputLink) + { + dependencies.Add(link.outPort.nodeDataId); + } + return dependencies; } + } } \ No newline at end of file diff --git a/TNodeCore/RuntimeCache/RuntimeCache.cs b/TNodeCore/RuntimeCache/RuntimeCache.cs index 6afe225..d3a1a79 100644 --- a/TNodeCore/RuntimeCache/RuntimeCache.cs +++ b/TNodeCore/RuntimeCache/RuntimeCache.cs @@ -50,6 +50,11 @@ namespace TNodeCore.RuntimeCache{ AddBlackboardDataTypeToCache(type,attribute); RegisterRuntimeBlackboard(type); } + //Check if the type is a node data type + if(typeof(NodeData).IsAssignableFrom(type)){ + //if it is, add it to the cache + RegisterRuntimeNodeData(type); + } } @@ -101,6 +106,41 @@ namespace TNodeCore.RuntimeCache{ } } + public void RegisterRuntimeNodeData(Type type){ + if (type == null) return; + if(!CachedDelegatesForGettingValue.ContainsKey(type)){ + CachedDelegatesForGettingValue.Add(type, new Dictionary()); + CachedDelegatesForSettingValue.Add(type,new Dictionary()); + var properties = type.GetProperties(); + foreach(var property in properties){ + //if the property only has a setter ,skip + + if(property.SetMethod != null){ + var setValueDelegate = SetValueDelegateForProperty(property); + CachedDelegatesForSettingValue[type].Add(property.Name,setValueDelegate); + } + if(property.GetMethod != null){ + var getValueDelegate = GetValueDelegateForProperty(property); + CachedDelegatesForGettingValue[type].Add(property.Name,getValueDelegate); + } + + + + } + //register the fields + var fields = type.GetFields(); + foreach(var field in fields){ + + var getValueDelegate = GetValueDelegateForField(field); + CachedDelegatesForGettingValue[type].Add(field.Name,getValueDelegate); + if (field.IsPublic){ + var setValueDelegate = SetValueDelegateForField(field); + CachedDelegatesForSettingValue[type].Add(field.Name,setValueDelegate); + } + + } + } + } private GetValueDelegate GetValueDelegateForField(FieldInfo field){ return field.GetValue; } @@ -120,26 +160,29 @@ namespace TNodeCore.RuntimeCache{ public static class RuntimeExtension{ //todo latter on i will try some way caching reflection more efficiently - public static T GetValue(this BlackboardData blackboardData,string path){ - var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; - return (T) method.Invoke(blackboardData); + public static T GetValue(this IModel data,string path,Type type=null){ + var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[type??data.GetType()][path]; + return (T) method.Invoke(data); } - public static object GetValue(this BlackboardData blackboardData, string path){ - var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; - return method.Invoke(blackboardData); + public static object GetValue(this IModel data, string path,Type type=null){ + var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[type??data.GetType()][path]; + return method.Invoke(data); } - public static void SetValue(this BlackboardData blackboardData,string path,T value){ - var method = RuntimeCache.Instance.CachedDelegatesForSettingValue[blackboardData.GetType()][path]; - method.Invoke(blackboardData,value); + + public static void SetValue(this IModel data,string path,T value,Type type=null){ + var method = RuntimeCache.Instance.CachedDelegatesForSettingValue[type??data.GetType()][path]; + method.Invoke(data,value); } - public static void SetValue(this BlackboardData blackboardData,string path,object value){ - var method = RuntimeCache.Instance.CachedDelegatesForSettingValue[blackboardData.GetType()][path]; - method.Invoke(blackboardData,value); + public static void SetValue(this IModel data,string path,object value,Type type=null){ + var method = RuntimeCache.Instance.CachedDelegatesForSettingValue[type??data.GetType()][path]; + method.Invoke(data,value); } - public static RuntimeCache.GetValueDelegate GetValueDelegate(this BlackboardData blackboardData,string path){ + public static RuntimeCache.GetValueDelegate GetValueDelegate(this IModel blackboardData,string path){ var method = RuntimeCache.Instance.CachedDelegatesForGettingValue[blackboardData.GetType()][path]; return method; } + + } } \ No newline at end of file diff --git a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs index 68460b3..5d55934 100644 --- a/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs +++ b/TNodeGraphViewImpl/Editor/Cache/NodeEditorExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using TNode.Editor; using TNode.Editor.NodeViews; using TNodeCore.Attribute; @@ -58,10 +59,12 @@ namespace TNodeGraphViewImpl.Editor.Cache{ SetViewComponentAttribute(type); //Register Node Data by GraphUsageAttribute. SetGraphUsageAttribute(type); + } } } } + private void SetGraphUsageAttribute(Type type){ foreach (var attribute in type.GetCustomAttributes(typeof(GraphUsageAttribute), true)){ diff --git a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs index 4660f6a..8d44a8c 100644 --- a/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs +++ b/TNodeGraphViewImpl/Editor/Inspector/NodeInspectorInNode.cs @@ -36,6 +36,9 @@ namespace TNode.Editor.Inspector{ RefreshPropertyDrawer(); } + private void CreateTestButton(){ + + } private void RefreshPropertyDrawer(){ //Check if the data's type is a generic type of BlackboardDragNodeData<> if (_data.GetType().IsSubclassOf(typeof(BlackboardDragNodeData))){ @@ -51,6 +54,17 @@ namespace TNode.Editor.Inspector{ var drawer = new PropertyField(serializedObject.FindProperty("data").FindPropertyRelative(field.Name),field.Name); drawer.Bind(serializedObject); Add(drawer); + + + } + if (_data.isTest){ + //Add a test button for the node + var testButton = new Button(()=>{ + Debug.Log("Test button clicked"); + }); + testButton.text = "Test"; + _data.OnTest(); + Add(testButton); } } diff --git a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs index d2713d5..e23b499 100644 --- a/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs +++ b/TNodeGraphViewImpl/Editor/NodeGraphView/DataGraphView.cs @@ -376,7 +376,7 @@ namespace TNodeGraphViewImpl.Editor.NodeGraphView{ public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter){ - return ports.Where(x => x.portType == startPort.portType).ToList(); + return ports.Where(x => x.portType == startPort.portType || x.portType.IsAssignableFrom(startPort.portType)).ToList(); } public virtual void OnGraphViewCreate(){