Singularity/Library/PackageCache/com.unity.2d.animation@7.0.10/Editor/SkinningModule/SkinningModuleView.cs

475 lines
18 KiB
C#
Raw Normal View History

2024-05-06 14:45:45 -04:00
using System;
using UnityEditor.U2D.Common;
using UnityEditor.U2D.Layout;
using UnityEngine;
using UnityEditor.ShortcutManagement;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal partial class SkinningModule
{
private LayoutOverlay m_LayoutOverlay;
private PoseToolbar m_PoseToolbar;
private BoneToolbar m_BoneToolbar;
private MeshToolbar m_MeshToolbar;
private WeightToolbar m_WeightToolbar;
private RigToolbar m_RigToolbar;
private InternalEditorBridge.ShortcutContext m_ShortcutContext;
private static SkinningModule GetModuleFromContext(ShortcutArguments args)
{
var sc = args.context as InternalEditorBridge.ShortcutContext;
if (sc == null)
return null;
return sc.context as SkinningModule;
}
[Shortcut(ShortcutIds.toggleToolText, typeof(InternalEditorBridge.ShortcutContext), KeyCode.BackQuote, ShortcutModifiers.Shift)]
private static void CollapseToolbar(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null)
{
SkinningModuleSettings.compactToolBar = !SkinningModuleSettings.compactToolBar;
}
}
[Shortcut(ShortcutIds.restoreBindPose, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Alpha1, ShortcutModifiers.Shift)]
private static void DisablePoseModeKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
var effectiveSkeleton = sm.skinningCache.GetEffectiveSkeleton(sm.skinningCache.selectedSprite);
if (effectiveSkeleton != null && effectiveSkeleton.isPosePreview)
{
using (sm.skinningCache.UndoScope(TextContent.restorePose))
{
sm.skinningCache.RestoreBindPose();
sm.skinningCache.events.shortcut.Invoke("#1");
}
}
}
}
[Shortcut(ShortcutIds.toggleCharacterMode, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Alpha2, ShortcutModifiers.Shift)]
private static void ToggleCharacterModeKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.hasCharacter)
{
var tool = sm.skinningCache.GetTool(Tools.SwitchMode);
using (sm.skinningCache.UndoScope(TextContent.setMode))
{
if (tool.isActive)
tool.Deactivate();
else
tool.Activate();
}
sm.skinningCache.events.shortcut.Invoke("#2");
}
}
[Shortcut(ShortcutIds.previewPose, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Q, ShortcutModifiers.Shift)]
private static void EditPoseKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetSkeletonTool(Tools.EditPose);
sm.skinningCache.events.shortcut.Invoke("#q");
}
}
[Shortcut(ShortcutIds.editBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.W, ShortcutModifiers.Shift)]
private static void EditJointsKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetSkeletonTool(Tools.EditJoints);
sm.skinningCache.events.shortcut.Invoke("#w");
}
}
[Shortcut(ShortcutIds.createBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.E, ShortcutModifiers.Shift)]
private static void CreateBoneKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetSkeletonTool(Tools.CreateBone);
sm.skinningCache.events.shortcut.Invoke("#e");
}
}
[Shortcut(ShortcutIds.splitBone, typeof(InternalEditorBridge.ShortcutContext), KeyCode.R, ShortcutModifiers.Shift)]
private static void SplitBoneKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetSkeletonTool(Tools.SplitBone);
sm.skinningCache.events.shortcut.Invoke("#r");
}
}
[Shortcut(ShortcutIds.autoGeometry, typeof(InternalEditorBridge.ShortcutContext), KeyCode.A, ShortcutModifiers.Shift)]
private static void GenerateGeometryKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetMeshTool(Tools.GenerateGeometry);
sm.skinningCache.events.shortcut.Invoke("#a");
}
}
[Shortcut(ShortcutIds.editGeometry, typeof(InternalEditorBridge.ShortcutContext), KeyCode.S, ShortcutModifiers.Shift)]
private static void MeshSelectionKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetMeshTool(Tools.EditGeometry);
sm.skinningCache.events.shortcut.Invoke("#s");
}
}
[Shortcut(ShortcutIds.createVertex, typeof(InternalEditorBridge.ShortcutContext), KeyCode.J, ShortcutModifiers.Shift)]
private static void CreateVertex(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetMeshTool(Tools.CreateVertex);
sm.skinningCache.events.shortcut.Invoke("#d");
}
}
[Shortcut(ShortcutIds.createEdge, typeof(InternalEditorBridge.ShortcutContext), KeyCode.G, ShortcutModifiers.Shift)]
private static void CreateEdgeKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetMeshTool(Tools.CreateEdge);
sm.skinningCache.events.shortcut.Invoke("#g");
}
}
[Shortcut(ShortcutIds.splitEdge, typeof(InternalEditorBridge.ShortcutContext), KeyCode.H, ShortcutModifiers.Shift)]
private static void SplitEdge(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetMeshTool(Tools.SplitEdge);
sm.skinningCache.events.shortcut.Invoke("#h");
}
}
[Shortcut(ShortcutIds.autoWeights, typeof(InternalEditorBridge.ShortcutContext), KeyCode.Z, ShortcutModifiers.Shift)]
private static void GenerateWeightsKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetWeightTool(Tools.GenerateWeights);
sm.skinningCache.events.shortcut.Invoke("#z");
}
}
[Shortcut(ShortcutIds.weightSlider, typeof(InternalEditorBridge.ShortcutContext), KeyCode.X, ShortcutModifiers.Shift)]
private static void WeightSliderKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetWeightTool(Tools.WeightSlider);
sm.skinningCache.events.shortcut.Invoke("#x");
}
}
[Shortcut(ShortcutIds.weightBrush, typeof(InternalEditorBridge.ShortcutContext), KeyCode.N, ShortcutModifiers.Shift)]
private static void WeightBrushKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.SetWeightTool(Tools.WeightBrush);
sm.skinningCache.events.shortcut.Invoke("#c");
}
}
[Shortcut(ShortcutIds.boneInfluence, typeof(InternalEditorBridge.ShortcutContext), KeyCode.V, ShortcutModifiers.Shift)]
private static void BoneInfluenceKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.mode == SkinningMode.Character)
{
sm.SetWeightTool(Tools.BoneInfluence);
sm.skinningCache.events.shortcut.Invoke("#v");
}
}
[Shortcut(ShortcutIds.spriteInfluence, typeof(InternalEditorBridge.ShortcutContext), KeyCode.M, ShortcutModifiers.Shift)]
private static void SpriteInfluenceKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled && sm.skinningCache.mode == SkinningMode.Character)
{
sm.SetWeightTool(Tools.SpriteInfluence);
sm.skinningCache.events.shortcut.Invoke("#m");
}
}
[Shortcut(ShortcutIds.pastePanelWeights, typeof(InternalEditorBridge.ShortcutContext), KeyCode.B, ShortcutModifiers.Shift)]
private static void PastePanelKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.TogglePasteTool();
sm.skinningCache.events.shortcut.Invoke("#b");
}
}
[Shortcut(ShortcutIds.visibilityPanel, typeof(InternalEditorBridge.ShortcutContext), KeyCode.P, ShortcutModifiers.Shift)]
private static void VisibilityPanelKey(ShortcutArguments args)
{
var sm = GetModuleFromContext(args);
if (sm != null && !sm.spriteEditor.editingDisabled)
{
sm.m_HorizontalToggleTools.ToggleVisibilityTool(sm.currentTool);
sm.skinningCache.events.shortcut.Invoke("#p");
}
}
private void AddMainUI(VisualElement mainView)
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("LayoutOverlay/LayoutOverlay.uxml");
VisualElement clone = visualTree.CloneTree();
m_LayoutOverlay = clone.Q<LayoutOverlay>("LayoutOverlay");
mainView.Add(m_LayoutOverlay);
m_LayoutOverlay.hasScrollbar = true;
m_LayoutOverlay.verticalToolbar.verticalScrollerVisibility = ScrollerVisibility.Hidden;
m_LayoutOverlay.StretchToParentSize();
CreatePoseToolbar();
CreateBoneToolbar();
CreateMeshToolbar();
CreateWeightToolbar();
CreateRigToolbar();
m_ShortcutContext = new InternalEditorBridge.ShortcutContext()
{
isActive = isFocused,
context = this
};
InternalEditorBridge.RegisterShortcutContext(m_ShortcutContext);
InternalEditorBridge.AddEditorApplicationProjectLoadedCallback(OnProjectLoaded);
}
private void OnProjectLoaded()
{
if (m_ShortcutContext != null)
InternalEditorBridge.RegisterShortcutContext(m_ShortcutContext);
}
private void DoViewGUI()
{
if (spriteEditor.editingDisabled == m_BoneToolbar.enabledSelf)
{
m_BoneToolbar.SetEnabled(!spriteEditor.editingDisabled);
m_MeshToolbar.SetEnabled(!spriteEditor.editingDisabled);
m_WeightToolbar.SetEnabled(!spriteEditor.editingDisabled);
}
if (spriteEditor.editingDisabled == m_LayoutOverlay.rightOverlay.enabledSelf)
{
m_LayoutOverlay.rightOverlay.SetEnabled(!spriteEditor.editingDisabled);
m_LayoutOverlay.rightOverlay.visible = !spriteEditor.editingDisabled;
}
m_PoseToolbar.UpdateResetButtonState();
m_RigToolbar.UpdatePasteButtonEnabledState();
}
private bool isFocused()
{
return spriteEditor != null && (EditorWindow.focusedWindow == spriteEditor as EditorWindow);
}
private void CreatePoseToolbar()
{
m_PoseToolbar = PoseToolbar.GenerateFromUXML();
m_PoseToolbar.skinningCache = skinningCache;
m_LayoutOverlay.verticalToolbar.AddToContainer(m_PoseToolbar);
m_PoseToolbar.ActivateEditPoseTool += ActivateEditPoseTool;
m_PoseToolbar.SetEnabled(!spriteEditor.editingDisabled);
}
private void CreateBoneToolbar()
{
m_BoneToolbar = BoneToolbar.GenerateFromUXML();
m_BoneToolbar.Setup(skinningCache);
m_LayoutOverlay.verticalToolbar.AddToContainer(m_BoneToolbar);
m_BoneToolbar.SetSkeletonTool += SetSkeletonTool;
m_BoneToolbar.SetEnabled(!spriteEditor.editingDisabled);
}
private void CreateMeshToolbar()
{
m_MeshToolbar = MeshToolbar.GenerateFromUXML();
m_MeshToolbar.skinningCache = skinningCache;
m_LayoutOverlay.verticalToolbar.AddToContainer(m_MeshToolbar);
m_MeshToolbar.SetMeshTool += SetMeshTool;
m_MeshToolbar.SetEnabled(!spriteEditor.editingDisabled);
}
private void CreateWeightToolbar()
{
m_WeightToolbar = WeightToolbar.GenerateFromUXML();
m_WeightToolbar.skinningCache = skinningCache;
m_LayoutOverlay.verticalToolbar.AddToContainer(m_WeightToolbar);
m_WeightToolbar.SetWeightTool += SetWeightTool;
m_WeightToolbar.SetEnabled(!spriteEditor.editingDisabled);
}
private void CreateRigToolbar()
{
m_RigToolbar = RigToolbar.GenerateFromUXML();
m_RigToolbar.skinningCache = skinningCache;
m_LayoutOverlay.verticalToolbar.AddToContainer(m_RigToolbar);
m_RigToolbar.ActivateCopyTool += ActivateCopyTool;
m_RigToolbar.TogglePasteTool += TogglePasteTool;
m_RigToolbar.SetEnabled(!spriteEditor.editingDisabled);
}
private void ActivateEditPoseTool()
{
var tool = skinningCache.GetTool(Tools.EditPose);
if (currentTool == tool)
return;
using (skinningCache.UndoScope(TextContent.setTool))
{
ActivateTool(tool);
}
}
private void SetSkeletonTool(Tools toolType)
{
var tool = skinningCache.GetTool(toolType) as SkeletonToolWrapper;
if (currentTool == tool)
return;
using (skinningCache.UndoScope(TextContent.setTool))
{
ActivateTool(tool);
if (tool.editBindPose)
skinningCache.RestoreBindPose();
}
}
private void SetMeshTool(Tools toolType)
{
var tool = skinningCache.GetTool(toolType);
if (currentTool == tool)
return;
using (skinningCache.UndoScope(TextContent.setTool))
{
ActivateTool(tool);
skinningCache.RestoreBindPose();
UnselectBones();
}
}
private void SetWeightTool(Tools toolType)
{
var tool = skinningCache.GetTool(toolType);
if (currentTool == tool)
return;
using (skinningCache.UndoScope(TextContent.setTool))
{
ActivateTool(tool);
}
}
private void ActivateCopyTool()
{
var tool = skinningCache.GetTool(Tools.CopyPaste) as CopyTool;
tool.OnCopyActivated();
}
private void TogglePasteTool()
{
var tool = skinningCache.GetTool(Tools.CopyPaste) as CopyTool;
if (!tool.isActive)
ActivateTool(tool);
else if (previousTool != null)
ActivateTool(previousTool);
}
private void StorePreviousTool()
{
if (currentTool is CopyTool || currentTool is VisibilityTool)
return;
previousTool = currentTool;
}
private void ActivateTool(BaseTool tool)
{
StorePreviousTool();
m_ModuleToolGroup.ActivateTool(tool);
UpdateToggleState();
skinningCache.events.toolChanged.Invoke(tool);
}
private void UnselectBones()
{
skinningCache.skeletonSelection.Clear();
skinningCache.events.boneSelectionChanged.Invoke();
}
private void UpdateToggleState()
{
Debug.Assert(m_PoseToolbar != null);
Debug.Assert(m_BoneToolbar != null);
Debug.Assert(m_MeshToolbar != null);
Debug.Assert(m_WeightToolbar != null);
m_PoseToolbar.UpdatePreviewButtonCheckedState();
m_BoneToolbar.UpdateToggleState();
m_MeshToolbar.UpdateToggleState();
m_WeightToolbar.UpdateToggleState();
m_RigToolbar.UpdatePasteButtonCheckedState();
}
private void RemoveMainUI(VisualElement mainView)
{
InternalEditorBridge.RemoveEditorApplicationProjectLoadedCallback(OnProjectLoaded);
InternalEditorBridge.UnregisterShortcutContext(m_ShortcutContext);
}
}
}