|
|
- // 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( m_outputData[ outputId ].inputData[ i ].name + " invalid on the inputs list", MessageSeverity.Error );
- return string.Empty;
- }
- }
- else
- {
- UIUtils.ShowMessage( 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;
- }
- }
-
- }
- }
|