using System;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.Collections.Generic;
|
|
|
|
namespace AmplifyShaderEditor
|
|
{
|
|
[Serializable] public class UsageListSamplerNodes : NodeUsageRegister<SamplerNode> { }
|
|
[Serializable] public class UsageListFloatIntNodes : NodeUsageRegister<PropertyNode> { }
|
|
[Serializable] public class UsageListTexturePropertyNodes : NodeUsageRegister<TexturePropertyNode> { }
|
|
[Serializable] public class UsageListTextureArrayNodes : NodeUsageRegister<TextureArrayNode> { }
|
|
[Serializable] public class UsageListPropertyNodes : NodeUsageRegister<PropertyNode> { }
|
|
[Serializable] public class UsageListScreenColorNodes : NodeUsageRegister<ScreenColorNode> { }
|
|
[Serializable] public class UsageListRegisterLocalVarNodes : NodeUsageRegister<RegisterLocalVarNode> { }
|
|
[Serializable] public class UsageListFunctionInputNodes : NodeUsageRegister<FunctionInput> { }
|
|
[Serializable] public class UsageListFunctionNodes : NodeUsageRegister<FunctionNode> { }
|
|
[Serializable] public class UsageListFunctionOutputNodes : NodeUsageRegister<FunctionOutput> { }
|
|
[Serializable] public class UsageListFunctionSwitchNodes : NodeUsageRegister<FunctionSwitch> { }
|
|
[Serializable] public class UsageListFunctionSwitchCopyNodes : NodeUsageRegister<FunctionSwitch> { }
|
|
[Serializable] public class UsageListTemplateMultiPassMasterNodes : NodeUsageRegister<TemplateMultiPassMasterNode> { }
|
|
[Serializable] public class UsageListCustomExpressionsOnFunctionMode : NodeUsageRegister<CustomExpressionNode> { }
|
|
[Serializable] public class UsageListGlobalArrayNodes : NodeUsageRegister<GlobalArrayNode> { }
|
|
[Serializable] public class UsageListStaticSwitchNodes : NodeUsageRegister<StaticSwitch> { }
|
|
|
|
[Serializable]
|
|
public class NodeUsageRegister<T> where T : ParentNode
|
|
{
|
|
public delegate void ReorderEvent();
|
|
public event ReorderEvent OnReorderEventComplete;
|
|
|
|
[SerializeField]
|
|
public bool ReorderOnChange = false;
|
|
|
|
// Sampler Nodes registry
|
|
[SerializeField]
|
|
private List<T> m_nodes;
|
|
|
|
[SerializeField]
|
|
private string[] m_nodesArr;
|
|
|
|
[SerializeField]
|
|
private int[] m_nodeIDs;
|
|
|
|
[SerializeField]
|
|
ParentGraph m_containerGraph;
|
|
|
|
public NodeUsageRegister()
|
|
{
|
|
m_nodesArr = new string[ 0 ];
|
|
m_nodeIDs = new int[ 0 ];
|
|
m_nodes = new List<T>();
|
|
}
|
|
|
|
public void Destroy()
|
|
{
|
|
m_nodes.Clear();
|
|
m_nodes = null;
|
|
m_nodesArr = null;
|
|
m_nodeIDs = null;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
m_nodes.Clear();
|
|
}
|
|
|
|
public int AddNode( T node )
|
|
{
|
|
if( node == null )
|
|
return -1;
|
|
|
|
if( !m_nodes.Contains( node ) )
|
|
{
|
|
if( m_containerGraph != null )
|
|
{
|
|
Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoRegisterNodeId );
|
|
Undo.RegisterCompleteObjectUndo( m_containerGraph, Constants.UndoRegisterNodeId );
|
|
}
|
|
m_nodes.Add( node );
|
|
ReorderNodes();
|
|
UpdateNodeArr();
|
|
return m_nodes.Count - 1;
|
|
}
|
|
else if( node.UniqueId > -1 )
|
|
{
|
|
UpdateNodeArr();
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public bool HasNode( int uniqueId )
|
|
{
|
|
return m_nodes.FindIndex( x => x.UniqueId == uniqueId ) > -1 ? true : false;
|
|
}
|
|
|
|
public void RemoveNode( T node )
|
|
{
|
|
if( node == null )
|
|
return;
|
|
|
|
if( m_nodes.Contains( node ) )
|
|
{
|
|
if( m_containerGraph != null )
|
|
{
|
|
Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoUnregisterNodeId );
|
|
Undo.RegisterCompleteObjectUndo( m_containerGraph, Constants.UndoUnregisterNodeId );
|
|
}
|
|
|
|
m_nodes.Remove( node );
|
|
ReorderNodes();
|
|
UpdateNodeArr();
|
|
}
|
|
}
|
|
|
|
public void ReorderNodes()
|
|
{
|
|
if( ReorderOnChange )
|
|
{
|
|
m_nodes.Sort( ( x, y ) => ( x.DataToArray.CompareTo( y.DataToArray ) ) );
|
|
if( OnReorderEventComplete != null )
|
|
{
|
|
OnReorderEventComplete();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void UpdateNodeArr()
|
|
{
|
|
int nodeCount = m_nodes.Count;
|
|
if( nodeCount != m_nodesArr.Length )
|
|
{
|
|
m_nodesArr = new string[ nodeCount ];
|
|
m_nodeIDs = new int[ nodeCount ];
|
|
}
|
|
|
|
for( int i = 0; i < nodeCount; i++ )
|
|
{
|
|
m_nodesArr[ i ] = m_nodes[ i ].DataToArray;
|
|
m_nodeIDs[ i ] = m_nodes[ i ].UniqueId;
|
|
}
|
|
}
|
|
|
|
public T GetNode( int idx )
|
|
{
|
|
if( idx > -1 && idx < m_nodes.Count )
|
|
{
|
|
return m_nodes[ idx ];
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public T GetNodeByUniqueId( int uniqueId )
|
|
{
|
|
return m_nodes.Find( x => x.UniqueId == uniqueId );
|
|
}
|
|
|
|
public T GetNodeByDataToArray( string data )
|
|
{
|
|
return m_nodes.Find( x => x.DataToArray.Equals( data ));
|
|
}
|
|
|
|
public int GetNodeRegisterIdx( int uniqueId )
|
|
{
|
|
return m_nodes.FindIndex( x => x.UniqueId == uniqueId );
|
|
}
|
|
|
|
public void UpdateDataOnNode( int uniqueId, string data )
|
|
{
|
|
if( ReorderOnChange )
|
|
{
|
|
ReorderNodes();
|
|
UpdateNodeArr();
|
|
}
|
|
else
|
|
{
|
|
int index = m_nodes.FindIndex( x => x.UniqueId == uniqueId );
|
|
if( index > -1 )
|
|
{
|
|
m_nodesArr[ index ] = data;
|
|
m_nodeIDs[ index ] = uniqueId;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void Dump()
|
|
{
|
|
string data = string.Empty;
|
|
|
|
for( int i = 0; i < m_nodesArr.Length; i++ )
|
|
{
|
|
data += m_nodesArr[ i ] + " " + m_nodeIDs[ i ] + '\n';
|
|
}
|
|
Debug.Log( data );
|
|
}
|
|
|
|
public string[] NodesArr { get { return m_nodesArr; } }
|
|
public int[] NodeIds { get { return m_nodeIDs; } }
|
|
public List<T> NodesList { get { return m_nodes; } }
|
|
public int Count { get { return m_nodes.Count; } }
|
|
public ParentGraph ContainerGraph { get { return m_containerGraph; } set { m_containerGraph = value; } }
|
|
}
|
|
}
|