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] 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