8
8
using System . Linq ;
9
9
using System ;
10
10
using UnityEditor . SceneManagement ;
11
+ using System . Reflection ;
11
12
12
13
using Status = UnityEngine . UIElements . DropdownMenuAction . Status ;
13
14
using Object = UnityEngine . Object ;
@@ -123,6 +124,8 @@ public class BaseGraphView : GraphView, IDisposable
123
124
124
125
public SerializedObject serializedGraph { get ; private set ; }
125
126
127
+ Dictionary < Type , Type > nodeTypePerCreateAssetType = new Dictionary < Type , Type > ( ) ;
128
+
126
129
public BaseGraphView ( EditorWindow window )
127
130
{
128
131
serializeGraphElements = SerializeGraphElementsCallback ;
@@ -588,25 +591,52 @@ void DragPerformedCallback(DragPerformEvent e)
588
591
var mousePos = ( e . currentTarget as VisualElement ) . ChangeCoordinatesTo ( contentViewContainer , e . localMousePosition ) ;
589
592
var dragData = DragAndDrop . GetGenericData ( "DragSelection" ) as List < ISelectable > ;
590
593
591
- if ( dragData == null )
592
- return ;
594
+ // Drag and Drop for elements inside the graph
595
+ if ( dragData != null )
596
+ {
597
+ var exposedParameterFieldViews = dragData . OfType < ExposedParameterFieldView > ( ) ;
598
+ if ( exposedParameterFieldViews . Any ( ) )
599
+ {
600
+ foreach ( var paramFieldView in exposedParameterFieldViews )
601
+ {
602
+ RegisterCompleteObjectUndo ( "Create Parameter Node" ) ;
603
+ var paramNode = BaseNode . CreateFromType < ParameterNode > ( mousePos ) ;
604
+ paramNode . parameterGUID = paramFieldView . parameter . guid ;
605
+ AddNode ( paramNode ) ;
606
+ }
607
+ }
608
+ }
593
609
594
- var exposedParameterFieldViews = dragData . OfType < ExposedParameterFieldView > ( ) ;
595
- if ( exposedParameterFieldViews . Any ( ) )
610
+ // External objects drag and drop
611
+ if ( DragAndDrop . objectReferences . Length > 0 )
596
612
{
597
- foreach ( var paramFieldView in exposedParameterFieldViews )
613
+ RegisterCompleteObjectUndo ( "Create Node From Object(s)" ) ;
614
+ foreach ( var obj in DragAndDrop . objectReferences )
598
615
{
599
- RegisterCompleteObjectUndo ( "Create Parameter Node" ) ;
600
- var paramNode = BaseNode . CreateFromType < ParameterNode > ( mousePos ) ;
601
- paramNode . parameterGUID = paramFieldView . parameter . guid ;
602
- AddNode ( paramNode ) ;
616
+ var objectType = obj . GetType ( ) ;
617
+
618
+ foreach ( var kp in nodeTypePerCreateAssetType )
619
+ {
620
+ if ( kp . Key . IsAssignableFrom ( objectType ) )
621
+ {
622
+ var node = BaseNode . CreateFromType ( kp . Value , mousePos ) ;
623
+ var initializeFunction = kp . Value . GetMethod ( nameof ( ICreateNodeFrom < Object > . InitializeNodeFromObject ) , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
624
+ if ( ( bool ) initializeFunction . Invoke ( node , new [ ] { obj } ) )
625
+ {
626
+ AddNode ( node ) ;
627
+ }
628
+ else
629
+ break ;
630
+ }
631
+ }
603
632
}
604
633
}
605
634
}
606
635
607
636
void DragUpdatedCallback ( DragUpdatedEvent e )
608
637
{
609
638
var dragData = DragAndDrop . GetGenericData ( "DragSelection" ) as List < ISelectable > ;
639
+ var dragObjects = DragAndDrop . objectReferences ;
610
640
bool dragging = false ;
611
641
612
642
if ( dragData != null )
@@ -618,10 +648,11 @@ void DragUpdatedCallback(DragUpdatedEvent e)
618
648
}
619
649
}
620
650
651
+ if ( dragObjects . Length > 0 )
652
+ dragging = true ;
653
+
621
654
if ( dragging )
622
- {
623
655
DragAndDrop . visualMode = DragAndDropVisualMode . Generic ;
624
- }
625
656
626
657
UpdateNodeInspectorSelection ( ) ;
627
658
}
@@ -717,6 +748,20 @@ public void Initialize(BaseGraph graph)
717
748
InitializeView ( ) ;
718
749
719
750
NodeProvider . LoadGraph ( graph ) ;
751
+
752
+ // Register the nodes that can be created from assets
753
+ foreach ( var nodeInfo in NodeProvider . GetNodeMenuEntries ( graph ) )
754
+ {
755
+ var interfaces = nodeInfo . type . GetInterfaces ( ) ;
756
+ foreach ( var i in interfaces )
757
+ {
758
+ if ( i . IsGenericType && i . GetGenericTypeDefinition ( ) == typeof ( ICreateNodeFrom < > ) )
759
+ {
760
+ var genericArgument = i . GetGenericArguments ( ) [ 0 ] ;
761
+ nodeTypePerCreateAssetType [ genericArgument ] = nodeInfo . type ;
762
+ }
763
+ }
764
+ }
720
765
}
721
766
722
767
public void ClearGraphElements ( )
@@ -888,6 +933,13 @@ public BaseNodeView AddNodeView(BaseNode node)
888
933
return baseNodeView ;
889
934
}
890
935
936
+ public void RemoveNode ( BaseNode node )
937
+ {
938
+ var view = nodeViewsPerNode [ node ] ;
939
+ RemoveNodeView ( view ) ;
940
+ graph . RemoveNode ( node ) ;
941
+ }
942
+
891
943
public void RemoveNodeView ( BaseNodeView nodeView )
892
944
{
893
945
RemoveElement ( nodeView ) ;
0 commit comments