Assignment for RMIT Mixed Reality in 2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

203 lines
5.3 KiB

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; } }
}
}