No Description
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.

SkinningModuleView.cs 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. using System;
  2. using UnityEditor.U2D.Common;
  3. using UnityEditor.U2D.Layout;
  4. using UnityEngine;
  5. using UnityEditor.ShortcutManagement;
  6. using UnityEngine.UIElements;
  7. namespace UnityEditor.U2D.Animation
  8. {
  9. internal partial class SkinningModule
  10. {
  11. private LayoutOverlay m_LayoutOverlay;
  12. private PoseToolbar m_PoseToolbar;
  13. private BoneToolbar m_BoneToolbar;
  14. private MeshToolbar m_MeshToolbar;
  15. private WeightToolbar m_WeightToolbar;
  16. private RigToolbar m_RigToolbar;
  17. private InternalEditorBridge.ShortcutContext m_ShortcutContext;
  18. private static SkinningModule GetModuleFromContext(ShortcutArguments args)
  19. {
  20. var sc = args.context as InternalEditorBridge.ShortcutContext;
  21. if (sc == null)
  22. return null;
  23. return sc.context as SkinningModule;
  24. }
  25. [Shortcut(ShortcutIds.toggleToolText, typeof(InternalEditorBridge.ShortcutContext), KeyCode.BackQuote, ShortcutModifiers.Shift)]
  26. private static void CollapseToolbar(ShortcutArguments args)
  27. {
  28. var sm = GetModuleFromContext(args);
  29. if (sm != null)
  30. {
  31. SkinningModuleSettings.compactToolBar = !SkinningModuleSettings.compactToolBar;
  32. }
  33. }
  34. [Shortcut(ShortcutIds.restoreBindPose, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Alpha1, ShortcutModifiers.Shift)]
  35. private static void DisablePoseModeKey(ShortcutArguments args)
  36. {
  37. var sm = GetModuleFromContext(args);
  38. if (sm != null && !sm.spriteEditor.editingDisabled)
  39. {
  40. var effectiveSkeleton = sm.skinningCache.GetEffectiveSkeleton(sm.skinningCache.selectedSprite);
  41. if (effectiveSkeleton != null && effectiveSkeleton.isPosePreview)
  42. {
  43. using (sm.skinningCache.UndoScope(TextContent.restorePose))
  44. {
  45. sm.skinningCache.RestoreBindPose();
  46. sm.skinningCache.events.shortcut.Invoke("#1");
  47. }
  48. }
  49. }
  50. }
  51. [Shortcut(ShortcutIds.toggleCharacterMode, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Alpha2, ShortcutModifiers.Shift)]
  52. private static void ToggleCharacterModeKey(ShortcutArguments args)
  53. {
  54. var sm = GetModuleFromContext(args);
  55. if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.hasCharacter)
  56. {
  57. var tool = sm.skinningCache.GetTool(Tools.SwitchMode);
  58. using (sm.skinningCache.UndoScope(TextContent.setMode))
  59. {
  60. if (tool.isActive)
  61. tool.Deactivate();
  62. else
  63. tool.Activate();
  64. }
  65. sm.skinningCache.events.shortcut.Invoke("#2");
  66. }
  67. }
  68. [Shortcut(ShortcutIds.previewPose, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Q, ShortcutModifiers.Shift)]
  69. private static void EditPoseKey(ShortcutArguments args)
  70. {
  71. var sm = GetModuleFromContext(args);
  72. if (sm != null && !sm.spriteEditor.editingDisabled)
  73. {
  74. sm.SetSkeletonTool(Tools.EditPose);
  75. sm.skinningCache.events.shortcut.Invoke("#q");
  76. }
  77. }
  78. [Shortcut(ShortcutIds.editBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.W, ShortcutModifiers.Shift)]
  79. private static void EditJointsKey(ShortcutArguments args)
  80. {
  81. var sm = GetModuleFromContext(args);
  82. if (sm != null && !sm.spriteEditor.editingDisabled)
  83. {
  84. sm.SetSkeletonTool(Tools.EditJoints);
  85. sm.skinningCache.events.shortcut.Invoke("#w");
  86. }
  87. }
  88. [Shortcut(ShortcutIds.createBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.E, ShortcutModifiers.Shift)]
  89. private static void CreateBoneKey(ShortcutArguments args)
  90. {
  91. var sm = GetModuleFromContext(args);
  92. if (sm != null && !sm.spriteEditor.editingDisabled)
  93. {
  94. sm.SetSkeletonTool(Tools.CreateBone);
  95. sm.skinningCache.events.shortcut.Invoke("#e");
  96. }
  97. }
  98. [Shortcut(ShortcutIds.splitBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.R, ShortcutModifiers.Shift)]
  99. private static void SplitBoneKey(ShortcutArguments args)
  100. {
  101. var sm = GetModuleFromContext(args);
  102. if (sm != null && !sm.spriteEditor.editingDisabled)
  103. {
  104. sm.SetSkeletonTool(Tools.SplitBone);
  105. sm.skinningCache.events.shortcut.Invoke("#r");
  106. }
  107. }
  108. [Shortcut(ShortcutIds.autoGeometry, typeof(InternalEditorBridge.ShortcutContext), KeyCode.A, ShortcutModifiers.Shift)]
  109. private static void GenerateGeometryKey(ShortcutArguments args)
  110. {
  111. var sm = GetModuleFromContext(args);
  112. if (sm != null && !sm.spriteEditor.editingDisabled)
  113. {
  114. sm.SetMeshTool(Tools.GenerateGeometry);
  115. sm.skinningCache.events.shortcut.Invoke("#a");
  116. }
  117. }
  118. [Shortcut(ShortcutIds.editGeometry, typeof(InternalEditorBridge.ShortcutContext), KeyCode.S, ShortcutModifiers.Shift)]
  119. private static void MeshSelectionKey(ShortcutArguments args)
  120. {
  121. var sm = GetModuleFromContext(args);
  122. if (sm != null && !sm.spriteEditor.editingDisabled)
  123. {
  124. sm.SetMeshTool(Tools.EditGeometry);
  125. sm.skinningCache.events.shortcut.Invoke("#s");
  126. }
  127. }
  128. [Shortcut(ShortcutIds.createVertex, typeof(InternalEditorBridge.ShortcutContext), KeyCode.J, ShortcutModifiers.Shift)]
  129. private static void CreateVertex(ShortcutArguments args)
  130. {
  131. var sm = GetModuleFromContext(args);
  132. if (sm != null && !sm.spriteEditor.editingDisabled)
  133. {
  134. sm.SetMeshTool(Tools.CreateVertex);
  135. sm.skinningCache.events.shortcut.Invoke("#d");
  136. }
  137. }
  138. [Shortcut(ShortcutIds.createEdge, typeof(InternalEditorBridge.ShortcutContext), KeyCode.G, ShortcutModifiers.Shift)]
  139. private static void CreateEdgeKey(ShortcutArguments args)
  140. {
  141. var sm = GetModuleFromContext(args);
  142. if (sm != null && !sm.spriteEditor.editingDisabled)
  143. {
  144. sm.SetMeshTool(Tools.CreateEdge);
  145. sm.skinningCache.events.shortcut.Invoke("#g");
  146. }
  147. }
  148. [Shortcut(ShortcutIds.splitEdge, typeof(InternalEditorBridge.ShortcutContext), KeyCode.H, ShortcutModifiers.Shift)]
  149. private static void SplitEdge(ShortcutArguments args)
  150. {
  151. var sm = GetModuleFromContext(args);
  152. if (sm != null && !sm.spriteEditor.editingDisabled)
  153. {
  154. sm.SetMeshTool(Tools.SplitEdge);
  155. sm.skinningCache.events.shortcut.Invoke("#h");
  156. }
  157. }
  158. [Shortcut(ShortcutIds.autoWeights, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Z, ShortcutModifiers.Shift)]
  159. private static void GenerateWeightsKey(ShortcutArguments args)
  160. {
  161. var sm = GetModuleFromContext(args);
  162. if (sm != null && !sm.spriteEditor.editingDisabled)
  163. {
  164. sm.SetWeightTool(Tools.GenerateWeights);
  165. sm.skinningCache.events.shortcut.Invoke("#z");
  166. }
  167. }
  168. [Shortcut(ShortcutIds.weightSlider, typeof(InternalEditorBridge.ShortcutContext), KeyCode.X, ShortcutModifiers.Shift)]
  169. private static void WeightSliderKey(ShortcutArguments args)
  170. {
  171. var sm = GetModuleFromContext(args);
  172. if (sm != null && !sm.spriteEditor.editingDisabled)
  173. {
  174. sm.SetWeightTool(Tools.WeightSlider);
  175. sm.skinningCache.events.shortcut.Invoke("#x");
  176. }
  177. }
  178. [Shortcut(ShortcutIds.weightBrush, typeof(InternalEditorBridge.ShortcutContext), KeyCode.N, ShortcutModifiers.Shift)]
  179. private static void WeightBrushKey(ShortcutArguments args)
  180. {
  181. var sm = GetModuleFromContext(args);
  182. if (sm != null && !sm.spriteEditor.editingDisabled)
  183. {
  184. sm.SetWeightTool(Tools.WeightBrush);
  185. sm.skinningCache.events.shortcut.Invoke("#c");
  186. }
  187. }
  188. [Shortcut(ShortcutIds.boneInfluence, typeof(InternalEditorBridge.ShortcutContext), KeyCode.V, ShortcutModifiers.Shift)]
  189. private static void BoneInfluenceKey(ShortcutArguments args)
  190. {
  191. var sm = GetModuleFromContext(args);
  192. if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.mode == SkinningMode.Character)
  193. {
  194. sm.SetWeightTool(Tools.BoneInfluence);
  195. sm.skinningCache.events.shortcut.Invoke("#v");
  196. }
  197. }
  198. [Shortcut(ShortcutIds.spriteInfluence, typeof(InternalEditorBridge.ShortcutContext), KeyCode.M, ShortcutModifiers.Shift)]
  199. private static void SpriteInfluenceKey(ShortcutArguments args)
  200. {
  201. var sm = GetModuleFromContext(args);
  202. if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.mode == SkinningMode.Character)
  203. {
  204. sm.SetWeightTool(Tools.SpriteInfluence);
  205. sm.skinningCache.events.shortcut.Invoke("#m");
  206. }
  207. }
  208. [Shortcut(ShortcutIds.pastePanelWeights, typeof(InternalEditorBridge.ShortcutContext), KeyCode.B, ShortcutModifiers.Shift)]
  209. private static void PastePanelKey(ShortcutArguments args)
  210. {
  211. var sm = GetModuleFromContext(args);
  212. if (sm != null && !sm.spriteEditor.editingDisabled)
  213. {
  214. sm.TogglePasteTool();
  215. sm.skinningCache.events.shortcut.Invoke("#b");
  216. }
  217. }
  218. [Shortcut(ShortcutIds.visibilityPanel, typeof(InternalEditorBridge.ShortcutContext), KeyCode.P, ShortcutModifiers.Shift)]
  219. private static void VisibilityPanelKey(ShortcutArguments args)
  220. {
  221. var sm = GetModuleFromContext(args);
  222. if (sm != null && !sm.spriteEditor.editingDisabled)
  223. {
  224. sm.m_HorizontalToggleTools.ToggleVisibilityTool(sm.currentTool);
  225. sm.skinningCache.events.shortcut.Invoke("#p");
  226. }
  227. }
  228. private void AddMainUI(VisualElement mainView)
  229. {
  230. var visualTree = ResourceLoader.Load<VisualTreeAsset>("LayoutOverlay/LayoutOverlay.uxml");
  231. VisualElement clone = visualTree.CloneTree();
  232. m_LayoutOverlay = clone.Q<LayoutOverlay>("LayoutOverlay");
  233. mainView.Add(m_LayoutOverlay);
  234. m_LayoutOverlay.hasScrollbar = true;
  235. m_LayoutOverlay.verticalToolbar.verticalScrollerVisibility = ScrollerVisibility.Hidden;
  236. m_LayoutOverlay.StretchToParentSize();
  237. CreatePoseToolbar();
  238. CreateBoneToolbar();
  239. CreateMeshToolbar();
  240. CreateWeightToolbar();
  241. CreateRigToolbar();
  242. m_ShortcutContext = new InternalEditorBridge.ShortcutContext()
  243. {
  244. isActive = isFocused,
  245. context = this
  246. };
  247. InternalEditorBridge.RegisterShortcutContext(m_ShortcutContext);
  248. InternalEditorBridge.AddEditorApplicationProjectLoadedCallback(OnProjectLoaded);
  249. }
  250. private void OnProjectLoaded()
  251. {
  252. if (m_ShortcutContext != null)
  253. InternalEditorBridge.RegisterShortcutContext(m_ShortcutContext);
  254. }
  255. private void DoViewGUI()
  256. {
  257. if (spriteEditor.editingDisabled == m_BoneToolbar.enabledSelf)
  258. {
  259. m_BoneToolbar.SetEnabled(!spriteEditor.editingDisabled);
  260. m_MeshToolbar.SetEnabled(!spriteEditor.editingDisabled);
  261. m_WeightToolbar.SetEnabled(!spriteEditor.editingDisabled);
  262. }
  263. if (spriteEditor.editingDisabled == m_LayoutOverlay.rightOverlay.enabledSelf)
  264. {
  265. m_LayoutOverlay.rightOverlay.SetEnabled(!spriteEditor.editingDisabled);
  266. m_LayoutOverlay.rightOverlay.visible = !spriteEditor.editingDisabled;
  267. }
  268. m_PoseToolbar.UpdateResetButtonState();
  269. m_RigToolbar.UpdatePasteButtonEnabledState();
  270. }
  271. private bool isFocused()
  272. {
  273. return spriteEditor != null && (EditorWindow.focusedWindow == spriteEditor as EditorWindow);
  274. }
  275. private void CreatePoseToolbar()
  276. {
  277. m_PoseToolbar = PoseToolbar.GenerateFromUXML();
  278. m_PoseToolbar.skinningCache = skinningCache;
  279. m_LayoutOverlay.verticalToolbar.AddToContainer(m_PoseToolbar);
  280. m_PoseToolbar.ActivateEditPoseTool += ActivateEditPoseTool;
  281. m_PoseToolbar.SetEnabled(!spriteEditor.editingDisabled);
  282. }
  283. private void CreateBoneToolbar()
  284. {
  285. m_BoneToolbar = BoneToolbar.GenerateFromUXML();
  286. m_BoneToolbar.Setup(skinningCache);
  287. m_LayoutOverlay.verticalToolbar.AddToContainer(m_BoneToolbar);
  288. m_BoneToolbar.SetSkeletonTool += SetSkeletonTool;
  289. m_BoneToolbar.SetEnabled(!spriteEditor.editingDisabled);
  290. }
  291. private void CreateMeshToolbar()
  292. {
  293. m_MeshToolbar = MeshToolbar.GenerateFromUXML();
  294. m_MeshToolbar.skinningCache = skinningCache;
  295. m_LayoutOverlay.verticalToolbar.AddToContainer(m_MeshToolbar);
  296. m_MeshToolbar.SetMeshTool += SetMeshTool;
  297. m_MeshToolbar.SetEnabled(!spriteEditor.editingDisabled);
  298. }
  299. private void CreateWeightToolbar()
  300. {
  301. m_WeightToolbar = WeightToolbar.GenerateFromUXML();
  302. m_WeightToolbar.skinningCache = skinningCache;
  303. m_LayoutOverlay.verticalToolbar.AddToContainer(m_WeightToolbar);
  304. m_WeightToolbar.SetWeightTool += SetWeightTool;
  305. m_WeightToolbar.SetEnabled(!spriteEditor.editingDisabled);
  306. }
  307. private void CreateRigToolbar()
  308. {
  309. m_RigToolbar = RigToolbar.GenerateFromUXML();
  310. m_RigToolbar.skinningCache = skinningCache;
  311. m_LayoutOverlay.verticalToolbar.AddToContainer(m_RigToolbar);
  312. m_RigToolbar.ActivateCopyTool += ActivateCopyTool;
  313. m_RigToolbar.TogglePasteTool += TogglePasteTool;
  314. m_RigToolbar.SetEnabled(!spriteEditor.editingDisabled);
  315. }
  316. private void ActivateEditPoseTool()
  317. {
  318. var tool = skinningCache.GetTool(Tools.EditPose);
  319. if (currentTool == tool)
  320. return;
  321. using (skinningCache.UndoScope(TextContent.setTool))
  322. {
  323. ActivateTool(tool);
  324. }
  325. }
  326. private void SetSkeletonTool(Tools toolType)
  327. {
  328. var tool = skinningCache.GetTool(toolType) as SkeletonToolWrapper;
  329. if (currentTool == tool)
  330. return;
  331. using (skinningCache.UndoScope(TextContent.setTool))
  332. {
  333. ActivateTool(tool);
  334. if (tool.editBindPose)
  335. skinningCache.RestoreBindPose();
  336. }
  337. }
  338. private void SetMeshTool(Tools toolType)
  339. {
  340. var tool = skinningCache.GetTool(toolType);
  341. if (currentTool == tool)
  342. return;
  343. using (skinningCache.UndoScope(TextContent.setTool))
  344. {
  345. ActivateTool(tool);
  346. skinningCache.RestoreBindPose();
  347. UnselectBones();
  348. }
  349. }
  350. private void SetWeightTool(Tools toolType)
  351. {
  352. var tool = skinningCache.GetTool(toolType);
  353. if (currentTool == tool)
  354. return;
  355. using (skinningCache.UndoScope(TextContent.setTool))
  356. {
  357. ActivateTool(tool);
  358. }
  359. }
  360. private void ActivateCopyTool()
  361. {
  362. var tool = skinningCache.GetTool(Tools.CopyPaste) as CopyTool;
  363. tool.OnCopyActivated();
  364. }
  365. private void TogglePasteTool()
  366. {
  367. var tool = skinningCache.GetTool(Tools.CopyPaste) as CopyTool;
  368. if (!tool.isActive)
  369. ActivateTool(tool);
  370. else if (previousTool != null)
  371. ActivateTool(previousTool);
  372. }
  373. private void StorePreviousTool()
  374. {
  375. if (currentTool is CopyTool || currentTool is VisibilityTool)
  376. return;
  377. previousTool = currentTool;
  378. }
  379. private void ActivateTool(BaseTool tool)
  380. {
  381. StorePreviousTool();
  382. m_ModuleToolGroup.ActivateTool(tool);
  383. UpdateToggleState();
  384. skinningCache.events.toolChanged.Invoke(tool);
  385. }
  386. private void UnselectBones()
  387. {
  388. skinningCache.skeletonSelection.Clear();
  389. skinningCache.events.boneSelectionChanged.Invoke();
  390. }
  391. private void UpdateToggleState()
  392. {
  393. Debug.Assert(m_PoseToolbar != null);
  394. Debug.Assert(m_BoneToolbar != null);
  395. Debug.Assert(m_MeshToolbar != null);
  396. Debug.Assert(m_WeightToolbar != null);
  397. m_PoseToolbar.UpdatePreviewButtonCheckedState();
  398. m_BoneToolbar.UpdateToggleState();
  399. m_MeshToolbar.UpdateToggleState();
  400. m_WeightToolbar.UpdateToggleState();
  401. m_RigToolbar.UpdatePasteButtonCheckedState();
  402. }
  403. private void RemoveMainUI(VisualElement mainView)
  404. {
  405. InternalEditorBridge.RemoveEditorApplicationProjectLoadedCallback(OnProjectLoaded);
  406. InternalEditorBridge.UnregisterShortcutContext(m_ShortcutContext);
  407. }
  408. }
  409. }