395 lines
15 KiB
C#
395 lines
15 KiB
C#
|
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 BoneToolbar m_BoneToolbar;
|
||
|
private MeshToolbar m_MeshToolbar;
|
||
|
private WeightToolbar m_WeightToolbar;
|
||
|
|
||
|
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("2D/Animation/Toggle Tool Text", 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("2D/Animation/Restore Bind Pose", 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("2D/Animation/Toggle Character Mode", 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("2D/Animation/Preview Pose", 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("2D/Animation/Edit Bone", 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("2D/Animation/Create Bone", 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("2D/Animation/Split Bone", 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("2D/Animation/Auto Geometry", 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("2D/Animation/Edit Geometry", 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("2D/Animation/Create Vertex", 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("2D/Animation/Create Edge", 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("2D/Animation/Split Edge", 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("2D/Animation/Auto Weights", 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("2D/Animation/Weight Slider", 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("2D/Animation/Weight Brush", 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("2D/Animation/Bone Influence", 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("2D/Animation/Paste Panel Weights", typeof(InternalEditorBridge.ShortcutContext), KeyCode.B, ShortcutModifiers.Shift)]
|
||
|
private static void PastePanelKey(ShortcutArguments args)
|
||
|
{
|
||
|
var sm = GetModuleFromContext(args);
|
||
|
if (sm != null && !sm.spriteEditor.editingDisabled)
|
||
|
{
|
||
|
sm.m_HorizontalToggleTools.TogglePasteTool(sm.currentTool);
|
||
|
sm.skinningCache.events.shortcut.Invoke("#b");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Shortcut("2D/Animation/Visibility Panel", 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.StretchToParentSize();
|
||
|
|
||
|
CreateBoneToolbar();
|
||
|
CreateMeshToolbar();
|
||
|
CreateWeightToolbar();
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private bool isFocused()
|
||
|
{
|
||
|
return spriteEditor != null && (EditorWindow.focusedWindow == spriteEditor as EditorWindow);
|
||
|
}
|
||
|
|
||
|
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 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 ActivateTool(BaseTool tool)
|
||
|
{
|
||
|
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_BoneToolbar != null);
|
||
|
Debug.Assert(m_MeshToolbar != null);
|
||
|
Debug.Assert(m_WeightToolbar != null);
|
||
|
|
||
|
m_BoneToolbar.UpdateToggleState();
|
||
|
m_MeshToolbar.UpdateToggleState();
|
||
|
m_WeightToolbar.UpdateToggleState();
|
||
|
}
|
||
|
|
||
|
private void RemoveMainUI(VisualElement mainView)
|
||
|
{
|
||
|
InternalEditorBridge.RemoveEditorApplicationProjectLoadedCallback(OnProjectLoaded);
|
||
|
InternalEditorBridge.UnregisterShortcutContext(m_ShortcutContext);
|
||
|
}
|
||
|
}
|
||
|
}
|