VFXColorField.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. using UnityEngine;
  2. using UnityEngine.UIElements;
  3. using UnityEditor.UIElements;
  4. using PositionType = UnityEngine.UIElements.Position;
  5. namespace UnityEditor.VFX.UI
  6. {
  7. class VFXColorField : ValueControl<Color>
  8. {
  9. VisualElement m_ColorDisplay;
  10. VisualElement m_AlphaDisplay;
  11. VisualElement m_NotAlphaDisplay;
  12. VisualElement m_AlphaContainer;
  13. VisualElement m_HDRLabel;
  14. VisualElement m_IndeterminateLabel;
  15. VisualElement m_Container;
  16. VisualElement CreateColorContainer()
  17. {
  18. m_Container = new VisualElement();
  19. m_Container.style.flexDirection = FlexDirection.Column;
  20. m_Container.style.alignItems = Align.Stretch;
  21. m_Container.style.flexGrow = 1f;
  22. m_Container.style.flexShrink = 1f;
  23. m_Container.AddToClassList("colorcontainer");
  24. m_ColorDisplay = new VisualElement();
  25. m_ColorDisplay.style.height = 10;
  26. m_ColorDisplay.AddToClassList("colordisplay");
  27. m_AlphaDisplay = new VisualElement();
  28. m_AlphaDisplay.style.height = 3;
  29. m_AlphaDisplay.style.backgroundColor = Color.white;
  30. m_AlphaDisplay.AddToClassList("alphadisplay");
  31. m_NotAlphaDisplay = new VisualElement();
  32. m_NotAlphaDisplay.style.height = 3;
  33. m_NotAlphaDisplay.style.backgroundColor = Color.black;
  34. m_NotAlphaDisplay.AddToClassList("notalphadisplay");
  35. m_AlphaContainer = new VisualElement();
  36. m_AlphaContainer.style.flexDirection = FlexDirection.Row;
  37. m_AlphaContainer.style.height = 3;
  38. m_ColorDisplay.AddManipulator(new Clickable(OnColorClick));
  39. m_AlphaDisplay.AddManipulator(new Clickable(OnColorClick));
  40. m_HDRLabel = new Label()
  41. {
  42. pickingMode = PickingMode.Ignore,
  43. text = "HDR"
  44. };
  45. m_IndeterminateLabel = new Label()
  46. {
  47. pickingMode = PickingMode.Ignore,
  48. name = "indeterminate",
  49. text = VFXControlConstants.indeterminateText
  50. };
  51. m_HDRLabel.style.unityTextAlign = TextAnchor.MiddleCenter;
  52. m_HDRLabel.style.position = PositionType.Absolute;
  53. m_HDRLabel.style.top = 0f;
  54. m_HDRLabel.style.bottom = 0f;
  55. m_HDRLabel.style.left = 0f;
  56. m_HDRLabel.style.right = 0f;
  57. m_IndeterminateLabel.style.unityTextAlign = TextAnchor.MiddleLeft;
  58. m_IndeterminateLabel.style.position = PositionType.Absolute;
  59. m_IndeterminateLabel.style.top = 0f;
  60. m_IndeterminateLabel.style.bottom = 0f;
  61. m_IndeterminateLabel.style.left = 0f;
  62. m_IndeterminateLabel.style.right = 0f;
  63. m_HDRLabel.AddToClassList("hdr");
  64. m_Container.Add(m_ColorDisplay);
  65. m_Container.Add(m_AlphaContainer);
  66. m_Container.Add(m_HDRLabel);
  67. m_Container.Add(m_IndeterminateLabel);
  68. m_AlphaContainer.Add(m_AlphaDisplay);
  69. m_AlphaContainer.Add(m_NotAlphaDisplay);
  70. return m_Container;
  71. }
  72. private bool m_ShowAlpha = true;
  73. private Color m_InitialColor;
  74. public bool showAlpha
  75. {
  76. get { return m_ShowAlpha; }
  77. set
  78. {
  79. if (m_ShowAlpha != value)
  80. {
  81. m_ShowAlpha = value;
  82. if (m_ShowAlpha)
  83. {
  84. m_Container.Add(m_AlphaContainer);
  85. }
  86. else
  87. {
  88. m_AlphaContainer.RemoveFromHierarchy();
  89. }
  90. }
  91. }
  92. }
  93. void OnColorClick()
  94. {
  95. if (enabledInHierarchy)
  96. ColorPicker.Show(OnColorChanged, m_Value, m_ShowAlpha, true);
  97. }
  98. VisualElement CreateEyeDropper()
  99. {
  100. Texture2D eyeDropperIcon = EditorGUIUtility.IconContent("EyeDropper.Large").image as Texture2D;
  101. var eyeDropper = new VisualElement();
  102. eyeDropper.style.backgroundImage = eyeDropperIcon;
  103. eyeDropper.style.width = 20;
  104. eyeDropper.style.height = 20;
  105. eyeDropper.RegisterCallback<MouseDownEvent>(OnEyeDropperStart);
  106. return eyeDropper;
  107. }
  108. IVisualElementScheduledItem m_EyeDropperScheduler;
  109. void OnEyeDropperStart(MouseDownEvent e)
  110. {
  111. if (EyeDropper.IsOpened)
  112. {
  113. return;
  114. }
  115. this.m_InitialColor = m_Value;
  116. EyeDropper.Start(OnGammaColorChanged);
  117. m_EyeDropperScheduler = this.schedule.Execute(OnEyeDropperMove).Every(10).StartingIn(10).Until(this.ShouldStopWatchingEyeDropper);
  118. }
  119. private bool ShouldStopWatchingEyeDropper()
  120. {
  121. if (EyeDropper.IsOpened)
  122. {
  123. return false;
  124. }
  125. if (EyeDropper.IsCancelled)
  126. {
  127. SetValue(m_InitialColor);
  128. }
  129. return true;
  130. }
  131. void OnEyeDropperMove(TimerState state)
  132. {
  133. Color pickerColor = EyeDropper.GetPickedColor();
  134. if (pickerColor != GetValue())
  135. {
  136. SetValue(pickerColor.linear);
  137. }
  138. }
  139. readonly VisualElement m_EyeDropper;
  140. public VFXColorField(string label) : base(label)
  141. {
  142. VisualElement container = CreateColorContainer();
  143. Add(container);
  144. m_EyeDropper = CreateEyeDropper();
  145. Add(m_EyeDropper);
  146. }
  147. public VFXColorField(Label existingLabel) : base(existingLabel)
  148. {
  149. VisualElement container = CreateColorContainer();
  150. Add(container);
  151. m_EyeDropper = CreateEyeDropper();
  152. Add(m_EyeDropper);
  153. }
  154. void OnGammaColorChanged(Color color)
  155. {
  156. OnColorChanged(color.linear);
  157. }
  158. void OnColorChanged(Color color)
  159. {
  160. SetValue(color);
  161. if (m_EyeDropperScheduler != null)
  162. {
  163. m_EyeDropperScheduler.Pause();
  164. m_EyeDropperScheduler = null;
  165. }
  166. if (OnValueChanged != null)
  167. OnValueChanged();
  168. }
  169. bool m_Indeterminate;
  170. public bool indeterminate
  171. {
  172. get { return m_Indeterminate; }
  173. set
  174. {
  175. m_Indeterminate = value;
  176. ValueToGUI(true);
  177. }
  178. }
  179. protected override void ValueToGUI(bool force)
  180. {
  181. if (indeterminate)
  182. {
  183. m_ColorDisplay.style.backgroundColor = VFXControlConstants.indeterminateTextColor;
  184. m_AlphaDisplay.style.flexGrow = 1f;
  185. m_NotAlphaDisplay.style.flexGrow = 0f;
  186. m_NotAlphaDisplay.style.flexShrink = 0f;
  187. m_HDRLabel.RemoveFromHierarchy();
  188. if (m_IndeterminateLabel.parent == null)
  189. m_Container.Add(m_IndeterminateLabel);
  190. }
  191. else
  192. {
  193. m_IndeterminateLabel.RemoveFromHierarchy();
  194. Color displayedColor = (new Color(m_Value.r, m_Value.g, m_Value.b, 1)).gamma;
  195. m_ColorDisplay.style.backgroundColor = displayedColor;
  196. m_AlphaDisplay.style.flexGrow = m_Value.a;
  197. m_AlphaDisplay.style.flexShrink = 0f;
  198. m_NotAlphaDisplay.style.flexGrow = 1 - m_Value.a;
  199. m_NotAlphaDisplay.style.flexShrink = 0f;
  200. bool hdr = m_Value.r > 1 || m_Value.g > 1 || m_Value.b > 1;
  201. if ((m_HDRLabel.parent != null) != hdr)
  202. {
  203. if (hdr)
  204. {
  205. if (m_HDRLabel.parent == null)
  206. m_Container.Add(m_HDRLabel);
  207. }
  208. else
  209. m_HDRLabel.RemoveFromHierarchy();
  210. }
  211. }
  212. }
  213. }
  214. }