// Amplify Shader Editor - Visual Shader Editing Tool // Copyright (c) Amplify Creations, Lda using System; namespace AmplifyShaderEditor { [NodeAttributes( "Unpack Scale Normal", "Textures", "Applies UnpackNormal/UnpackScaleNormal function" )] [Serializable] public class UnpackScaleNormalNode : ParentNode { protected override void CommonInit( int uniqueId ) { base.CommonInit( uniqueId ); AddInputPort( WirePortDataType.FLOAT4, false, "Value" ); AddInputPort( WirePortDataType.FLOAT, false, "Scale" ); m_inputPorts[ 1 ].FloatInternalData = 1; AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); m_useInternalPortData = true; m_previewShaderGUID = "8b0ae05e25d280c45af81ded56f8012e"; } public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) { string src = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); bool isScaledNormal = false; if ( m_inputPorts[ 1 ].IsConnected ) { isScaledNormal = true; } else { if ( m_inputPorts[ 1 ].FloatInternalData != 1 ) { isScaledNormal = true; } } string normalMapUnpackMode = string.Empty; string scaleValue = isScaledNormal?m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ):"1.0"; normalMapUnpackMode = string.Format( TemplateHelperFunctions.CreateUnpackNormalStr( dataCollector, isScaledNormal, scaleValue ), src); if( isScaledNormal && !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) { dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); } int outputUsage = 0; for ( int i = 0; i < m_outputPorts.Count; i++ ) { if ( m_outputPorts[ i ].IsConnected ) outputUsage += 1; } if ( outputUsage > 1 ) { string varName = "localUnpackNormal" + UniqueId; dataCollector.AddLocalVariable( UniqueId, "float3 " + varName + " = " + normalMapUnpackMode + ";" ); return GetOutputVectorItem( 0, outputId, varName ); } else { return GetOutputVectorItem( 0, outputId, normalMapUnpackMode ); } } } }