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