// Amplify Shader Editor - Visual Shader Editing Tool
|
|
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
|
|
using System;
|
|
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
|
|
namespace AmplifyShaderEditor
|
|
{
|
|
|
|
public class ClipboardData
|
|
{
|
|
public string Data = string.Empty;
|
|
public string Connections = string.Empty;
|
|
public int OldNodeId = -1;
|
|
public int NewNodeId = -1;
|
|
|
|
public ClipboardData( string data, string connections, int oldNodeId )
|
|
{
|
|
Data = data;
|
|
Connections = connections;
|
|
OldNodeId = oldNodeId;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return Data + IOUtils.CLIPBOARD_DATA_SEPARATOR + Connections + IOUtils.CLIPBOARD_DATA_SEPARATOR + OldNodeId + IOUtils.CLIPBOARD_DATA_SEPARATOR + NewNodeId;
|
|
}
|
|
}
|
|
|
|
public class Clipboard
|
|
{
|
|
public const string ClipboardId = "AMPLIFY_CLIPBOARD_ID";
|
|
private readonly string[] ClipboardTagId = { "#CLIP_ITEM#" };
|
|
private List<ClipboardData> m_clipboardStrData;
|
|
private Dictionary<int, ClipboardData> m_clipboardAuxData;
|
|
private Dictionary<string, ClipboardData> m_multiPassMasterNodeData;
|
|
|
|
public Clipboard()
|
|
{
|
|
m_clipboardStrData = new List<ClipboardData>();
|
|
m_clipboardAuxData = new Dictionary<int, ClipboardData>();
|
|
m_multiPassMasterNodeData = new Dictionary<string, ClipboardData>();
|
|
}
|
|
|
|
public void AddMultiPassNodesToClipboard( List<TemplateMultiPassMasterNode> masterNodes )
|
|
{
|
|
m_multiPassMasterNodeData.Clear();
|
|
int templatesAmount = masterNodes.Count;
|
|
for( int i = 0; i < templatesAmount; i++ )
|
|
{
|
|
if( !masterNodes[ i ].InvalidNode )
|
|
{
|
|
string data = string.Empty;
|
|
string connection = string.Empty;
|
|
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
|
|
masterNodes[ i ].FullWriteToString( ref data, ref connection );
|
|
System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
|
|
ClipboardData clipboardData = new ClipboardData( data, connection, masterNodes[ i ].UniqueId );
|
|
m_multiPassMasterNodeData.Add( masterNodes[ i ].PassUniqueName, clipboardData );
|
|
}
|
|
}
|
|
}
|
|
|
|
public void GetMultiPassNodesFromClipboard( List<TemplateMultiPassMasterNode> masterNodes )
|
|
{
|
|
int templatesAmount = masterNodes.Count;
|
|
for( int i = 0; i < templatesAmount; i++ )
|
|
{
|
|
if( m_multiPassMasterNodeData.ContainsKey( masterNodes[ i ].PassUniqueName ) )
|
|
{
|
|
ClipboardData nodeData = m_multiPassMasterNodeData[ masterNodes[ i ].PassUniqueName ];
|
|
string[] nodeParams = nodeData.Data.Split( IOUtils.FIELD_SEPARATOR );
|
|
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
|
|
masterNodes[ i ].FullReadFromString( ref nodeParams );
|
|
System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
|
|
}
|
|
}
|
|
|
|
for( int i = 0; i < templatesAmount; i++ )
|
|
{
|
|
if( m_multiPassMasterNodeData.ContainsKey( masterNodes[ i ].PassUniqueName ) )
|
|
{
|
|
masterNodes[ i ].SetReadOptions();
|
|
masterNodes[ i ].ForceOptionsRefresh();
|
|
}
|
|
}
|
|
|
|
m_multiPassMasterNodeData.Clear();
|
|
}
|
|
|
|
public void AddToClipboard( List<ParentNode> selectedNodes , Vector3 initialPosition, ParentGraph graph )
|
|
{
|
|
//m_clipboardStrData.Clear();
|
|
//m_clipboardAuxData.Clear();
|
|
|
|
string clipboardData = IOUtils.Vector3ToString( initialPosition ) + ClipboardTagId[ 0 ];
|
|
int masterNodeId = UIUtils.CurrentWindow.CurrentGraph.CurrentMasterNodeId;
|
|
int count = selectedNodes.Count;
|
|
for ( int i = 0; i < count; i++ )
|
|
{
|
|
if ( UIUtils.CurrentWindow.IsShaderFunctionWindow || !graph.IsMasterNode( selectedNodes[ i ] ))
|
|
{
|
|
string nodeData = string.Empty;
|
|
string connections = string.Empty;
|
|
selectedNodes[ i ].ClipboardFullWriteToString( ref nodeData, ref connections );
|
|
clipboardData += nodeData;
|
|
if ( !string.IsNullOrEmpty( connections ) )
|
|
{
|
|
connections = connections.Substring( 0, connections.Length - 1 );
|
|
clipboardData += "\n" + connections;
|
|
}
|
|
if ( i < count - 1 )
|
|
clipboardData += ClipboardTagId[ 0 ];
|
|
|
|
//ClipboardData data = new ClipboardData( nodeData, connections, selectedNodes[ i ].UniqueId );
|
|
//m_clipboardStrData.Add( data );
|
|
//m_clipboardAuxData.Add( selectedNodes[ i ].UniqueId, data );
|
|
}
|
|
}
|
|
|
|
if ( !string.IsNullOrEmpty( clipboardData ) )
|
|
{
|
|
EditorPrefs.SetString( ClipboardId, clipboardData );
|
|
}
|
|
//for ( int i = 0; i < selectedNodes.Count; i++ )
|
|
//{
|
|
// if ( selectedNodes[ i ].UniqueId != masterNodeId )
|
|
// {
|
|
// WireNode wireNode = selectedNodes[ i ] as WireNode;
|
|
// if ( wireNode != null )
|
|
// {
|
|
// if ( !IsNodeChainValid( selectedNodes[ i ], true ) || !IsNodeChainValid( selectedNodes[ i ], false ) )
|
|
// {
|
|
// UnityEngine.Debug.Log( "found invalid wire port" );
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
}
|
|
|
|
public Vector3 GetDataFromEditorPrefs()
|
|
{
|
|
Vector3 initialPos = Vector3.zero;
|
|
m_clipboardStrData.Clear();
|
|
m_clipboardAuxData.Clear();
|
|
string clipboardData = EditorPrefs.GetString( ClipboardId, string.Empty );
|
|
if ( !string.IsNullOrEmpty( clipboardData ) )
|
|
{
|
|
string[] clipboardDataArray = clipboardData.Split( ClipboardTagId, StringSplitOptions.None );
|
|
initialPos = IOUtils.StringToVector3( clipboardDataArray[0] );
|
|
for ( int i = 1; i < clipboardDataArray.Length; i++ )
|
|
{
|
|
if ( !string.IsNullOrEmpty( clipboardDataArray[ i ] ) )
|
|
{
|
|
int wiresIndex = clipboardDataArray[ i ].IndexOf( IOUtils.LINE_TERMINATOR );
|
|
string nodeData = string.Empty;
|
|
string connections = string.Empty;
|
|
if ( wiresIndex < 0 )
|
|
{
|
|
nodeData = clipboardDataArray[ i ];
|
|
}
|
|
else
|
|
{
|
|
nodeData = clipboardDataArray[ i ].Substring( 0, wiresIndex );
|
|
connections = clipboardDataArray[ i ].Substring( wiresIndex + 1 );
|
|
}
|
|
string[] nodeDataArr = nodeData.Split( IOUtils.FIELD_SEPARATOR );
|
|
if ( nodeDataArr.Length > 2 )
|
|
{
|
|
int nodeId = Convert.ToInt32( nodeDataArr[ 2 ] );
|
|
ClipboardData data = new ClipboardData( nodeData, connections, nodeId );
|
|
m_clipboardStrData.Add( data );
|
|
m_clipboardAuxData.Add( nodeId, data );
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
return initialPos;
|
|
}
|
|
|
|
public bool IsNodeChainValid( ParentNode currentNode, bool forward )
|
|
{
|
|
WireNode wireNode = currentNode as WireNode;
|
|
if ( wireNode == null )
|
|
{
|
|
return m_clipboardAuxData.ContainsKey( currentNode.UniqueId );
|
|
}
|
|
|
|
if ( forward )
|
|
{
|
|
if ( wireNode.InputPorts[ 0 ].ExternalReferences.Count > 0 )
|
|
{
|
|
int nodeId = wireNode.InputPorts[ 0 ].ExternalReferences[ 0 ].NodeId;
|
|
if ( m_clipboardAuxData.ContainsKey( nodeId ) )
|
|
{
|
|
return IsNodeChainValid( UIUtils.GetNode( nodeId ), forward );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int nodeId = wireNode.OutputPorts[ 0 ].ExternalReferences[ 0 ].NodeId;
|
|
if ( m_clipboardAuxData.ContainsKey( nodeId ) )
|
|
{
|
|
return IsNodeChainValid( UIUtils.GetNode( nodeId ), forward );
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void GenerateFullString()
|
|
{
|
|
string data = string.Empty;
|
|
for ( int i = 0; i < m_clipboardStrData.Count; i++ )
|
|
{
|
|
data += m_clipboardStrData[ i ].ToString();
|
|
if ( i < m_clipboardStrData.Count - 1 )
|
|
{
|
|
data += IOUtils.LINE_TERMINATOR;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void ClearClipboard()
|
|
{
|
|
m_clipboardStrData.Clear();
|
|
m_clipboardAuxData.Clear();
|
|
m_multiPassMasterNodeData.Clear();
|
|
}
|
|
|
|
public ClipboardData GetClipboardData( int oldNodeId )
|
|
{
|
|
if ( m_clipboardAuxData.ContainsKey( oldNodeId ) )
|
|
return m_clipboardAuxData[ oldNodeId ];
|
|
return null;
|
|
}
|
|
|
|
public int GeNewNodeId( int oldNodeId )
|
|
{
|
|
if ( m_clipboardAuxData.ContainsKey( oldNodeId ) )
|
|
return m_clipboardAuxData[ oldNodeId ].NewNodeId;
|
|
return -1;
|
|
}
|
|
|
|
public List<ClipboardData> CurrentClipboardStrData
|
|
{
|
|
get { return m_clipboardStrData; }
|
|
}
|
|
|
|
public bool HasCachedMasterNodes { get { return m_multiPassMasterNodeData.Count > 0; } }
|
|
}
|
|
}
|