Brak opisu
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.

PropertyDrawerUtils.cs 9.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using System;
  2. using UnityEngine.UIElements;
  3. using UnityEngine;
  4. using UnityEditor.UIElements;
  5. using UnityEditor.Graphing.Util;
  6. using UnityEditor.Graphing;
  7. using UnityEditor.ShaderGraph.Internal;
  8. using System.Collections.Generic;
  9. namespace UnityEditor.ShaderGraph.Drawing.Inspector
  10. {
  11. public static class PropertyDrawerUtils
  12. {
  13. public static Label CreateLabel(string text, int indentLevel = 0, FontStyle fontStyle = FontStyle.Normal)
  14. {
  15. string label = new string(' ', indentLevel * 4);
  16. var labelVisualElement = new Label(label + text);
  17. labelVisualElement.style.unityFontStyleAndWeight = fontStyle;
  18. labelVisualElement.name = "header";
  19. return labelVisualElement;
  20. }
  21. public static Label CreateLabel(string text, int indentLevel = 0)
  22. {
  23. string label = new string(' ', indentLevel * 4);
  24. var labelVisualElement = new Label(label + text);
  25. return labelVisualElement;
  26. }
  27. internal enum UIPrecisionForShaderGraphs
  28. {
  29. Inherit = Precision.Inherit,
  30. Single = Precision.Single,
  31. Half = Precision.Half,
  32. UseGraphPrecision = Precision.Graph,
  33. }
  34. internal static void AddDefaultNodeProperties(VisualElement parentElement, AbstractMaterialNode node, Action setNodesAsDirtyCallback, Action updateNodeViewsCallback)
  35. {
  36. EnumField precisionField = null;
  37. if (node.canSetPrecision)
  38. {
  39. precisionField = new EnumField((UIPrecisionForShaderGraphs)node.precision);
  40. var propertyRow = new PropertyRow(new Label("Precision"));
  41. propertyRow.Add(precisionField, (field) =>
  42. {
  43. field.RegisterValueChangedCallback(evt =>
  44. {
  45. if (evt.newValue.Equals(node.precision))
  46. return;
  47. setNodesAsDirtyCallback?.Invoke();
  48. node.owner.owner.RegisterCompleteObjectUndo("Change precision");
  49. node.precision = (Precision)evt.newValue;
  50. node.owner.ValidateGraph();
  51. updateNodeViewsCallback?.Invoke();
  52. node.Dirty(ModificationScope.Graph);
  53. });
  54. });
  55. if (node is Serialization.MultiJsonInternal.UnknownNodeType)
  56. precisionField.SetEnabled(false);
  57. parentElement.Add(propertyRow);
  58. }
  59. EnumField previewField = null;
  60. if (node.hasPreview)
  61. {
  62. previewField = new EnumField(node.m_PreviewMode);
  63. var propertyRow = new PropertyRow(new Label("Preview"));
  64. propertyRow.Add(previewField, (field) =>
  65. {
  66. field.RegisterValueChangedCallback(evt =>
  67. {
  68. if (evt.newValue.Equals(node.m_PreviewMode))
  69. return;
  70. setNodesAsDirtyCallback?.Invoke();
  71. node.owner.owner.RegisterCompleteObjectUndo("Change preview");
  72. node.m_PreviewMode = (PreviewMode)evt.newValue;
  73. updateNodeViewsCallback?.Invoke();
  74. node.Dirty(ModificationScope.Graph);
  75. });
  76. });
  77. if (node is Serialization.MultiJsonInternal.UnknownNodeType)
  78. previewField.SetEnabled(false);
  79. parentElement.Add(propertyRow);
  80. }
  81. if (node is BlockNode bnode)
  82. {
  83. AddCustomInterpolatorProperties(parentElement, bnode, setNodesAsDirtyCallback, updateNodeViewsCallback);
  84. }
  85. if (node is CustomInterpolatorNode cinode)
  86. {
  87. if (cinode.e_targetBlockNode != null)
  88. {
  89. AddCustomInterpolatorProperties(parentElement, cinode.e_targetBlockNode, setNodesAsDirtyCallback, updateNodeViewsCallback);
  90. }
  91. }
  92. }
  93. internal static void AddCustomInterpolatorProperties(VisualElement parentElement, BlockNode node, Action setNodesAsDirtyCallback, Action updateNodeViewsCallback)
  94. {
  95. if (!node.isCustomBlock)
  96. return;
  97. TextField textField = null;
  98. {
  99. textField = new TextField { value = node.customName, multiline = false };
  100. var propertyRow = new PropertyRow(new Label("Name"));
  101. propertyRow.Add(textField, (field) =>
  102. {
  103. field.RegisterCallback<FocusOutEvent>(evt =>
  104. {
  105. if (field.value.Equals(node.customName))
  106. return;
  107. HashSet<string> usedNames = new HashSet<string>();
  108. foreach (var other in node.contextData.blocks)
  109. if (other != node)
  110. usedNames.Add(other.value.descriptor.displayName);
  111. setNodesAsDirtyCallback?.Invoke();
  112. node.owner.owner.RegisterCompleteObjectUndo("Change Block Name");
  113. field.value = node.customName = GraphUtil.SanitizeName(usedNames, "{0}_{1}", NodeUtils.ConvertToValidHLSLIdentifier(field.value));
  114. updateNodeViewsCallback?.Invoke();
  115. node.Dirty(ModificationScope.Node);
  116. node.owner?.ValidateGraph();
  117. });
  118. });
  119. parentElement.Add(propertyRow);
  120. }
  121. EnumField typeField = null;
  122. {
  123. typeField = new EnumField(node.customWidth);
  124. var propertyRow = new PropertyRow(new Label("Type"));
  125. propertyRow.Add(typeField, (field) =>
  126. {
  127. field.RegisterValueChangedCallback(evt =>
  128. {
  129. if (evt.newValue.Equals(node.customWidth))
  130. return;
  131. setNodesAsDirtyCallback?.Invoke();
  132. node.owner.owner.RegisterCompleteObjectUndo("Change Block Type");
  133. node.customWidth = (BlockNode.CustomBlockType)evt.newValue;
  134. updateNodeViewsCallback?.Invoke();
  135. node.Dirty(ModificationScope.Topological);
  136. node.owner?.ValidateGraph();
  137. });
  138. });
  139. parentElement.Add(propertyRow);
  140. }
  141. }
  142. internal static void AddCustomCheckboxProperty(
  143. VisualElement parentElement, AbstractMaterialNode node,
  144. Action setNodesAsDirtyCallback, Action updateNodeViewsCallback,
  145. String label,
  146. String undoLabel,
  147. Func<bool> GetterFn,
  148. Action<bool> SetterFn)
  149. {
  150. var fieldObj = new Toggle();
  151. fieldObj.value = GetterFn();
  152. var propertyRow = new PropertyRow(new Label(label));
  153. propertyRow.Add(fieldObj, (field) =>
  154. {
  155. field.RegisterValueChangedCallback(evt =>
  156. {
  157. if (evt.newValue.Equals(GetterFn()))
  158. return;
  159. setNodesAsDirtyCallback?.Invoke();
  160. node.owner.owner.RegisterCompleteObjectUndo(undoLabel);
  161. SetterFn((bool)evt.newValue);
  162. node.owner.ValidateGraph();
  163. updateNodeViewsCallback?.Invoke();
  164. node.Dirty(ModificationScope.Graph);
  165. });
  166. });
  167. if (node is Serialization.MultiJsonInternal.UnknownNodeType)
  168. fieldObj.SetEnabled(false);
  169. parentElement.Add(propertyRow);
  170. }
  171. internal static void AddCustomEnumProperty<T>(
  172. VisualElement parentElement, AbstractMaterialNode node,
  173. Action setNodesAsDirtyCallback, Action updateNodeViewsCallback,
  174. String label,
  175. String undoLabel,
  176. Func<T> GetterFn,
  177. Action<T> SetterFn) where T : System.Enum, IConvertible
  178. {
  179. var fieldObj = new EnumField(GetterFn());
  180. //fieldObj.value = ;
  181. var propertyRow = new PropertyRow(new Label(label));
  182. propertyRow.Add(fieldObj, (field) =>
  183. {
  184. field.RegisterValueChangedCallback(evt =>
  185. {
  186. if (evt.newValue.Equals(GetterFn()))
  187. return;
  188. setNodesAsDirtyCallback?.Invoke();
  189. node.owner.owner.RegisterCompleteObjectUndo(undoLabel);
  190. SetterFn((T)evt.newValue);
  191. node.owner.ValidateGraph();
  192. updateNodeViewsCallback?.Invoke();
  193. node.Dirty(ModificationScope.Graph);
  194. });
  195. });
  196. if (node is Serialization.MultiJsonInternal.UnknownNodeType)
  197. fieldObj.SetEnabled(false);
  198. parentElement.Add(propertyRow);
  199. }
  200. }
  201. }