diff options
Diffstat (limited to 'Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs')
-rw-r--r-- | Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs new file mode 100644 index 00000000..e8aeadf8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs @@ -0,0 +1,328 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public class InputSwitchMPHelper + { + public int SubShaderIdx; + public int PassIdx; + public InputSwitchMPHelper( int subShaderIdx, int passIdx ) + { + SubShaderIdx = subShaderIdx; + PassIdx = passIdx; + } + } + + [Serializable] + [NodeAttributes( "Template Multi-Pass Switch", "Logical Operators", "Relays, in compile time, the correct input port according to current analyzed sub-shader/pass." )] + public sealed class TemplateMultiPassSwitchNode : TemplateNodeParent + { + private const string InputLabelStr = "SubShader {0} Pass {1}"; + + [SerializeField] + private List<InputSwitchMPHelper> m_inputHelper = new List<InputSwitchMPHelper>(); + + [SerializeField] + private int m_inputCountHelper = -1; + + protected override void CommonInit( int uniqueId ) + { + m_createAllOutputs = false; + base.CommonInit( uniqueId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnections(); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnections(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnections(); + } + + private void UpdateConnections() + { + WirePortDataType mainType = WirePortDataType.FLOAT; + + int highest = UIUtils.GetPriority( mainType ); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + WirePortDataType portType = m_inputPorts[ i ].GetOutputConnection().DataType; + if( UIUtils.GetPriority( portType ) > highest ) + { + mainType = portType; + highest = UIUtils.GetPriority( portType ); + } + } + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].ChangeType( mainType, false ); + } + + m_outputPorts[ 0 ].ChangeType( mainType, false ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_templateMPData == null ) + { + FetchMultiPassTemplate(); + if( m_inputPorts.Count != m_inputCountHelper ) + { + CreateInputPorts(); + } + else + { + RefreshInputPorts(); + } + } + } + + + public void RefreshInputPorts() + { + if( m_multiPassMode ) + { + m_inputHelper.Clear(); + if( m_templateMPData != null ) + { + int index = 0; + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[ passIdx ].HasValidFunctionBody ) + { + m_inputPorts[ index ].Name = string.Format( InputLabelStr, subShaderIdx, passIdx ); + m_inputHelper.Add( new InputSwitchMPHelper( subShaderIdx, passIdx ) ); + index += 1; + } + } + } + } + } + else + { + m_inputPorts[0].Name = "In"; + } + } + + public int RefreshInputCountHelper() + { + int inputCountHelper = 0; + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[passIdx].HasValidFunctionBody ) + inputCountHelper += 1; + } + } + } + } + else + { + inputCountHelper += 1; + } + return inputCountHelper; + } + + public void CreateInputPorts() + { + m_inputCountHelper = 0; + DeleteAllInputConnections( true ); + if( m_multiPassMode ) + { + m_inputHelper.Clear(); + if( m_templateMPData != null ) + { + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[ passIdx ].HasValidFunctionBody ) + { + AddInputPort( WirePortDataType.FLOAT, false, string.Format( InputLabelStr, subShaderIdx, passIdx ) ); + m_inputHelper.Add( new InputSwitchMPHelper( subShaderIdx, passIdx ) ); + m_inputCountHelper += 1; + } + } + } + } + } + else + { + AddInputPort( WirePortDataType.FLOAT, false, "In" ); + m_inputCountHelper += 1; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.MasterNodeCategory != AvailableShaderTypes.Template ) + { + UIUtils.ShowMessage( "Template Multi-Pass Switch Data node is only intended for templates use only" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + int currSubShaderIdx = dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx; + int currPassIdx = dataCollector.TemplateDataCollectorInstance.MultipassPassIdx; + + int inputHelperCount = m_inputHelper.Count; + for( int i = 0; i< inputHelperCount; i++ ) + { + if(m_inputHelper[i].SubShaderIdx == currSubShaderIdx && m_inputHelper[ i ].PassIdx == currPassIdx ) + return m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + } + + UIUtils.ShowMessage( "Invalid subshader or pass on Template Multi-Pass Switch Data" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + FetchMultiPassTemplate( newMasterNode ); + m_inputCountHelper = RefreshInputCountHelper(); + if( m_inputPorts.Count != m_inputCountHelper ) + { + CreateInputPorts(); + } + else + { + RefreshInputPorts(); + } + } + else + { + DeleteAllInputConnections( true ); + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_inputCountHelper = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + // Need to add ports here so read internal data is correct + for( int i = 0; i < m_inputCountHelper; i++ ) + { + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputCountHelper ); + } + + public override void Destroy() + { + base.Destroy(); + m_inputHelper.Clear(); + m_inputHelper = null; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + FetchMultiPassTemplate(); + + bool create = false; + if( m_inputCountHelper == -1 ) + { + create = true; + } + else + { + int newInputCount = RefreshInputCountHelper(); + if( newInputCount != m_inputCountHelper ) + { + create = true; + } + } + + + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + if( create ) + { + CreateInputPorts(); + } + else + { + m_inputHelper.Clear(); + int index = 0; + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[ passIdx ].HasValidFunctionBody ) + { + m_inputPorts[ index ].Name = string.Format( InputLabelStr, subShaderIdx, passIdx ); + m_inputHelper.Add( new InputSwitchMPHelper( subShaderIdx, passIdx )); + index += 1; + } + } + } + + if( index != m_inputCountHelper ) + { + Debug.LogWarning( "Something wrong occured in reading MultiPass Switch node" ); + } + } + } + } + else + { + if( create ) + { + AddInputPort( WirePortDataType.FLOAT, false, "In" ); + } + else + { + m_inputPorts[ 0 ].Name = "In"; + } + } + } + } +} |