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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  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.characterPivot, typeof(InternalEditorBridge.ShortcutContext), KeyCode.T, ShortcutModifiers.Shift)]
  79. private static void EditCharacterPivotKey(ShortcutArguments args)
  80. {
  81. var sm = GetModuleFromContext(args);
  82. if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.mode == SkinningMode.Character)
  83. {
  84. sm.SetSkeletonTool(Tools.CharacterPivotTool);
  85. sm.skinningCache.events.shortcut.Invoke("#t");
  86. }
  87. }
  88. [Shortcut(ShortcutIds.editBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.W, ShortcutModifiers.Shift)]
  89. private static void EditJointsKey(ShortcutArguments args)
  90. {
  91. var sm = GetModuleFromContext(args);
  92. if (sm != null && !sm.spriteEditor.editingDisabled)
  93. {
  94. sm.SetSkeletonTool(Tools.EditJoints);
  95. sm.skinningCache.events.shortcut.Invoke("#w");
  96. }
  97. }
  98. [Shortcut(ShortcutIds.createBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.E, ShortcutModifiers.Shift)]
  99. private static void CreateBoneKey(ShortcutArguments args)
  100. {
  101. var sm = GetModuleFromContext(args);
  102. if (sm != null && !sm.spriteEditor.editingDisabled)
  103. {
  104. sm.SetSkeletonTool(Tools.CreateBone);
  105. sm.skinningCache.events.shortcut.Invoke("#e");
  106. }
  107. }
  108. [Shortcut(ShortcutIds.splitBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.R, ShortcutModifiers.Shift)]
  109. private static void SplitBoneKey(ShortcutArguments args)
  110. {
  111. var sm = GetModuleFromContext(args);
  112. if (sm != null && !sm.spriteEditor.editingDisabled)
  113. {
  114. sm.SetSkeletonTool(Tools.SplitBone);
  115. sm.skinningCache.events.shortcut.Invoke("#r");
  116. }
  117. }
  118. [Shortcut(ShortcutIds.autoGeometry, typeof(InternalEditorBridge.ShortcutContext), KeyCode.A, ShortcutModifiers.Shift)]
  119. private static void GenerateGeometryKey(ShortcutArguments args)
  120. {
  121. var sm = GetModuleFromContext(args);
  122. if (sm != null && !sm.spriteEditor.editingDisabled)
  123. {
  124. sm.SetMeshTool(Tools.GenerateGeometry);
  125. sm.skinningCache.events.shortcut.Invoke("#a");
  126. }
  127. }
  128. [Shortcut(ShortcutIds.editGeometry, typeof(InternalEditorBridge.ShortcutContext), KeyCode.S, ShortcutModifiers.Shift)]
  129. private static void MeshSelectionKey(ShortcutArguments args)
  130. {
  131. var sm = GetModuleFromContext(args);
  132. if (sm != null && !sm.spriteEditor.editingDisabled)
  133. {
  134. sm.SetMeshTool(Tools.EditGeometry);
  135. sm.skinningCache.events.shortcut.Invoke("#s");
  136. }
  137. }
  138. [Shortcut(ShortcutIds.createVertex, typeof(InternalEditorBridge.ShortcutContext), KeyCode.J, ShortcutModifiers.Shift)]
  139. private static void CreateVertex(ShortcutArguments args)
  140. {
  141. var sm = GetModuleFromContext(args);
  142. if (sm != null && !sm.spriteEditor.editingDisabled)
  143. {
  144. sm.SetMeshTool(Tools.CreateVertex);
  145. sm.skinningCache.events.shortcut.Invoke("#d");
  146. }
  147. }
  148. [Shortcut(ShortcutIds.createEdge, typeof(InternalEditorBridge.ShortcutContext), KeyCode.G, ShortcutModifiers.Shift)]
  149. private static void CreateEdgeKey(ShortcutArguments args)
  150. {
  151. var sm = GetModuleFromContext(args);
  152. if (sm != null && !sm.spriteEditor.editingDisabled)
  153. {
  154. sm.SetMeshTool(Tools.CreateEdge);
  155. sm.skinningCache.events.shortcut.Invoke("#g");
  156. }
  157. }
  158. [Shortcut(ShortcutIds.splitEdge, typeof(InternalEditorBridge.ShortcutContext), KeyCode.H, ShortcutModifiers.Shift)]
  159. private static void SplitEdge(ShortcutArguments args)
  160. {
  161. var sm = GetModuleFromContext(args);
  162. if (sm != null && !sm.spriteEditor.editingDisabled)
  163. {
  164. sm.SetMeshTool(Tools.SplitEdge);
  165. sm.skinningCache.events.shortcut.Invoke("#h");
  166. }
  167. }
  168. [Shortcut(ShortcutIds.autoWeights, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Z, ShortcutModifiers.Shift)]
  169. private static void GenerateWeightsKey(ShortcutArguments args)
  170. {
  171. var sm = GetModuleFromContext(args);
  172. if (sm != null && !sm.spriteEditor.editingDisabled)
  173. {
  174. sm.SetWeightTool(Tools.GenerateWeights);
  175. sm.skinningCache.events.shortcut.Invoke("#z");
  176. }
  177. }
  178. [Shortcut(ShortcutIds.weightSlider, typeof(InternalEditorBridge.ShortcutContext), KeyCode.X, ShortcutModifiers.Shift)]
  179. private static void WeightSliderKey(ShortcutArguments args)
  180. {
  181. var sm = GetModuleFromContext(args);
  182. if (sm != null && !sm.spriteEditor.editingDisabled)
  183. {
  184. sm.SetWeightTool(Tools.WeightSlider);
  185. sm.skinningCache.events.shortcut.Invoke("#x");
  186. }
  187. }
  188. [Shortcut(ShortcutIds.weightBrush, typeof(InternalEditorBridge.ShortcutContext), KeyCode.N, ShortcutModifiers.Shift)]
  189. private static void WeightBrushKey(ShortcutArguments args)
  190. {
  191. var sm = GetModuleFromContext(args);
  192. if (sm != null && !sm.spriteEditor.editingDisabled)
  193. {
  194. sm.SetWeightTool(Tools.WeightBrush);
  195. sm.skinningCache.events.shortcut.Invoke("#c");
  196. }
  197. }
  198. [Shortcut(ShortcutIds.boneInfluence, typeof(InternalEditorBridge.ShortcutContext), KeyCode.V, ShortcutModifiers.Shift)]
  199. private static void BoneInfluenceKey(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.BoneInfluence);
  205. sm.skinningCache.events.shortcut.Invoke("#v");
  206. }
  207. }
  208. [Shortcut(ShortcutIds.spriteInfluence, typeof(InternalEditorBridge.ShortcutContext), KeyCode.M, ShortcutModifiers.Shift)]
  209. private static void SpriteInfluenceKey(ShortcutArguments args)
  210. {
  211. var sm = GetModuleFromContext(args);
  212. if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.mode == SkinningMode.Character)
  213. {
  214. sm.SetWeightTool(Tools.SpriteInfluence);
  215. sm.skinningCache.events.shortcut.Invoke("#m");
  216. }
  217. }
  218. [Shortcut(ShortcutIds.pastePanelWeights, typeof(InternalEditorBridge.ShortcutContext), KeyCode.B, ShortcutModifiers.Shift)]
  219. private static void PastePanelKey(ShortcutArguments args)
  220. {
  221. var sm = GetModuleFromContext(args);
  222. if (sm != null && !sm.spriteEditor.editingDisabled)
  223. {
  224. sm.TogglePasteTool();
  225. sm.skinningCache.events.shortcut.Invoke("#b");
  226. }
  227. }
  228. [Shortcut(ShortcutIds.visibilityPanel, typeof(InternalEditorBridge.ShortcutContext), KeyCode.P, ShortcutModifiers.Shift)]
  229. private static void VisibilityPanelKey(ShortcutArguments args)
  230. {
  231. var sm = GetModuleFromContext(args);
  232. if (sm != null && !sm.spriteEditor.editingDisabled)
  233. {
  234. sm.m_HorizontalToggleTools.ToggleVisibilityTool(sm.currentTool);
  235. sm.skinningCache.events.shortcut.Invoke("#p");
  236. }
  237. }
  238. private void AddMainUI(VisualElement mainView)
  239. {
  240. var visualTree = ResourceLoader.Load<VisualTreeAsset>("LayoutOverlay/LayoutOverlay.uxml");
  241. VisualElement clone = visualTree.CloneTree();
  242. m_LayoutOverlay = clone.Q<LayoutOverlay>("LayoutOverlay");
  243. mainView.Add(m_LayoutOverlay);
  244. m_LayoutOverlay.hasScrollbar = true;
  245. m_LayoutOverlay.verticalToolbar.verticalScrollerVisibility = ScrollerVisibility.Hidden;
  246. m_LayoutOverlay.StretchToParentSize();
  247. CreatePoseToolbar();
  248. CreateBoneToolbar();
  249. CreateMeshToolbar();
  250. CreateWeightToolbar();
  251. CreateRigToolbar();
  252. m_ShortcutContext = new InternalEditorBridge.ShortcutContext()
  253. {
  254. isActive = isFocused,
  255. context = this
  256. };
  257. InternalEditorBridge.RegisterShortcutContext(m_ShortcutContext);
  258. InternalEditorBridge.AddEditorApplicationProjectLoadedCallback(OnProjectLoaded);
  259. }
  260. private void OnProjectLoaded()
  261. {
  262. if (m_ShortcutContext != null)
  263. InternalEditorBridge.RegisterShortcutContext(m_ShortcutContext);
  264. }
  265. private void DoViewGUI()
  266. {
  267. if (spriteEditor.editingDisabled == m_BoneToolbar.enabledSelf)
  268. {
  269. m_BoneToolbar.SetEnabled(!spriteEditor.editingDisabled);
  270. m_MeshToolbar.SetEnabled(!spriteEditor.editingDisabled);
  271. m_WeightToolbar.SetEnabled(!spriteEditor.editingDisabled);
  272. }
  273. if (spriteEditor.editingDisabled == m_LayoutOverlay.rightOverlay.enabledSelf)
  274. {
  275. m_LayoutOverlay.rightOverlay.SetEnabled(!spriteEditor.editingDisabled);
  276. m_LayoutOverlay.rightOverlay.visible = !spriteEditor.editingDisabled;
  277. }
  278. m_PoseToolbar.UpdateResetButtonState();
  279. m_RigToolbar.UpdatePasteButtonEnabledState();
  280. }
  281. private bool isFocused()
  282. {
  283. return spriteEditor != null && (EditorWindow.focusedWindow == spriteEditor as EditorWindow);
  284. }
  285. private void CreatePoseToolbar()
  286. {
  287. m_PoseToolbar = PoseToolbar.GenerateFromUXML();
  288. m_PoseToolbar.Setup(skinningCache);
  289. m_LayoutOverlay.verticalToolbar.AddToContainer(m_PoseToolbar);
  290. m_PoseToolbar.SetMeshTool += SetMeshTool;
  291. m_PoseToolbar.SetSkeletonTool += SetSkeletonTool;
  292. m_PoseToolbar.ActivateEditPoseTool += ActivateEditPoseTool;
  293. m_PoseToolbar.SetEnabled(!spriteEditor.editingDisabled);
  294. }
  295. private void CreateBoneToolbar()
  296. {
  297. m_BoneToolbar = BoneToolbar.GenerateFromUXML();
  298. m_BoneToolbar.Setup(skinningCache);
  299. m_LayoutOverlay.verticalToolbar.AddToContainer(m_BoneToolbar);
  300. m_BoneToolbar.SetSkeletonTool += SetSkeletonTool;
  301. m_BoneToolbar.SetEnabled(!spriteEditor.editingDisabled);
  302. }
  303. private void CreateMeshToolbar()
  304. {
  305. m_MeshToolbar = MeshToolbar.GenerateFromUXML();
  306. m_MeshToolbar.skinningCache = skinningCache;
  307. m_LayoutOverlay.verticalToolbar.AddToContainer(m_MeshToolbar);
  308. m_MeshToolbar.SetMeshTool += SetMeshTool;
  309. m_MeshToolbar.SetEnabled(!spriteEditor.editingDisabled);
  310. }
  311. private void CreateWeightToolbar()
  312. {
  313. m_WeightToolbar = WeightToolbar.GenerateFromUXML();
  314. m_WeightToolbar.skinningCache = skinningCache;
  315. m_LayoutOverlay.verticalToolbar.AddToContainer(m_WeightToolbar);
  316. m_WeightToolbar.SetWeightTool += SetWeightTool;
  317. m_WeightToolbar.SetEnabled(!spriteEditor.editingDisabled);
  318. }
  319. private void CreateRigToolbar()
  320. {
  321. m_RigToolbar = RigToolbar.GenerateFromUXML();
  322. m_RigToolbar.skinningCache = skinningCache;
  323. m_LayoutOverlay.verticalToolbar.AddToContainer(m_RigToolbar);
  324. m_RigToolbar.ActivateCopyTool += ActivateCopyTool;
  325. m_RigToolbar.TogglePasteTool += TogglePasteTool;
  326. m_RigToolbar.SetEnabled(!spriteEditor.editingDisabled);
  327. }
  328. private void ActivateEditPoseTool()
  329. {
  330. var tool = skinningCache.GetTool(Tools.EditPose);
  331. if (currentTool == tool)
  332. return;
  333. using (skinningCache.UndoScope(TextContent.setTool))
  334. {
  335. ActivateTool(tool);
  336. }
  337. }
  338. private void SetSkeletonTool(Tools toolType)
  339. {
  340. var tool = skinningCache.GetTool(toolType) as SkeletonToolWrapper;
  341. if (currentTool == tool)
  342. return;
  343. using (skinningCache.UndoScope(TextContent.setTool))
  344. {
  345. ActivateTool(tool);
  346. if (tool.editBindPose)
  347. skinningCache.RestoreBindPose();
  348. }
  349. }
  350. private void SetMeshTool(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. skinningCache.RestoreBindPose();
  359. UnselectBones();
  360. }
  361. }
  362. private void SetWeightTool(Tools toolType)
  363. {
  364. var tool = skinningCache.GetTool(toolType);
  365. if (currentTool == tool)
  366. return;
  367. using (skinningCache.UndoScope(TextContent.setTool))
  368. {
  369. ActivateTool(tool);
  370. }
  371. }
  372. private void ActivateCopyTool()
  373. {
  374. var tool = skinningCache.GetTool(Tools.CopyPaste) as CopyTool;
  375. tool.OnCopyActivated();
  376. }
  377. private void TogglePasteTool()
  378. {
  379. var tool = skinningCache.GetTool(Tools.CopyPaste) as CopyTool;
  380. if (!tool.isActive)
  381. ActivateTool(tool);
  382. else if (previousTool != null)
  383. ActivateTool(previousTool);
  384. }
  385. private void StorePreviousTool()
  386. {
  387. if (currentTool is CopyTool || currentTool is VisibilityTool)
  388. return;
  389. previousTool = currentTool;
  390. }
  391. private void ActivateTool(BaseTool tool)
  392. {
  393. StorePreviousTool();
  394. m_ModuleToolGroup.ActivateTool(tool);
  395. UpdateToggleState();
  396. skinningCache.events.toolChanged.Invoke(tool);
  397. }
  398. private void UnselectBones()
  399. {
  400. skinningCache.skeletonSelection.Clear();
  401. skinningCache.events.boneSelectionChanged.Invoke();
  402. }
  403. private void UpdateToggleState()
  404. {
  405. Debug.Assert(m_PoseToolbar != null);
  406. Debug.Assert(m_BoneToolbar != null);
  407. Debug.Assert(m_MeshToolbar != null);
  408. Debug.Assert(m_WeightToolbar != null);
  409. m_PoseToolbar.UpdateToggleState();
  410. m_BoneToolbar.UpdateToggleState();
  411. m_MeshToolbar.UpdateToggleState();
  412. m_WeightToolbar.UpdateToggleState();
  413. m_RigToolbar.UpdatePasteButtonCheckedState();
  414. }
  415. private void RemoveMainUI(VisualElement mainView)
  416. {
  417. InternalEditorBridge.RemoveEditorApplicationProjectLoadedCallback(OnProjectLoaded);
  418. InternalEditorBridge.UnregisterShortcutContext(m_ShortcutContext);
  419. }
  420. }
  421. }