You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
4.2 KiB

  1. // Amplify Shader Editor - Visual Shader Editing Tool
  2. // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
  3. using System;
  4. using UnityEngine;
  5. namespace AmplifyShaderEditor
  6. {
  7. public enum CoordinateSpaces
  8. {
  9. Tangent,
  10. Local,
  11. World,
  12. View,
  13. Clip,
  14. Screen
  15. }
  16. [Serializable]
  17. [NodeAttributes( "Transform Vector", "Math Operators", "Transforma a vector into another", null, KeyCode.None, false )]
  18. public sealed class TransformVectorOpNode : ParentNode
  19. {
  20. [SerializeField]
  21. private CoordinateSpaces m_source = CoordinateSpaces.Tangent;
  22. [SerializeField]
  23. private CoordinateSpaces m_destination = CoordinateSpaces.World;
  24. private const string InputTangentrStr = "float4 tangent: TANGENT";
  25. private const string ColorValueStr = ".tangent";
  26. private const string InputNormalStr = "float3 normal : NORMAL";
  27. private const string NormalValueStr = ".normal";
  28. protected override void CommonInit( int uniqueId )
  29. {
  30. base.CommonInit( uniqueId );
  31. AddInputPort( WirePortDataType.FLOAT4, false, Constants.EmptyPortValue );
  32. AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue );
  33. m_useInternalPortData = true;
  34. }
  35. void AddTangentInfo( ref MasterNodeDataCollector dataCollector )
  36. {
  37. dataCollector.AddToInput( UniqueId, InputTangentrStr, true );
  38. dataCollector.AddToInput( UniqueId, InputTangentrStr, true );
  39. dataCollector.AddToInput( UniqueId, InputNormalStr, true );
  40. dataCollector.AddToLocalVariables( UniqueId, "float3 binormal = cross( normalize( v.normal ), normalize( v.tangent.xyz ) ) * v.tangent.w;" );
  41. dataCollector.AddToLocalVariables( UniqueId, "float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );" );
  42. }
  43. public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
  44. {
  45. //if ( !InputPorts[ 0 ].IsConnected )
  46. //{
  47. // return UIUtils.NoConnection( this );
  48. //}
  49. string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
  50. dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables );
  51. switch ( m_source )
  52. {
  53. case CoordinateSpaces.Tangent:
  54. {
  55. AddTangentInfo( ref dataCollector );
  56. switch ( m_destination )
  57. {
  58. case CoordinateSpaces.Tangent:
  59. {
  60. return value;
  61. }
  62. //case eCoordinateSpaces.Local:
  63. //{
  64. //}
  65. //case eCoordinateSpaces.World:
  66. //{
  67. //}
  68. //case eCoordinateSpaces.View:
  69. //{
  70. //}
  71. }
  72. }
  73. break;
  74. case CoordinateSpaces.Local:
  75. {
  76. switch ( m_destination )
  77. {
  78. case CoordinateSpaces.Tangent:
  79. {
  80. AddTangentInfo( ref dataCollector );
  81. return "float4(mul( rotation , " + value + ".xyz ),1)";
  82. }
  83. case CoordinateSpaces.Local:
  84. {
  85. return value;
  86. }
  87. case CoordinateSpaces.World:
  88. {
  89. return "mul( _Object2World , " + value + " )";
  90. }
  91. case CoordinateSpaces.View:
  92. {
  93. return "mul( UNITY_MATRIX_MV , " + value + " )";
  94. }
  95. }
  96. }
  97. break;
  98. case CoordinateSpaces.World:
  99. {
  100. switch ( m_destination )
  101. {
  102. //case eCoordinateSpaces.Tangent:
  103. //{
  104. //}
  105. case CoordinateSpaces.Local:
  106. {
  107. return "mul( _World2Object , " + value + " )";
  108. }
  109. case CoordinateSpaces.World:
  110. {
  111. return value;
  112. }
  113. case CoordinateSpaces.View:
  114. {
  115. return "mul( UNITY_MATRIX_V , " + value + " )";
  116. }
  117. }
  118. }
  119. break;
  120. case CoordinateSpaces.View:
  121. {
  122. UIUtils.ShowMessage( "View as Source is not supported", MessageSeverity.Warning );
  123. return value;
  124. }
  125. }
  126. return UIUtils.UnknownError( this );
  127. }
  128. public override void ReadFromString( ref string[] nodeParams )
  129. {
  130. base.ReadFromString( ref nodeParams );
  131. m_source = ( CoordinateSpaces ) Enum.Parse( typeof( CoordinateSpaces ), GetCurrentParam( ref nodeParams ) );
  132. m_destination = ( CoordinateSpaces ) Enum.Parse( typeof( CoordinateSpaces ), GetCurrentParam( ref nodeParams ) );
  133. }
  134. public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
  135. {
  136. base.WriteToString( ref nodeInfo, ref connectionsInfo );
  137. IOUtils.AddFieldValueToString( ref nodeInfo, m_source );
  138. IOUtils.AddFieldValueToString( ref nodeInfo, m_destination );
  139. }
  140. }
  141. }