ViewDirInputsCoordNode.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using System;
  4. using UnityEngine;
  5. using UnityEditor;
  6. namespace AmplifyShaderEditor
  7. {
  8. public enum ViewSpace
  9. {
  10. Tangent,
  11. World,
  12. Object,
  13. View
  14. }
  15. [Serializable]
  16. [NodeAttributes( "View Dir", "Camera And Screen", "Normalized View Direction vector.", tags: "camera vector" )]
  17. public sealed class ViewDirInputsCoordNode : SurfaceShaderINParentNode
  18. {
  19. private const string SpaceStr = "Space";
  20. private const string NormalizeOptionStr = "Safe Normalize";
  21. [SerializeField]
  22. private bool m_safeNormalize = false;
  23. [SerializeField]
  24. private ViewSpace m_viewDirSpace = ViewSpace.World;
  25. private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper();
  26. protected override void CommonInit( int uniqueId )
  27. {
  28. base.CommonInit( uniqueId );
  29. m_currentInput = SurfaceInputs.VIEW_DIR;
  30. InitialSetup();
  31. m_textLabelWidth = 120;
  32. m_autoWrapProperties = true;
  33. m_drawPreviewAsSphere = true;
  34. m_hasLeftDropdown = true;
  35. UpdateTitle();
  36. m_previewShaderGUID = "07b57d9823df4bd4d8fe6dcb29fca36a";
  37. }
  38. private void UpdateTitle()
  39. {
  40. m_additionalContent.text = string.Format( Constants.SubTitleSpaceFormatStr, m_viewDirSpace.ToString() );
  41. m_sizeIsDirty = true;
  42. }
  43. public override void Draw( DrawInfo drawInfo )
  44. {
  45. base.Draw( drawInfo );
  46. m_upperLeftWidget.DrawWidget<ViewSpace>( ref m_viewDirSpace, this, OnWidgetUpdate );
  47. }
  48. private readonly Action<ParentNode> OnWidgetUpdate = ( x ) =>
  49. {
  50. ( x as ViewDirInputsCoordNode ).UpdateTitle();
  51. };
  52. public override void DrawProperties()
  53. {
  54. //base.DrawProperties();
  55. EditorGUI.BeginChangeCheck();
  56. m_viewDirSpace = (ViewSpace)EditorGUILayoutEnumPopup( SpaceStr, m_viewDirSpace );
  57. if( EditorGUI.EndChangeCheck() )
  58. {
  59. UpdateTitle();
  60. }
  61. m_safeNormalize = EditorGUILayoutToggle( NormalizeOptionStr, m_safeNormalize );
  62. EditorGUILayout.HelpBox( "Having safe normalize ON makes sure your view vector is not zero even if you are using your shader with no cameras.", MessageType.None );
  63. }
  64. public override void SetPreviewInputs()
  65. {
  66. base.SetPreviewInputs();
  67. m_previewMaterialPassId = ( int )m_viewDirSpace;
  68. }
  69. public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector )
  70. {
  71. base.PropagateNodeData( nodeData, ref dataCollector );
  72. if( m_viewDirSpace == ViewSpace.Tangent )
  73. dataCollector.DirtyNormal = true;
  74. if( m_safeNormalize )
  75. dataCollector.SafeNormalizeViewDir = true;
  76. }
  77. public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar )
  78. {
  79. if( dataCollector.IsTemplate )
  80. {
  81. TemplateDataCollector inst = dataCollector.TemplateDataCollectorInstance;
  82. string varName = inst.GetViewDir(useMasterNodeCategory: true, customCategory: MasterNodePortCategory.Fragment, normalizeType: m_safeNormalize ? NormalizeType.Safe : NormalizeType.Regular, space: m_viewDirSpace );
  83. return GetOutputVectorItem( 0, outputId, varName );
  84. }
  85. if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation )
  86. {
  87. string result = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, normalizeType: m_safeNormalize ? NormalizeType.Safe : NormalizeType.Regular, space: m_viewDirSpace );
  88. return GetOutputVectorItem( 0, outputId, result );
  89. }
  90. else
  91. {
  92. if ( m_viewDirSpace == ViewSpace.Tangent )
  93. {
  94. string result = base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar );
  95. if ( m_safeNormalize )
  96. {
  97. result = TemplateHelperFunctions.SafeNormalize( dataCollector, result );
  98. }
  99. return result;
  100. }
  101. else
  102. {
  103. dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS );
  104. string result = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, m_safeNormalize ? NormalizeType.Safe : NormalizeType.Regular, space: m_viewDirSpace );
  105. return GetOutputVectorItem( 0, outputId, result );
  106. }
  107. }
  108. }
  109. public override void ReadFromString( ref string[] nodeParams )
  110. {
  111. base.ReadFromString( ref nodeParams );
  112. if( UIUtils.CurrentShaderVersion() > 2402 )
  113. {
  114. m_viewDirSpace = ( ViewSpace )Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) );
  115. }
  116. if( UIUtils.CurrentShaderVersion() > 15201 )
  117. {
  118. m_safeNormalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
  119. }
  120. UpdateTitle();
  121. }
  122. public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
  123. {
  124. base.WriteToString( ref nodeInfo, ref connectionsInfo );
  125. IOUtils.AddFieldValueToString( ref nodeInfo, m_viewDirSpace );
  126. IOUtils.AddFieldValueToString( ref nodeInfo, m_safeNormalize );
  127. }
  128. }
  129. }