HDEmissionNode.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using System;
  4. using UnityEditor;
  5. namespace AmplifyShaderEditor
  6. {
  7. using UnityEngine;
  8. [Serializable]
  9. [NodeAttributes( "HD Emission", "Miscellaneous", "Get emission HDR Color. Only available on HDRP." )]
  10. public sealed class HDEmissionNode : ParentNode
  11. {
  12. public enum HDEmissionIntensityUnit
  13. {
  14. Luminance,
  15. EV100
  16. };
  17. public readonly string[] EmissionFunctionWithNormalize =
  18. {
  19. "float3 ASEGetEmissionHDRColorNormalize(float3 ldrColor, float luminanceIntensity, float exposureWeight, float inverseCurrentExposureMultiplier)\n",
  20. "{\n",
  21. "\tldrColor = ldrColor * rcp(max(Luminance(ldrColor), 1e-6));\n",
  22. "\tfloat3 hdrColor = ldrColor * luminanceIntensity;\n",
  23. "\thdrColor = lerp( hdrColor* inverseCurrentExposureMultiplier, hdrColor, exposureWeight);\n",
  24. "\treturn hdrColor;\n",
  25. "}\n",
  26. };
  27. public readonly string[] EmissionFunction =
  28. {
  29. "float3 ASEGetEmissionHDRColor(float3 ldrColor, float luminanceIntensity, float exposureWeight, float inverseCurrentExposureMultiplier)\n",
  30. "{\n",
  31. "\tfloat3 hdrColor = ldrColor * luminanceIntensity;\n",
  32. "\thdrColor = lerp( hdrColor* inverseCurrentExposureMultiplier, hdrColor, exposureWeight);\n",
  33. "\treturn hdrColor;\n",
  34. "}\n",
  35. };
  36. public const string CommonLightingLib = "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonLighting.hlsl";
  37. public const string EmissionHeaderLuminance = "ASEGetEmissionHDRColor{0}({1},{2},{3},GetInverseCurrentExposureMultiplier())";
  38. public const string EmissionHeaderEV100 = "ASEGetEmissionHDRColor{0}({1},ConvertEvToLuminance({2}),{3},GetInverseCurrentExposureMultiplier())";
  39. public const string IntensityUnityLabel = "Intensity Unit";
  40. public const string NormalizeColorLabel = "Normalize Color";
  41. public const string ErrorOnCompilationMsg = "Attempting to use HDRP specific node on incorrect SRP or Builtin RP.";
  42. public const string MinorVersionMsg = "This node require at least Unity 2019.1/HDRP v5 to properly work.";
  43. public const string NodeErrorMsg = "Only valid on HDRP";
  44. public const string MinorNodeErrorMsg = "Invalid Unity/HDRP version";
  45. [SerializeField]
  46. private HDEmissionIntensityUnit m_intensityUnit = HDEmissionIntensityUnit.Luminance;
  47. [SerializeField]
  48. private bool m_normalizeColor = false;
  49. protected override void CommonInit( int uniqueId )
  50. {
  51. base.CommonInit( uniqueId );
  52. AddInputPort( WirePortDataType.FLOAT3, false, "Color" );
  53. AddInputPort( WirePortDataType.FLOAT, false, "Intensity" );
  54. AddInputPort( WirePortDataType.FLOAT, false, "Exposition Weight" );
  55. AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue );
  56. m_errorMessageTooltip = NodeErrorMsg;
  57. m_errorMessageTypeIsError = NodeMessageType.Error;
  58. m_autoWrapProperties = true;
  59. }
  60. public override void DrawProperties()
  61. {
  62. base.DrawProperties();
  63. m_intensityUnit = (HDEmissionIntensityUnit)EditorGUILayoutEnumPopup( IntensityUnityLabel, m_intensityUnit );
  64. m_normalizeColor = EditorGUILayoutToggle( NormalizeColorLabel, m_normalizeColor );
  65. if( m_showErrorMessage )
  66. {
  67. EditorGUILayout.HelpBox( NodeErrorMsg , MessageType.Error );
  68. }
  69. }
  70. public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
  71. {
  72. if( !dataCollector.IsSRP || !dataCollector.TemplateDataCollectorInstance.IsHDRP )
  73. {
  74. UIUtils.ShowMessage( ErrorOnCompilationMsg , MessageSeverity.Error );
  75. return GenerateErrorValue();
  76. }
  77. if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) )
  78. return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory );
  79. #if UNITY_2020_3_OR_NEWER
  80. dataCollector.AddToIncludes( UniqueId , CommonLightingLib );
  81. #endif
  82. string colorValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
  83. string intensityValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector );
  84. string expositionWeightValue = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector );
  85. string functionPrefix = string.Empty;
  86. if( m_normalizeColor )
  87. {
  88. functionPrefix = "Normalize";
  89. dataCollector.AddFunction( EmissionFunctionWithNormalize[ 0 ], EmissionFunctionWithNormalize , false);
  90. }
  91. else
  92. {
  93. dataCollector.AddFunction( EmissionFunction[ 0 ], EmissionFunction, false );
  94. }
  95. string varName = "hdEmission" + OutputId;
  96. string varValue = string.Empty;
  97. switch( m_intensityUnit )
  98. {
  99. default:
  100. case HDEmissionIntensityUnit.Luminance:
  101. varValue = string.Format( EmissionHeaderLuminance, functionPrefix, colorValue, intensityValue, expositionWeightValue );
  102. break;
  103. case HDEmissionIntensityUnit.EV100:
  104. varValue = string.Format( EmissionHeaderEV100, functionPrefix, colorValue, intensityValue, expositionWeightValue );
  105. break;
  106. }
  107. dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, varName, varValue );
  108. m_outputPorts[ 0 ].SetLocalValue( varName, dataCollector.PortCategory );
  109. return varName;
  110. }
  111. public override void OnNodeLogicUpdate( DrawInfo drawInfo )
  112. {
  113. base.OnNodeLogicUpdate( drawInfo );
  114. m_showErrorMessage = ( ContainerGraph.CurrentCanvasMode == NodeAvailability.SurfaceShader ) ||
  115. ( ContainerGraph.CurrentCanvasMode == NodeAvailability.TemplateShader && ContainerGraph.CurrentSRPType != TemplateSRPType.HDRP );
  116. }
  117. public override void ReadFromString( ref string[] nodeParams )
  118. {
  119. base.ReadFromString( ref nodeParams );
  120. Enum.TryParse<HDEmissionIntensityUnit>( GetCurrentParam( ref nodeParams ), out m_intensityUnit );
  121. m_normalizeColor = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
  122. }
  123. public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
  124. {
  125. base.WriteToString( ref nodeInfo, ref connectionsInfo );
  126. IOUtils.AddFieldValueToString( ref nodeInfo, m_intensityUnit );
  127. IOUtils.AddFieldValueToString( ref nodeInfo, m_normalizeColor );
  128. }
  129. }
  130. }
  131. //#endif