ViewVectorNode.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. [Serializable]
  9. [NodeAttributes( "View Vector", "Camera And Screen", "Unnormalized View Direction vector.", tags: "camera vector" )]
  10. public sealed class ViewVectorNode : ParentNode
  11. {
  12. private const string SpaceStr = "Space";
  13. [SerializeField]
  14. private ViewSpace m_viewDirSpace = ViewSpace.World;
  15. private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper();
  16. protected override void CommonInit( int uniqueId )
  17. {
  18. base.CommonInit( uniqueId );
  19. AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" );
  20. //m_outputPorts[ 4 ].Visible = false;
  21. m_textLabelWidth = 120;
  22. m_autoWrapProperties = true;
  23. m_drawPreviewAsSphere = true;
  24. m_hasLeftDropdown = true;
  25. UpdateTitle();
  26. m_previewShaderGUID = "30c17cf801c339f489ed656ff9d66a5b";
  27. }
  28. private void UpdateTitle()
  29. {
  30. m_additionalContent.text = string.Format( Constants.SubTitleSpaceFormatStr, m_viewDirSpace.ToString() );
  31. m_sizeIsDirty = true;
  32. }
  33. public override void Draw( DrawInfo drawInfo )
  34. {
  35. base.Draw( drawInfo );
  36. m_upperLeftWidget.DrawWidget<ViewSpace>( ref m_viewDirSpace, this, OnWidgetUpdate );
  37. }
  38. private readonly Action<ParentNode> OnWidgetUpdate = ( x ) =>
  39. {
  40. ( x as ViewVectorNode ).UpdateTitle();
  41. };
  42. public override void DrawProperties()
  43. {
  44. base.DrawProperties();
  45. EditorGUI.BeginChangeCheck();
  46. m_viewDirSpace = ( ViewSpace )EditorGUILayoutEnumPopup( SpaceStr, m_viewDirSpace );
  47. if ( EditorGUI.EndChangeCheck() )
  48. {
  49. UpdateTitle();
  50. }
  51. }
  52. public override void SetPreviewInputs()
  53. {
  54. base.SetPreviewInputs();
  55. m_previewMaterialPassId = ( int )m_viewDirSpace;
  56. }
  57. public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector )
  58. {
  59. base.PropagateNodeData( nodeData, ref dataCollector );
  60. if ( m_viewDirSpace == ViewSpace.Tangent )
  61. {
  62. dataCollector.DirtyNormal = true;
  63. }
  64. }
  65. public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar )
  66. {
  67. if ( dataCollector.IsTemplate )
  68. {
  69. TemplateDataCollector inst = dataCollector.TemplateDataCollectorInstance;
  70. string varName = inst.GetViewVector( useMasterNodeCategory: true, customCategory: MasterNodePortCategory.Fragment, space: m_viewDirSpace );
  71. return GetOutputVectorItem( 0, outputId, varName );
  72. }
  73. if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation )
  74. {
  75. string result = GeneratorUtils.GenerateViewVector( ref dataCollector, UniqueId, space: m_viewDirSpace );
  76. return GetOutputVectorItem( 0, outputId, result );
  77. }
  78. else
  79. {
  80. if ( m_viewDirSpace == ViewSpace.Tangent )
  81. {
  82. dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision );
  83. dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false );
  84. dataCollector.ForceNormal = true;
  85. }
  86. dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS );
  87. string result = GeneratorUtils.GenerateViewVector( ref dataCollector, UniqueId, space: m_viewDirSpace );
  88. return GetOutputVectorItem( 0, outputId, result );
  89. }
  90. }
  91. public override void ReadFromString( ref string[] nodeParams )
  92. {
  93. base.ReadFromString( ref nodeParams );
  94. m_viewDirSpace = ( ViewSpace )Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) );
  95. UpdateTitle();
  96. }
  97. public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
  98. {
  99. base.WriteToString( ref nodeInfo, ref connectionsInfo );
  100. IOUtils.AddFieldValueToString( ref nodeInfo, m_viewDirSpace );
  101. }
  102. }
  103. }