AbstractMaterialGraph m_Graph ;
GraphView m_GraphView ;
Texture2D m_Icon ;
public Port connectedPort { get ; set ; }
public void Initialize ( EditorWindow editorWindow , AbstractMaterialGraph graph , GraphView graphView )
{
}
}
struct NestedEntry
struct NodeEntry
public object userData ;
public AbstractMaterialNode node ;
public int compatibleSlotId ;
List < ISlot > m_Slots = new List < ISlot > ( ) ;
var nestedEntries = new List < NestedEntry > ( ) ;
var nodeEntries = new List < NodeEntry > ( ) ;
foreach ( var type in Assembly . GetAssembly ( typeof ( AbstractMaterialNode ) ) . GetTypes ( ) )
{
if ( type . IsClass & & ! type . IsAbstract & & ( type . IsSubclassOf ( typeof ( AbstractMaterialNode ) ) ) )
nestedEntries . Add ( new NestedEntry { title = attrs [ 0 ] . title , userData = type } ) ;
{
var node = ( AbstractMaterialNode ) Activator . CreateInstance ( type ) ;
var compatibleSlotId = - 1 ;
if ( connectedPort ! = null )
{
compatibleSlotId = GetFirstCompatibleSlotId ( node ) ;
if ( compatibleSlotId = = - 1 )
continue ;
}
nodeEntries . Add ( new NodeEntry { title = attrs [ 0 ] . title , node = node , compatibleSlotId = compatibleSlotId } ) ;
}
}
}
nestedEntries . Add ( new NestedEntry
var node = Activator . CreateInstance < SubGraphNode > ( ) ;
node . subGraphAsset = asset ;
var compatibleSlotId = - 1 ;
if ( connectedPort ! = null )
{
compatibleSlotId = GetFirstCompatibleSlotId ( node ) ;
if ( compatibleSlotId = = - 1 )
continue ;
}
nodeEntries . Add ( new NodeEntry
userData = asset
node = node ,
compatibleSlotId = compatibleSlotId
} ) ;
}
// - Art/Adjustments/ColorBalance
// - Art/Adjustments/Contrast
nested Entries . Sort ( ( entry1 , entry2 ) = >
node Entries . Sort ( ( entry1 , entry2 ) = >
{
for ( var i = 0 ; i < entry1 . title . Length ; i + + )
{
new SearchTreeGroupEntry ( new GUIContent ( "Create Node" ) , 0 ) ,
} ;
foreach ( var nestedEntry in nested Entries )
foreach ( var nodeEntry in node Entries )
for ( var i = 0 ; i < nested Entry . title . Length - 1 ; i + + )
for ( var i = 0 ; i < node Entry . title . Length - 1 ; i + + )
var group = nested Entry . title [ i ] ;
var group = node Entry . title [ i ] ;
if ( i > = groups . Count )
{
// The current group path matches a prefix of the current entry's group path, so we add the
// Create new group entries as needed.
// If we don't need to modify the group path, `createIndex` will be `int.MaxValue` and thus the loop won't run.
for ( var i = createIndex ; i < nestedEntry . title . Length - 1 ; i + + )
for ( var i = createIndex ; i < nodeEntry . title . Length - 1 ; i + + )
var group = nestedEntry . title [ i ] ;
var group = nodeEntry . title [ i ] ;
tree . Add ( new SearchTreeEntry ( new GUIContent ( nestedEntry . title . Last ( ) , m_Icon ) ) { level = nestedEntry . title . Length , userData = nestedEntry . userData } ) ;
tree . Add ( new SearchTreeEntry ( new GUIContent ( nodeEntry . title . Last ( ) , m_Icon ) ) { level = nodeEntry . title . Length , userData = nodeEntry } ) ;
int GetFirstCompatibleSlotId ( AbstractMaterialNode node )
{
var connectedSlot = ( MaterialSlot ) connectedPort . userData ;
m_Slots . Clear ( ) ;
node . GetSlots ( m_Slots ) ;
foreach ( var slot in m_Slots )
{
var materialSlot = ( MaterialSlot ) slot ;
if ( materialSlot . IsCompatibleWith ( connectedSlot ) )
{
return materialSlot . id ;
}
}
return - 1 ;
}
Type type ;
var asset = entry . userData as MaterialSubGraphAsset ;
if ( asset ! = null )
type = typeof ( SubGraphNode ) ;
else
type = ( Type ) entry . userData ;
var node = Activator . CreateInstance ( type ) as INode ;
if ( node = = null )
return false ;
var nodeEntry = ( NodeEntry ) entry . userData ;
var node = nodeEntry . node ;
var drawState = node . drawState ;
var windowMousePosition = context . screenMousePosition - m_EditorWindow . position . position ;
if ( asset ! = null )
m_Graph . owner . RegisterCompleteObjectUndo ( "Add " + node . name ) ;
m_Graph . AddNode ( node ) ;
if ( connectedPort ! = null )
var subgraphNode = ( SubGraphNode ) node ;
subgraphNode . subGraphAsset = asset ;
var connectedSlot = ( MaterialSlot ) connectedPort . userData ;
var connectedSlotReference = connectedSlot . owner . GetSlotReference ( connectedSlot . id ) ;
var compatibleSlotReference = node . GetSlotReference ( nodeEntry . compatibleSlotId ) ;
var fromReference = connectedSlot . isOutputSlot ? connectedSlotReference : compatibleSlotReference ;
var toReference = connectedSlot . isOutputSlot ? compatibleSlotReference : connectedSlotReference ;
m_Graph . Connect ( fromReference , toReference ) ;
m_Graph . owner . RegisterCompleteObjectUndo ( "Add " + node . name ) ;
m_Graph . AddNode ( node ) ;
return true ;
}