Няма описание
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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEditor.Graphing;
  4. namespace UnityEditor.ShaderGraph
  5. {
  6. [Serializable]
  7. enum SlotValueType
  8. {
  9. SamplerState,
  10. DynamicMatrix,
  11. Matrix4,
  12. Matrix3,
  13. Matrix2,
  14. Texture2D,
  15. Texture2DArray,
  16. Texture3D,
  17. Cubemap,
  18. Gradient,
  19. DynamicVector,
  20. Vector4,
  21. Vector3,
  22. Vector2,
  23. Vector1,
  24. Dynamic,
  25. Boolean,
  26. VirtualTexture,
  27. PropertyConnectionState,
  28. }
  29. enum ConcreteSlotValueType
  30. {
  31. SamplerState,
  32. Matrix4,
  33. Matrix3,
  34. Matrix2,
  35. Texture2D,
  36. Texture2DArray,
  37. Texture3D,
  38. Cubemap,
  39. Gradient,
  40. Vector4,
  41. Vector3,
  42. Vector2,
  43. Vector1,
  44. Boolean,
  45. VirtualTexture,
  46. PropertyConnectionState
  47. }
  48. // This enum must match ConcreteSlotValueType enum and is used to give friendly name in the enum popup used for custom function
  49. enum ConcreteSlotValueTypePopupName
  50. {
  51. SamplerState = ConcreteSlotValueType.SamplerState,
  52. Matrix4 = ConcreteSlotValueType.Matrix4,
  53. Matrix3 = ConcreteSlotValueType.Matrix3,
  54. Matrix2 = ConcreteSlotValueType.Matrix2,
  55. Texture2D = ConcreteSlotValueType.Texture2D,
  56. Texture2DArray = ConcreteSlotValueType.Texture2DArray,
  57. Texture3D = ConcreteSlotValueType.Texture3D,
  58. Cubemap = ConcreteSlotValueType.Cubemap,
  59. Gradient = ConcreteSlotValueType.Gradient,
  60. Vector4 = ConcreteSlotValueType.Vector4,
  61. Vector3 = ConcreteSlotValueType.Vector3,
  62. Vector2 = ConcreteSlotValueType.Vector2,
  63. Float = ConcreteSlotValueType.Vector1, // This is currently the only renaming we need - rename Vector1 to Float
  64. Boolean = ConcreteSlotValueType.Boolean,
  65. VirtualTexture = ConcreteSlotValueType.VirtualTexture,
  66. PropertyConnectionState = ConcreteSlotValueType.PropertyConnectionState,
  67. // These allow the user to choose 'bare' types for custom function nodes
  68. // they are treated specially in the conversion functions below
  69. BareSamplerState = 1000 + ConcreteSlotValueType.SamplerState,
  70. BareTexture2D = 1000 + ConcreteSlotValueType.Texture2D,
  71. BareTexture2DArray = 1000 + ConcreteSlotValueType.Texture2DArray,
  72. BareTexture3D = 1000 + ConcreteSlotValueType.Texture3D,
  73. BareCubemap = 1000 + ConcreteSlotValueType.Cubemap,
  74. }
  75. static class SlotValueHelper
  76. {
  77. public static ConcreteSlotValueTypePopupName ToConcreteSlotValueTypePopupName(this ConcreteSlotValueType slotType, bool isBareResource)
  78. {
  79. ConcreteSlotValueTypePopupName result = (ConcreteSlotValueTypePopupName)slotType;
  80. switch (slotType)
  81. {
  82. case ConcreteSlotValueType.SamplerState:
  83. if (isBareResource)
  84. result = ConcreteSlotValueTypePopupName.BareSamplerState;
  85. break;
  86. case ConcreteSlotValueType.Texture2D:
  87. if (isBareResource)
  88. result = ConcreteSlotValueTypePopupName.BareTexture2D;
  89. break;
  90. case ConcreteSlotValueType.Texture2DArray:
  91. if (isBareResource)
  92. result = ConcreteSlotValueTypePopupName.BareTexture2DArray;
  93. break;
  94. case ConcreteSlotValueType.Texture3D:
  95. if (isBareResource)
  96. result = ConcreteSlotValueTypePopupName.BareTexture3D;
  97. break;
  98. case ConcreteSlotValueType.Cubemap:
  99. if (isBareResource)
  100. result = ConcreteSlotValueTypePopupName.BareCubemap;
  101. break;
  102. }
  103. return result;
  104. }
  105. public static ConcreteSlotValueType ToConcreteSlotValueType(this ConcreteSlotValueTypePopupName popup, out bool isBareResource)
  106. {
  107. switch (popup)
  108. {
  109. case ConcreteSlotValueTypePopupName.BareSamplerState:
  110. isBareResource = true;
  111. return ConcreteSlotValueType.SamplerState;
  112. case ConcreteSlotValueTypePopupName.BareTexture2D:
  113. isBareResource = true;
  114. return ConcreteSlotValueType.Texture2D;
  115. case ConcreteSlotValueTypePopupName.BareTexture2DArray:
  116. isBareResource = true;
  117. return ConcreteSlotValueType.Texture2DArray;
  118. case ConcreteSlotValueTypePopupName.BareTexture3D:
  119. isBareResource = true;
  120. return ConcreteSlotValueType.Texture3D;
  121. case ConcreteSlotValueTypePopupName.BareCubemap:
  122. isBareResource = true;
  123. return ConcreteSlotValueType.Cubemap;
  124. }
  125. ;
  126. isBareResource = false;
  127. return (ConcreteSlotValueType)popup;
  128. }
  129. public static bool AllowedAsSubgraphOutput(this ConcreteSlotValueTypePopupName type)
  130. {
  131. // virtual textures and bare types disallowed
  132. return (type < ConcreteSlotValueTypePopupName.VirtualTexture);
  133. }
  134. public static int GetChannelCount(this ConcreteSlotValueType type)
  135. {
  136. switch (type)
  137. {
  138. case ConcreteSlotValueType.Vector4:
  139. return 4;
  140. case ConcreteSlotValueType.Vector3:
  141. return 3;
  142. case ConcreteSlotValueType.Vector2:
  143. return 2;
  144. case ConcreteSlotValueType.Vector1:
  145. return 1;
  146. default:
  147. return 0;
  148. }
  149. }
  150. public static int GetMatrixDimension(ConcreteSlotValueType type)
  151. {
  152. switch (type)
  153. {
  154. case ConcreteSlotValueType.Matrix4:
  155. return 4;
  156. case ConcreteSlotValueType.Matrix3:
  157. return 3;
  158. case ConcreteSlotValueType.Matrix2:
  159. return 2;
  160. default:
  161. return 0;
  162. }
  163. }
  164. public static ConcreteSlotValueType ConvertMatrixToVectorType(ConcreteSlotValueType matrixType)
  165. {
  166. switch (matrixType)
  167. {
  168. case ConcreteSlotValueType.Matrix4:
  169. return ConcreteSlotValueType.Vector4;
  170. case ConcreteSlotValueType.Matrix3:
  171. return ConcreteSlotValueType.Vector3;
  172. default:
  173. return ConcreteSlotValueType.Vector2;
  174. }
  175. }
  176. static Dictionary<ConcreteSlotValueType, List<SlotValueType>> s_ValidConversions;
  177. static List<SlotValueType> s_ValidSlotTypes;
  178. public static bool AreCompatible(SlotValueType inputType, ConcreteSlotValueType outputType, bool outputTypeIsConnectionTestable = false)
  179. {
  180. if (s_ValidConversions == null)
  181. {
  182. var validVectors = new List<SlotValueType>()
  183. {
  184. SlotValueType.Dynamic, SlotValueType.DynamicVector,
  185. SlotValueType.Vector1, SlotValueType.Vector2, SlotValueType.Vector3, SlotValueType.Vector4,
  186. SlotValueType.Boolean
  187. };
  188. s_ValidConversions = new Dictionary<ConcreteSlotValueType, List<SlotValueType>>()
  189. {
  190. {ConcreteSlotValueType.Boolean, new List<SlotValueType>() {SlotValueType.Boolean, SlotValueType.Dynamic, SlotValueType.DynamicVector, SlotValueType.Vector1, SlotValueType.Vector2, SlotValueType.Vector3, SlotValueType.Vector4}},
  191. {ConcreteSlotValueType.Vector1, validVectors},
  192. {ConcreteSlotValueType.Vector2, validVectors},
  193. {ConcreteSlotValueType.Vector3, validVectors},
  194. {ConcreteSlotValueType.Vector4, validVectors},
  195. {ConcreteSlotValueType.Matrix2, new List<SlotValueType>()
  196. {SlotValueType.Dynamic, SlotValueType.DynamicMatrix, SlotValueType.Matrix2}},
  197. {ConcreteSlotValueType.Matrix3, new List<SlotValueType>()
  198. {SlotValueType.Dynamic, SlotValueType.DynamicMatrix, SlotValueType.Matrix2, SlotValueType.Matrix3}},
  199. {ConcreteSlotValueType.Matrix4, new List<SlotValueType>()
  200. {SlotValueType.Dynamic, SlotValueType.DynamicMatrix, SlotValueType.Matrix2, SlotValueType.Matrix3, SlotValueType.Matrix4}},
  201. {ConcreteSlotValueType.Texture2D, new List<SlotValueType>() {SlotValueType.Texture2D}},
  202. {ConcreteSlotValueType.Texture3D, new List<SlotValueType>() {SlotValueType.Texture3D}},
  203. {ConcreteSlotValueType.Texture2DArray, new List<SlotValueType>() {SlotValueType.Texture2DArray}},
  204. {ConcreteSlotValueType.Cubemap, new List<SlotValueType>() {SlotValueType.Cubemap}},
  205. {ConcreteSlotValueType.SamplerState, new List<SlotValueType>() {SlotValueType.SamplerState}},
  206. {ConcreteSlotValueType.Gradient, new List<SlotValueType>() {SlotValueType.Gradient}},
  207. {ConcreteSlotValueType.VirtualTexture, new List<SlotValueType>() {SlotValueType.VirtualTexture}},
  208. };
  209. }
  210. if (inputType == SlotValueType.PropertyConnectionState)
  211. {
  212. return outputTypeIsConnectionTestable;
  213. }
  214. if (s_ValidConversions.TryGetValue(outputType, out s_ValidSlotTypes))
  215. {
  216. return s_ValidSlotTypes.Contains(inputType);
  217. }
  218. throw new ArgumentOutOfRangeException("Unknown Concrete Slot Type: " + outputType);
  219. }
  220. }
  221. }