Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

VisibilityTool.cs 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. using System;
  2. using UnityEngine.U2D.Common;
  3. using UnityEditor.U2D.Layout;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using UnityEngine.UIElements;
  7. namespace UnityEditor.U2D.Animation
  8. {
  9. internal class VisibilityToolWindow : VisualElement, IVisibilityToolWindow
  10. {
  11. public class CustomUxmlFactory : UxmlFactory<VisibilityToolWindow, UxmlTraits> {}
  12. VisualElement m_SelectorContainer;
  13. VisualElement m_Container;
  14. Slider m_BoneOpacitySlider;
  15. Slider m_MeshOpacitySlider;
  16. private LayoutOverlay m_Layout;
  17. List<Button> m_Tabs;
  18. int m_CurrentSelectedTab = 0;
  19. public event Action<float> onBoneOpacitySliderChange = (f) => {};
  20. public event Action<float> onMeshOpacitySliderChange = (f) => {};
  21. public event Action onBoneOpacitySliderChangeBegin = () => {};
  22. public event Action onBoneOpacitySliderChangeEnd = () => {};
  23. public event Action onMeshOpacitySliderChangeBegin = () => {};
  24. public event Action onMeshOpacitySliderChangeEnd = () => {};
  25. public static VisibilityToolWindow CreateFromUXML()
  26. {
  27. var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/VisibilityToolWindow.uxml");
  28. var ve = visualTree.CloneTree().Q("VisibilityToolWindow") as VisibilityToolWindow;
  29. var resizer = ve.Q("Resizer");
  30. resizer.AddManipulator(new VisibilityToolResizer());
  31. ve.styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/VisibilityTool.uss"));
  32. if (EditorGUIUtility.isProSkin)
  33. ve.AddToClassList("Dark");
  34. ve.LocalizeTextInChildren();
  35. ve.BindElements();
  36. return ve;
  37. }
  38. public void BindElements()
  39. {
  40. m_SelectorContainer = this.Q("VisibilityToolSelection");
  41. m_Container = this.Q("VisibilityToolContainer");
  42. m_BoneOpacitySlider = this.Q<Slider>("BoneOpacitySlider");
  43. m_BoneOpacitySlider.RegisterValueChangedCallback(OnBoneOpacitySliderValueChangd);
  44. m_MeshOpacitySlider = this.Q<Slider>("MeshOpacitySlider");
  45. m_MeshOpacitySlider.RegisterValueChangedCallback(OnMeshOpacitySliderValueChangd);
  46. RegisterCallback<MouseDownEvent>(OpacityChangeBegin, TrickleDown.TrickleDown);
  47. RegisterCallback<MouseCaptureOutEvent>(OpacityChangeEnd, TrickleDown.TrickleDown);
  48. // case 1200857 StopPropagation when bubbling up so that main IMGUI doesn't get the event
  49. RegisterCallback<MouseDownEvent>(evt => evt.StopPropagation());
  50. m_Tabs = new List<Button>();
  51. m_SelectorContainer.Clear();
  52. }
  53. public void Initialize(LayoutOverlay layout)
  54. {
  55. m_Layout = layout;
  56. layout.rightOverlay.Add(this);
  57. Hide();
  58. }
  59. public void Show()
  60. {
  61. m_Container.Clear();
  62. this.SetHiddenFromLayout(false);
  63. m_Layout.VisibilityWindowOn(true);
  64. }
  65. public void Hide()
  66. {
  67. m_Container.Clear();
  68. this.SetHiddenFromLayout(true);
  69. m_Layout.VisibilityWindowOn(false);
  70. }
  71. bool IsOpacityTarget(IEventHandler target, VisualElement opacityTarget)
  72. {
  73. var ve = target as VisualElement;
  74. while (ve != null && ve != this)
  75. {
  76. if (ve == opacityTarget)
  77. return true;
  78. ve = ve.parent;
  79. }
  80. return false;
  81. }
  82. void OpacityChangeBegin(MouseDownEvent evt)
  83. {
  84. if (IsOpacityTarget(evt.target, m_BoneOpacitySlider))
  85. onBoneOpacitySliderChangeBegin();
  86. else if (IsOpacityTarget(evt.target, m_MeshOpacitySlider))
  87. onMeshOpacitySliderChangeBegin();
  88. }
  89. void OpacityChangeEnd(MouseCaptureOutEvent evt)
  90. {
  91. if (IsOpacityTarget(evt.target, m_BoneOpacitySlider))
  92. onBoneOpacitySliderChangeEnd();
  93. else if (IsOpacityTarget(evt.target, m_MeshOpacitySlider))
  94. onMeshOpacitySliderChangeEnd();
  95. }
  96. void OnBoneOpacitySliderValueChangd(ChangeEvent<float> evt)
  97. {
  98. onBoneOpacitySliderChange(evt.newValue);
  99. }
  100. void OnMeshOpacitySliderValueChangd(ChangeEvent<float> evt)
  101. {
  102. onMeshOpacitySliderChange(evt.newValue);
  103. }
  104. public void SetBoneOpacitySliderValue(float value)
  105. {
  106. m_BoneOpacitySlider.value = value;
  107. m_BoneOpacitySlider.MarkDirtyRepaint();
  108. }
  109. public void SetMeshOpacitySliderValue(float value)
  110. {
  111. m_MeshOpacitySlider.value = value;
  112. m_MeshOpacitySlider.MarkDirtyRepaint();
  113. }
  114. public void AddToolTab(string name, Action onClick)
  115. {
  116. var tab = new Button()
  117. {
  118. text = name
  119. };
  120. tab.AddToClassList("visibilityToolTab");
  121. if (EditorGUIUtility.isProSkin)
  122. tab.AddToClassList("visibilityToolTabDark");
  123. m_SelectorContainer.Add(tab);
  124. m_Tabs.Add(tab);
  125. tab.clickable.clicked += onClick;
  126. }
  127. public void SetActiveTab(int toolIndex)
  128. {
  129. if (m_Tabs.Count > toolIndex && toolIndex >= 0)
  130. {
  131. m_Tabs[m_CurrentSelectedTab].SetChecked(false);
  132. m_Tabs[toolIndex].SetChecked(true);
  133. m_CurrentSelectedTab = toolIndex;
  134. }
  135. }
  136. public void SetContent(VisualElement content)
  137. {
  138. m_Container.Clear();
  139. m_Container.Add(content);
  140. }
  141. public void SetToolAvailable(int toolIndex, bool available)
  142. {
  143. if (m_Tabs.Count > toolIndex && toolIndex >= 0)
  144. {
  145. m_Tabs[toolIndex].SetHiddenFromLayout(!available);
  146. if (available == false && toolIndex == m_CurrentSelectedTab)
  147. m_Container.Clear();
  148. }
  149. }
  150. }
  151. internal class VisibilityTool : BaseTool, IVisibilityToolModel
  152. {
  153. private VisibilityToolWindow m_ToolView;
  154. private MeshPreviewBehaviour m_MeshPreviewBehaviour = new MeshPreviewBehaviour();
  155. public SkeletonTool skeletonTool { set; private get; }
  156. VisibilityToolController m_Controller;
  157. internal override void OnCreate()
  158. {
  159. m_ToolView = VisibilityToolWindow.CreateFromUXML();
  160. m_Controller = new VisibilityToolController(this, new IVisibilityTool[]
  161. {
  162. new BoneVisibilityTool(skinningCache),
  163. new SpriteVisibilityTool(skinningCache)
  164. },
  165. () => skeletonTool,
  166. () => previewBehaviour);
  167. }
  168. public override IMeshPreviewBehaviour previewBehaviour
  169. {
  170. get { return m_MeshPreviewBehaviour; }
  171. }
  172. public override void Initialize(LayoutOverlay layout)
  173. {
  174. m_ToolView.Initialize(layout);
  175. }
  176. protected override void OnGUI()
  177. {
  178. skeletonTool.skeletonStyle = SkeletonStyles.WeightMap;
  179. skeletonTool.mode = SkeletonMode.EditPose;
  180. skeletonTool.editBindPose = false;
  181. skeletonTool.DoGUI();
  182. }
  183. protected override void OnActivate()
  184. {
  185. m_MeshPreviewBehaviour.showWeightMap = true;
  186. m_Controller.Activate();
  187. }
  188. protected override void OnDeactivate()
  189. {
  190. m_Controller.Deactivate();
  191. }
  192. int IVisibilityToolModel.currentToolIndex
  193. {
  194. get
  195. {
  196. return skinningCache.visibilityToolIndex;
  197. }
  198. set
  199. {
  200. skinningCache.visibilityToolIndex = value;
  201. }
  202. }
  203. float IVisibilityToolModel.boneOpacityValue
  204. {
  205. get
  206. {
  207. return VisibilityToolSettings.boneOpacity;
  208. }
  209. set
  210. {
  211. VisibilityToolSettings.boneOpacity = value;
  212. }
  213. }
  214. float IVisibilityToolModel.meshOpacityValue
  215. {
  216. get
  217. {
  218. return VisibilityToolSettings.meshOpacity;
  219. }
  220. set
  221. {
  222. VisibilityToolSettings.meshOpacity = value;
  223. }
  224. }
  225. UndoScope IVisibilityToolModel.UndoScope(string value)
  226. {
  227. return skinningCache.UndoScope(value);
  228. }
  229. void IVisibilityToolModel.BeginUndoOperation(string value)
  230. {
  231. skinningCache.BeginUndoOperation(value);
  232. }
  233. IVisibilityToolWindow IVisibilityToolModel.view { get { return m_ToolView;} }
  234. SkinningCache IVisibilityToolModel.skinningCache { get { return skinningCache;} }
  235. }
  236. internal interface IVisibilityToolModel
  237. {
  238. int currentToolIndex { get; set; }
  239. float meshOpacityValue { get; set; }
  240. float boneOpacityValue { get; set; }
  241. UndoScope UndoScope(string value);
  242. void BeginUndoOperation(string value);
  243. IVisibilityToolWindow view { get; }
  244. SkinningCache skinningCache { get; }
  245. }
  246. internal interface IVisibilityToolWindow
  247. {
  248. void AddToolTab(string name, Action callback);
  249. void SetToolAvailable(int i, bool available);
  250. void SetBoneOpacitySliderValue(float value);
  251. void SetMeshOpacitySliderValue(float value);
  252. event Action<float> onBoneOpacitySliderChange;
  253. event Action<float> onMeshOpacitySliderChange;
  254. event Action onBoneOpacitySliderChangeBegin;
  255. event Action onBoneOpacitySliderChangeEnd;
  256. event Action onMeshOpacitySliderChangeBegin;
  257. event Action onMeshOpacitySliderChangeEnd;
  258. void Show();
  259. void Hide();
  260. void SetActiveTab(int index);
  261. void SetContent(VisualElement content);
  262. }
  263. internal class VisibilityToolController
  264. {
  265. IVisibilityTool[] m_Tools;
  266. IVisibilityToolModel m_Model;
  267. Func<SkeletonTool> m_SkeletonTool;
  268. Func<IMeshPreviewBehaviour> m_MeshPreviewBehaviour;
  269. bool m_DeactivateBoneaTool = false;
  270. private IVisibilityTool currentTool
  271. {
  272. get { return m_Model.currentToolIndex == -1 ? null : m_Tools[m_Model.currentToolIndex]; }
  273. set { m_Model.currentToolIndex = value == null ? -1 : Array.FindIndex(m_Tools, x => x == value); }
  274. }
  275. private IVisibilityTool defaultTool
  276. {
  277. get { return Array.Find(m_Tools, t => t.isAvailable); }
  278. }
  279. public VisibilityToolController(IVisibilityToolModel model, IVisibilityTool[] tools, Func<SkeletonTool> skeletonTool = null, Func<IMeshPreviewBehaviour> meshPreviewBehaviour = null)
  280. {
  281. m_Model = model;
  282. m_Tools = tools;
  283. for (int i = 0; i < m_Tools.Length; ++i)
  284. {
  285. int index = i;
  286. var tool = m_Tools[i];
  287. tool.SetAvailabilityChangeCallback(() => OnToolAvailabilityChange(index));
  288. tool.Setup();
  289. model.view.AddToolTab(tool.name, () => ActivateToolWithUndo(tool));
  290. model.view.SetToolAvailable(i, tool.isAvailable);
  291. }
  292. m_SkeletonTool = skeletonTool;
  293. m_MeshPreviewBehaviour = meshPreviewBehaviour;
  294. }
  295. public void Activate()
  296. {
  297. m_Model.view.Show();
  298. if (currentTool == null)
  299. currentTool = defaultTool;
  300. ActivateTool(currentTool);
  301. m_Model.view.SetBoneOpacitySliderValue(m_Model.boneOpacityValue);
  302. m_Model.view.SetMeshOpacitySliderValue(m_Model.meshOpacityValue);
  303. m_Model.view.onBoneOpacitySliderChange -= OnBoneOpacityChange;
  304. m_Model.view.onMeshOpacitySliderChange -= OnMeshOpacityChange;
  305. m_Model.view.onBoneOpacitySliderChange += OnBoneOpacityChange;
  306. m_Model.view.onMeshOpacitySliderChange += OnMeshOpacityChange;
  307. m_Model.view.onBoneOpacitySliderChangeBegin -= OnBoneOpacityChangeBegin;
  308. m_Model.view.onBoneOpacitySliderChangeBegin += OnBoneOpacityChangeBegin;
  309. m_Model.view.onBoneOpacitySliderChangeEnd -= OnBoneOpacityChangeEnd;
  310. m_Model.view.onBoneOpacitySliderChangeEnd += OnBoneOpacityChangeEnd;
  311. m_Model.view.onMeshOpacitySliderChangeBegin -= OnMeshOpacityChangeBegin;
  312. m_Model.view.onMeshOpacitySliderChangeBegin += OnMeshOpacityChangeBegin;
  313. m_Model.view.onMeshOpacitySliderChangeEnd -= OnMeshOpacityChangeEnd;
  314. m_Model.view.onMeshOpacitySliderChangeEnd += OnMeshOpacityChangeEnd;
  315. }
  316. public void Deactivate()
  317. {
  318. m_Model.view.Hide();
  319. if (currentTool != null)
  320. currentTool.Deactivate();
  321. m_Model.view.onBoneOpacitySliderChange -= OnBoneOpacityChange;
  322. m_Model.view.onMeshOpacitySliderChange -= OnMeshOpacityChange;
  323. m_Model.view.onBoneOpacitySliderChangeBegin -= OnBoneOpacityChangeBegin;
  324. m_Model.view.onBoneOpacitySliderChangeEnd -= OnBoneOpacityChangeEnd;
  325. m_Model.view.onMeshOpacitySliderChangeBegin -= OnMeshOpacityChangeBegin;
  326. m_Model.view.onMeshOpacitySliderChangeEnd -= OnMeshOpacityChangeEnd;
  327. }
  328. void OnBoneOpacityChangeBegin()
  329. {
  330. if (m_SkeletonTool != null && m_SkeletonTool() != null && !m_SkeletonTool().isActive)
  331. {
  332. m_SkeletonTool().Activate();
  333. m_DeactivateBoneaTool = true;
  334. }
  335. }
  336. void OnBoneOpacityChangeEnd()
  337. {
  338. if (m_SkeletonTool != null && m_SkeletonTool() != null && m_SkeletonTool().isActive && m_DeactivateBoneaTool)
  339. m_SkeletonTool().Deactivate();
  340. }
  341. void OnMeshOpacityChangeBegin()
  342. {
  343. m_Model.skinningCache.events.meshPreviewBehaviourChange.Invoke(m_MeshPreviewBehaviour());
  344. }
  345. void OnMeshOpacityChangeEnd()
  346. {
  347. m_Model.skinningCache.events.meshPreviewBehaviourChange.Invoke(null);
  348. }
  349. private void OnBoneOpacityChange(float value)
  350. {
  351. m_Model.boneOpacityValue = value;
  352. }
  353. private void OnMeshOpacityChange(float value)
  354. {
  355. m_Model.meshOpacityValue = value;
  356. }
  357. private void OnToolAvailabilityChange(int toolIndex)
  358. {
  359. var toolChanged = m_Tools[toolIndex];
  360. m_Model.view.SetToolAvailable(toolIndex, toolChanged.isAvailable);
  361. if (toolChanged == currentTool && toolChanged.isAvailable == false)
  362. ActivateTool(defaultTool);
  363. }
  364. private void ActivateToolWithUndo(IVisibilityTool tool)
  365. {
  366. if (currentTool != tool && tool.isAvailable)
  367. {
  368. m_Model.BeginUndoOperation(TextContent.visibilityTab);
  369. ActivateTool(tool);
  370. }
  371. }
  372. private void ActivateTool(IVisibilityTool tool)
  373. {
  374. if (tool.isAvailable == false)
  375. return;
  376. if (currentTool != null)
  377. currentTool.Deactivate();
  378. currentTool = tool;
  379. currentTool.Activate();
  380. m_Model.view.SetActiveTab(m_Model.currentToolIndex);
  381. m_Model.view.SetContent(currentTool.view);
  382. }
  383. }
  384. }