From f6d5632a0bf02b514d1a0462a27ad587b94eb9e4 Mon Sep 17 00:00:00 2001 From: taoria <445625470@qq.com> Date: Thu, 7 Jul 2022 20:22:48 +0800 Subject: [PATCH] 1.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