diff options
author | chai <chaifix@163.com> | 2020-10-23 13:08:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-10-23 13:08:43 +0800 |
commit | b82da95b5181ac8bbae38efb13e950d5e88a4caa (patch) | |
tree | 48a6f3269276484bbc7cfc95f0651f40a2176aa1 /Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs | |
parent | 917e9e0b320775634dc2e710f7deac74fd0822f0 (diff) |
*移动amplify shader editor到third party目录
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs new file mode 100644 index 00000000..bffd2b4f --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs @@ -0,0 +1,183 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class CustomNodeOutputData + { + public string expression; + public string name; + public List<CustomNodeInputData> inputData; + + public CustomNodeOutputData( string newName, string newExpression ) + { + name = newName; + expression = newExpression; + inputData = new List<CustomNodeInputData>(); + } + public void Destroy() + { + inputData.Clear(); + inputData = null; + } + + public override string ToString() + { + string result = "name: " + name + " outputExpression: " + expression + '\n'; + for ( int i = 0; i < inputData.Count; i++ ) + { + result += inputData[ i ].ToString() + '\n'; + } + return result; + } + } + + [Serializable] + public class CustomNodeInputData + { + public int index; + public int length; + public string name; + public CustomNodeInputData( int newIndex, int newLength, string newName ) + { + index = newIndex; + length = newLength; + name = newName; + + } + + public override string ToString() + { + return "index: " + index + " length: " + length + " name: " + name; + } + } + + [Serializable] + public class CustomNode : ParentNode + { + [SerializeField] + private List<string> m_includes; + + [SerializeField] + private List<CustomNodeOutputData> m_outputData; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_outputData = new List<CustomNodeOutputData>(); + } + + public void AddIncludes( string newInclude ) + { + m_includes.Add( newInclude ); + } + + protected void AddOutputsFromString( string outputName, string output ) + { + AddOutputPort( WirePortDataType.OBJECT, outputName ); + + CustomNodeOutputData currOutputData = new CustomNodeOutputData( outputName, output ); + + + // Get existing input nodes so we can test for duplicates + Dictionary<string, InputPort> existingPorts = InputPortsDict; + + // Create dictionary to prevent duplicates when dealing with expresssions with multiple occurences of an input + Dictionary<string, string> inputDuplicatePrevention = new Dictionary<string, string>(); + + + // Get all inputs on the expression and save their info + int[] indexes = output.AllIndexesOf( Constants.CNIP ); + for ( int i = 0; i < indexes.Length; i++ ) + { + string name = output.Substring( indexes[ i ], Constants.CNIP.Length + 1 ); + currOutputData.inputData.Add( new CustomNodeInputData( indexes[ i ], Constants.CNIP.Length + 1, name ) ); + + if ( !inputDuplicatePrevention.ContainsKey( name ) && !existingPorts.ContainsKey( name ) ) + { + inputDuplicatePrevention.Add( name, name ); + AddInputPort( WirePortDataType.OBJECT, false, name ); + } + } + + inputDuplicatePrevention.Clear(); + inputDuplicatePrevention = null; + + existingPorts.Clear(); + existingPorts = null; + + m_outputData.Add( currOutputData ); + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + if ( outputId < m_outputData.Count ) + { + Dictionary<string, InputPort> inputs = InputPortsDict; + + string value = m_outputData[ outputId ].expression; + for ( int i = 0; i < m_outputData[ outputId ].inputData.Count; i++ ) + { + if ( inputs.ContainsKey( m_outputData[ outputId ].inputData[ i ].name ) ) + { + InputPort inputPort = inputs[ m_outputData[ outputId ].inputData[ i ].name ]; + if ( inputPort != null ) + { + string inputValue = inputPort.GenerateShaderForOutput( ref dataCollector, WirePortDataType.OBJECT, ignoreLocalvar ); + value = value.Replace( m_outputData[ outputId ].inputData[ i ].name, inputValue ); + } + else + { + UIUtils.ShowMessage( UniqueId, m_outputData[ outputId ].inputData[ i ].name + " invalid on the inputs list", MessageSeverity.Error ); + return string.Empty; + } + } + else + { + UIUtils.ShowMessage( UniqueId, m_outputData[ outputId ].inputData[ i ].name + " Not found on the inputs list", MessageSeverity.Error ); + return string.Empty; + } + } + return value; + + } + + return string.Empty; + } + public void DumpOutputData() + { + for ( int i = 0; i < m_outputData.Count; i++ ) + { + Debug.Log( m_outputData[ i ] ); + } + } + + public override void Destroy() + { + base.Destroy(); + + if ( m_outputData != null ) + { + for ( int i = 0; i < m_outputData.Count; i++ ) + { + m_outputData[ i ].Destroy(); + } + m_outputData.Clear(); + m_outputData = null; + } + if ( m_includes != null ) + { + m_includes.Clear(); + m_includes = null; + } + } + + } +} |