Initial commit

This commit is contained in:
AbstractConcept 2022-09-13 00:36:34 -05:00
commit 3c7cc0c973
8391 changed files with 704313 additions and 0 deletions

View file

@ -0,0 +1,72 @@
using System;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class BoneInspectorPanel : VisualElement
{
public class BoneInspectorPanelFactory : UxmlFactory<BoneInspectorPanel, BoneInspectorPanelUxmlTraits> {}
public class BoneInspectorPanelUxmlTraits : UxmlTraits {}
public event Action<BoneCache, int> onBoneDepthChanged = (bone, depth) => {};
public event Action<BoneCache, string> onBoneNameChanged = (bone, name) => {};
private TextField m_BoneNameField;
private IntegerField m_BoneDepthField;
public string boneName
{
get { return m_BoneNameField.value; }
set { m_BoneNameField.value = value; }
}
public BoneCache target { get; set; }
public int boneDepth
{
get { return m_BoneDepthField.value; }
set { m_BoneDepthField.value = value; }
}
public BoneInspectorPanel()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/BoneInspectorPanelStyle.uss"));
RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
}
public void BindElements()
{
m_BoneNameField = this.Q<TextField>("BoneNameField");
m_BoneDepthField = this.Q<IntegerField>("BoneDepthField");
m_BoneNameField.RegisterCallback<FocusOutEvent>(BoneNameFocusChanged);
m_BoneDepthField.RegisterCallback<FocusOutEvent>(BoneDepthFocusChanged);
}
private void BoneNameFocusChanged(FocusOutEvent evt)
{
onBoneNameChanged(target, boneName);
}
private void BoneDepthFocusChanged(FocusOutEvent evt)
{
onBoneDepthChanged(target, boneDepth);
}
public void HidePanel()
{
// We are hidding the panel, sent any unchanged value
this.SetHiddenFromLayout(true);
onBoneNameChanged(target, boneName);
onBoneDepthChanged(target, boneDepth);
}
public static BoneInspectorPanel GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/BoneInspectorPanel.uxml");
var clone = visualTree.CloneTree().Q<BoneInspectorPanel>("BoneInspectorPanel");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 68e86a17b9682ee4a81c0bd5627704a1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,91 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class BoneToolbar : Toolbar
{
public class BoneToolbarFactory : UxmlFactory<BoneToolbar, BoneToolbarUxmlTraits> {}
public class BoneToolbarUxmlTraits : UxmlTraits {}
public event Action<Tools> SetSkeletonTool = (mode) => {};
public SkinningCache skinningCache { get; private set; }
public BoneToolbar()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/BoneToolbarStyle.uss"));
}
public void BindElements()
{
var editPose = this.Q<Button>("EditPose");
editPose.clickable.clicked += () => { SetSkeletonTool(Tools.EditPose); };
var editJoints = this.Q<Button>("EditJoints");
editJoints.clickable.clicked += () => { SetSkeletonTool(Tools.EditJoints); };
var createBone = this.Q<Button>("CreateBone");
createBone.clickable.clicked += () => { SetSkeletonTool(Tools.CreateBone); };
var splitBone = this.Q<Button>("SplitBone");
splitBone.clickable.clicked += () => { SetSkeletonTool(Tools.SplitBone); };
}
public void Setup(SkinningCache s)
{
skinningCache = s;
skinningCache.events.skinningModeChanged.AddListener(OnSkinningModeChange);
}
private void OnSkinningModeChange(SkinningMode mode)
{
if (skinningCache.hasCharacter)
{
if (mode == SkinningMode.SpriteSheet)
{
this.Q<Button>("EditJoints").SetEnabled(false);
this.Q<Button>("CreateBone").SetEnabled(false);
this.Q<Button>("SplitBone").SetEnabled(false);
if (skinningCache.GetTool(Tools.EditJoints).isActive
|| skinningCache.GetTool(Tools.CreateBone).isActive
|| skinningCache.GetTool(Tools.SplitBone).isActive)
SetSkeletonTool(Tools.EditPose);
}
else if (mode == SkinningMode.Character)
{
this.Q<Button>("EditJoints").SetEnabled(true);
this.Q<Button>("CreateBone").SetEnabled(true);
this.Q<Button>("SplitBone").SetEnabled(true);
}
}
}
public void UpdateToggleState()
{
//TODO: Make UI not be aware of BaseTool, Cache, etc. Use Tool enum
var toolButton = this.Q<Button>("EditPose");
SetButtonChecked(toolButton, skinningCache.GetTool(Tools.EditPose).isActive);
toolButton = this.Q<Button>("EditJoints");
SetButtonChecked(toolButton, skinningCache.GetTool(Tools.EditJoints).isActive);
toolButton = this.Q<Button>("CreateBone");
SetButtonChecked(toolButton, skinningCache.GetTool(Tools.CreateBone).isActive);
toolButton = this.Q<Button>("SplitBone");
SetButtonChecked(toolButton, skinningCache.GetTool(Tools.SplitBone).isActive);
OnSkinningModeChange(skinningCache.mode);
}
public static BoneToolbar GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/BoneToolbar.uxml");
var clone = visualTree.CloneTree().Q<BoneToolbar>("BoneToolbar");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 06de59c21b18a5641b881cd7844c41be
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,47 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class CopyToolbar : Toolbar
{
public class CopyToolbarFactory : UxmlFactory<CopyToolbar, CopyToolbarUxmlTraits> {}
public class CopyToolbarUxmlTraits : UxmlTraits {}
public event Action onDoCopy = () => {};
public event Action onDoPaste = () => {};
public CopyToolbar()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/CopyToolbarStyle.uss"));
}
public void DoCopy()
{
onDoCopy();
}
public void DoPaste()
{
onDoPaste();
}
public void BindElements()
{
var copyButton = this.Q<Button>("Copy");
copyButton.clickable.clicked += DoCopy;
var pasteButton = this.Q<Button>("Paste");
pasteButton.clickable.clicked += DoPaste;
}
public static CopyToolbar GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/CopyToolbar.uxml");
var clone = visualTree.CloneTree().Q<CopyToolbar>("CopyToolbar");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: e498c656b0d8bb146b9446ea90d67e40
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,140 @@
using System;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class GenerateGeometryPanel : VisualElement
{
public class GenerateGeometryPanelFactory : UxmlFactory<GenerateGeometryPanel, GenerateGeometryPanelUxmlTraits> {}
public class GenerateGeometryPanelUxmlTraits : UxmlTraits {}
public enum GenerateMode
{
Single,
Multiple
}
private IntegerField m_OutlineDetailField;
private IntegerField m_AlphaToleranceField;
private IntegerField m_SubdivideField;
private Toggle m_Toggle;
public event Action<float, byte, float> onAutoGenerateGeometry;
public event Action<float, byte, float> onAutoGenerateGeometryAll;
public bool generateWeights
{
get { return m_Toggle.value; }
set { m_Toggle.value = value; }
}
public SkinningCache skinningCache { get; set; }
public GenerateGeometryPanel()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/GenerateGeometryPanelStyle.uss"));
RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
}
private void BindElements()
{
var generateButton = this.Q<Button>("GenerateGeometryButton");
generateButton.clickable.clicked += GenerateGeometry;
generateButton.AddManipulator(generateButton.clickable);
var generateAllButton = this.Q<Button>("GenerateGeometryAllButton");
generateAllButton.clickable.clicked += GenerateGeometryAll;
generateAllButton.AddManipulator(generateAllButton.clickable);
m_OutlineDetailField = this.Q<IntegerField>("OutlineDetailField");
m_AlphaToleranceField = this.Q<IntegerField>("AlphaToleranceField");
m_SubdivideField = this.Q<IntegerField>("SubdivideField");
m_Toggle = this.Q<Toggle>("GenerateWeightsField");
var slider = this.Q<Slider>("OutlineDetailSlider");
LinkSliderToFloatField(slider, m_OutlineDetailField, (x) =>
{
GenerateGeomertySettings.outlineDetail = x;
});
m_OutlineDetailField.SetValueWithoutNotify(GenerateGeomertySettings.outlineDetail);
slider.SetValueWithoutNotify(GenerateGeomertySettings.outlineDetail);
slider = this.Q<Slider>("AlphaToleranceSlider");
LinkSliderToFloatField(slider, m_AlphaToleranceField,(x) =>
{
GenerateGeomertySettings.alphaTolerance = x;
});
m_AlphaToleranceField.SetValueWithoutNotify(GenerateGeomertySettings.alphaTolerance);
slider.SetValueWithoutNotify(GenerateGeomertySettings.alphaTolerance);
slider = this.Q<Slider>("SubdivideSlider");
LinkSliderToFloatField(slider, m_SubdivideField,(x) =>
{
GenerateGeomertySettings.subdivide = x;
});
m_SubdivideField.SetValueWithoutNotify(GenerateGeomertySettings.subdivide);
slider.SetValueWithoutNotify(GenerateGeomertySettings.subdivide);
m_Toggle.value = GenerateGeomertySettings.generateWeights;
m_Toggle.RegisterValueChangedCallback((evt) =>
{
GenerateGeomertySettings.generateWeights = evt.newValue;
});
}
private void LinkSliderToFloatField(Slider slider, IntegerField field, Action<int> updatePreferenceAction)
{
slider.RegisterValueChangedCallback((evt) =>
{
if (!evt.newValue.Equals(field.value))
{
var intValue = Mathf.RoundToInt(evt.newValue);
field.SetValueWithoutNotify(intValue);
updatePreferenceAction(intValue);
}
});
field.RegisterValueChangedCallback((evt) =>
{
var newValue = evt.newValue;
if (!newValue.Equals(slider.value))
{
newValue = Math.Min(newValue, (int)slider.highValue);
newValue = Math.Max(newValue, (int)slider.lowValue);
slider.value = newValue;
field.SetValueWithoutNotify(newValue);
updatePreferenceAction(newValue);
}
});
}
public void SetMode(GenerateMode mode)
{
RemoveFromClassList("Multiple");
RemoveFromClassList("Single");
AddToClassList(mode.ToString());
}
public void GenerateGeometry()
{
if (onAutoGenerateGeometry != null)
onAutoGenerateGeometry(m_OutlineDetailField.value, Convert.ToByte(m_AlphaToleranceField.value), m_SubdivideField.value);
}
public void GenerateGeometryAll()
{
if (onAutoGenerateGeometryAll != null)
onAutoGenerateGeometryAll(m_OutlineDetailField.value, Convert.ToByte(m_AlphaToleranceField.value), m_SubdivideField.value);
}
public static GenerateGeometryPanel GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/GenerateGeometryPanel.uxml");
var clone = visualTree.CloneTree().Q<GenerateGeometryPanel>("GenerateGeometryPanel");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ba29542a56435e44a82237577ea08616
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,93 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class GenerateWeightsPanel : VisualElement
{
public class GenerateWeightsPanelFactory : UxmlFactory<GenerateWeightsPanel, GenerateWeightsPanelUxmlTraits> {}
public class GenerateWeightsPanelUxmlTraits : UxmlTraits {}
public event Action onGenerateWeights = () => {};
public event Action onNormalizeWeights = () => {};
public event Action onClearWeights = () => {};
private VisualElement m_AssociateBoneControl;
private Toggle m_AssociateBonesToggle;
Button m_GenerateWeightsButton;
public bool associateBones
{
get { return m_AssociateBoneControl.visible && m_AssociateBonesToggle.value; }
set { m_AssociateBonesToggle.value = value; }
}
public GenerateWeightsPanel()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/GenerateWeightsPanelStyle.uss"));
if (EditorGUIUtility.isProSkin)
AddToClassList("Dark");
AddToClassList("AssociateBoneEnabled");
RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
}
public void BindElements()
{
m_AssociateBoneControl = this.Q<VisualElement>("AssociateBonesControl");
m_GenerateWeightsButton = this.Q<Button>("GenerateWeightsButton");
m_GenerateWeightsButton.clickable.clicked += OnGenerateWeights;
var normalizeWeightsButton = this.Q<Button>("NormalizeWeightsButton");
normalizeWeightsButton.clickable.clicked += OnNormalizeWeights;
var clearWeightsButton = this.Q<Button>("ClearWeightsButton");
clearWeightsButton.clickable.clicked += OnClearWeights;
m_AssociateBonesToggle = this.Q<Toggle>("AssociateBonesField");
}
public string generateButtonText
{
set { m_GenerateWeightsButton.text = value; }
}
public void Update(bool enableAssociateBones)
{
m_AssociateBoneControl.SetHiddenFromLayout(!enableAssociateBones);
if (enableAssociateBones)
{
RemoveFromClassList("AssociateBoneDisabled");
AddToClassList("AssociateBoneEnabled");
}
else
{
RemoveFromClassList("AssociateBoneEnabled");
AddToClassList("AssociateBoneDisabled");
}
}
public void OnGenerateWeights()
{
onGenerateWeights();
}
public void OnNormalizeWeights()
{
onNormalizeWeights();
}
public void OnClearWeights()
{
onClearWeights();
}
public static GenerateWeightsPanel GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/GenerateWeightsPanel.uxml");
var clone = visualTree.CloneTree().Q<GenerateWeightsPanel>("GenerateWeightsPanel");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1bb64055b5d894141b91d275f422e5dc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,65 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class MeshToolbar : Toolbar
{
public class MeshToolbarFactory : UxmlFactory<MeshToolbar, MeshToolbarUxmlTraits> {}
public class MeshToolbarUxmlTraits : UxmlTraits {}
public event Action<Tools> SetMeshTool = (mode) => {};
public SkinningCache skinningCache { get; set; }
public MeshToolbar()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/MeshToolbarStyle.uss"));
}
public void BindElements()
{
var button = this.Q<Button>("SelectGeometry");
button.clickable.clicked += () => { SetMeshTool(Tools.EditGeometry); };
button = this.Q<Button>("CreateVertex");
button.clickable.clicked += () => { SetMeshTool(Tools.CreateVertex); };
button = this.Q<Button>("CreateEdge");
button.clickable.clicked += () => { SetMeshTool(Tools.CreateEdge); };
button = this.Q<Button>("SplitEdge");
button.clickable.clicked += () => { SetMeshTool(Tools.SplitEdge); };
button = this.Q<Button>("GenerateGeometry");
button.clickable.clicked += () => { SetMeshTool(Tools.GenerateGeometry); };
}
public void UpdateToggleState()
{
//TODO: Make UI not be aware of BaseTool, Cache, etc. Use Tool enum
var button = this.Q<Button>("SelectGeometry");
SetButtonChecked(button, skinningCache.GetTool(Tools.EditGeometry).isActive);
button = this.Q<Button>("CreateVertex");
SetButtonChecked(button, skinningCache.GetTool(Tools.CreateVertex).isActive);
button = this.Q<Button>("CreateEdge");
SetButtonChecked(button, skinningCache.GetTool(Tools.CreateEdge).isActive);
button = this.Q<Button>("SplitEdge");
SetButtonChecked(button, skinningCache.GetTool(Tools.SplitEdge).isActive);
button = this.Q<Button>("GenerateGeometry");
SetButtonChecked(button, skinningCache.GetTool(Tools.GenerateGeometry).isActive);
}
public static MeshToolbar GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/MeshToolbar.uxml");
var clone = visualTree.CloneTree().Q<MeshToolbar>("MeshToolbar");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5d3bb77bab9e1a343983ee641d146f99
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,77 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class PastePanel : VisualElement
{
public class PastePanelFactory : UxmlFactory<PastePanel, PastePanelUxmlTraits> {}
public class PastePanelUxmlTraits : UxmlTraits {}
public event Action<bool, bool, bool, bool> onPasteActivated = (bones, mesh, flipX, flipY) => {};
private Toggle m_BonesToggle;
private Toggle m_MeshToggle;
private Toggle m_FlipXToggle;
private Toggle m_FlipYToggle;
public bool bones
{
get { return m_BonesToggle.value; }
set { m_BonesToggle.value = value; }
}
public bool mesh
{
get { return m_MeshToggle.value; }
set { m_MeshToggle.value = value; }
}
public bool flipX
{
get { return m_FlipXToggle.value; }
set { m_FlipXToggle.value = value; }
}
public bool flipY
{
get { return m_FlipYToggle.value; }
set { m_FlipYToggle.value = value; }
}
public PastePanel()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/PastePanelStyle.uss"));
if (EditorGUIUtility.isProSkin)
AddToClassList("Dark");
RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
}
public void BindElements()
{
m_BonesToggle = this.Q<Toggle>("BonesField");
m_MeshToggle = this.Q<Toggle>("MeshField");
m_FlipXToggle = this.Q<Toggle>("FlipXField");
m_FlipYToggle = this.Q<Toggle>("FlipYField");
var pasteButton = this.Q<Button>("PasteButton");
pasteButton.clickable.clicked += OnPasteActivated;
}
public void OnPasteActivated()
{
onPasteActivated(bones, mesh, flipX, flipY);
}
public static PastePanel GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/PastePanel.uxml");
var clone = visualTree.CloneTree().Q<PastePanel>("PastePanel");
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b581e4fda8368f54987b99360c4b24e8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,46 @@
using UnityEngine;
using UnityEngine.U2D.Common;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class Toolbar : VisualElement
{
public class ToolbarFactory : UxmlFactory<Toolbar, ToolbarUxmlTraits> {}
public class ToolbarUxmlTraits : UxmlTraits {}
public Toolbar()
{
AddToClassList("Toolbar");
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/ToolbarStyle.uss"));
if (EditorGUIUtility.isProSkin)
AddToClassList("Dark");
}
public void SetButtonChecked(Button toCheck)
{
var buttons = this.Query<Button>();
buttons.ForEach((button) => { button.SetChecked(button == toCheck); });
}
protected void SetButtonChecked(Button button, bool check)
{
if (button.IsChecked() != check)
{
if (check)
button.AddToClassList("Checked");
else
button.RemoveFromClassList("Checked");
button.SetChecked(check);
}
}
public void CollapseToolBar(bool collapse)
{
if (collapse)
AddToClassList("Collapse");
else
RemoveFromClassList("Collapse");
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 26b0ec3fec60ce84eac8ead5fd651199
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,23 @@
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal static class VisualElementExtensions
{
public static void SetHiddenFromLayout(this VisualElement element, bool isHidden)
{
if (isHidden)
{
element.SetEnabled(false);
element.style.display = DisplayStyle.None;
element.style.position = Position.Absolute;
}
else
{
element.SetEnabled(true);
element.style.display = DisplayStyle.Flex;
element.style.position = Position.Relative;
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 63a168f3fcb899c438f953c5e064a1b9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,47 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class WeightInspectorIMGUIPanel : VisualElement
{
public class CustomUXMLFactor : UxmlFactory<WeightInspectorIMGUIPanel, UxmlTraits> {}
private WeightInspector m_WeightInspector = new WeightInspector();
public WeightInspector weightInspector
{
get { return m_WeightInspector; }
}
public event Action weightsChanged = () => {};
public WeightInspectorIMGUIPanel()
{
name = "WeightInspectorIMGUIPanel";
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/WeightInspectorIMGUIPanelStyle.uss"));
this.Add(new IMGUIContainer(OnGUI));
this.pickingMode = PickingMode.Ignore;
this.RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
this.RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
}
protected void OnGUI()
{
var selectionCount = 0;
if (weightInspector.selection != null)
selectionCount = weightInspector.selection.Count;
using (new EditorGUI.DisabledGroupScope(m_WeightInspector.spriteMeshData == null || selectionCount == 0))
{
GUILayout.Label(new GUIContent(TextContent.vertexWeight, TextContent.vertexWeightToolTip));
EditorGUI.BeginChangeCheck();
m_WeightInspector.OnInspectorGUI();
if (EditorGUI.EndChangeCheck())
weightsChanged();
}
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 83711169e2aa1fb439980c4d6fa5ef24
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,287 @@
using System;
using System.Collections.Generic;
using UnityEditor.UIElements;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class WeightPainterPanel : VisualElement
{
public class WeightPainterPanelFactory : UxmlFactory<WeightPainterPanel, WeightPainterPanelUxmlTraits> {}
public class WeightPainterPanelUxmlTraits : UxmlTraits {}
public static readonly string kNone = "None";
private WeightPainterMode m_PaintMode;
private EnumField m_ModeField;
private Toggle m_NormalizeToggle;
private IntegerField m_HardnessField;
private IntegerField m_StepField;
private IntegerField m_SizeField;
private FloatField m_AmountField;
private Slider m_AmountSlider;
private VisualElement m_BonePopupContainer;
private PopupField<string> m_BonePopup;
private bool m_SliderActive = false;
private WeightInspectorIMGUIPanel m_WeightInspectorPanel;
private UnityEngine.UIElements.PopupWindow m_PopupWindow;
public event Action<int> bonePopupChanged = (s) => {};
public event Action sliderStarted = () => {};
public event Action<float> sliderChanged = (s) => {};
public event Action sliderEnded = () => {};
public event Action weightsChanged = () => {};
public WeightPainterMode paintMode
{
get { return m_PaintMode; }
set
{
if (value == m_PaintMode)
return;
m_PaintMode = value;
if (m_PaintMode == WeightPainterMode.Brush)
{
RemoveFromClassList("SliderMode");
AddToClassList("BrushMode");
}
else
{
RemoveFromClassList("BrushMode");
AddToClassList("SliderMode");
}
}
}
public string title
{
set { m_PopupWindow.text = value; }
}
public WeightEditorMode mode
{
get { return (WeightEditorMode)m_ModeField.value; }
set { m_ModeField.value = value; }
}
public int boneIndex
{
get { return m_BonePopup.index - 1; }
}
public int size
{
get { return m_SizeField.value; }
set { m_SizeField.value = value; }
}
public int hardness
{
get { return m_HardnessField.value; }
set { m_HardnessField.value = value; }
}
public int step
{
get { return m_StepField.value; }
set { m_StepField.value = value; }
}
public bool normalize
{
get { return m_NormalizeToggle.value; }
set { m_NormalizeToggle.value = value; }
}
public float amount
{
get { return m_AmountField.value; }
set { m_AmountField.value = value; }
}
public WeightPainterPanel()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/WeightPainterPanelStyle.uss"));
if (EditorGUIUtility.isProSkin)
AddToClassList("Dark");
paintMode = WeightPainterMode.Brush;
AddToClassList("BrushMode");
RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
}
public void BindElements()
{
m_ModeField = this.Q<EnumField>("ModeField");
m_BonePopupContainer = this.Q<VisualElement>("BoneEnumPopup");
m_NormalizeToggle = this.Q<Toggle>("NormalizeToggle");
m_SizeField = this.Q<IntegerField>("SizeField");
m_HardnessField = this.Q<IntegerField>("HardnessField");
m_StepField = this.Q<IntegerField>("StepField");
m_AmountSlider = this.Q<Slider>("AmountSlider");
m_AmountField = this.Q<FloatField>("AmountField");
m_AmountField.isDelayed = true;
m_WeightInspectorPanel = this.Q<WeightInspectorIMGUIPanel>("WeightsInspector");
m_PopupWindow = this.Q<UnityEngine.UIElements.PopupWindow>();
LinkSliderToIntegerField(this.Q<Slider>("HardnessSlider"), m_HardnessField);
LinkSliderToIntegerField(this.Q<Slider>("StepSlider"), m_StepField);
m_ModeField.RegisterValueChangedCallback((evt) =>
{
SetupMode();
});
m_AmountSlider.RegisterValueChangedCallback((evt) =>
{
if (!evt.Equals(m_AmountField.value))
m_AmountField.value = (float)Math.Round((double)evt.newValue, 2);
if (m_SliderActive)
sliderChanged?.Invoke(m_AmountField.value);
});
m_AmountSlider.RegisterCallback<MouseCaptureEvent>(evt =>
{
m_SliderActive = true;
sliderStarted?.Invoke();
}, TrickleDown.TrickleDown);
m_AmountSlider.RegisterCallback<MouseCaptureOutEvent>(evt =>
{
m_SliderActive = false;
sliderEnded?.Invoke();
m_AmountSlider.value = 0;
}, TrickleDown.TrickleDown);
m_AmountField.RegisterValueChangedCallback((evt) =>
{
var newValue = Mathf.Clamp(evt.newValue, m_AmountSlider.lowValue, m_AmountSlider.highValue);
if (focusController.focusedElement == m_AmountField && !newValue.Equals(m_AmountSlider.value))
{
sliderStarted();
sliderChanged(newValue);
sliderEnded();
Focus();
m_AmountField.value = 0f;
m_AmountSlider.value = 0f;
}
});
m_WeightInspectorPanel.weightsChanged += () => weightsChanged();
}
public void SetActive(bool active)
{
this.Q("Amount").SetEnabled(active);
}
private void SetupMode()
{
var boneElement = this.Q<VisualElement>("Bone");
boneElement.SetHiddenFromLayout(mode == WeightEditorMode.Smooth);
SetupAmountSlider();
}
private void SetupAmountSlider()
{
if (paintMode == WeightPainterMode.Slider)
{
if (mode == WeightEditorMode.Smooth)
{
m_AmountSlider.lowValue = 0.0f;
m_AmountSlider.highValue = 8.0f;
}
else
{
m_AmountSlider.lowValue = -1.0f;
m_AmountSlider.highValue = 1.0f;
}
}
}
private void LinkSliderToIntegerField(Slider slider, IntegerField field)
{
slider.RegisterValueChangedCallback((evt) =>
{
if (!evt.newValue.Equals(field.value))
field.value = Mathf.RoundToInt(evt.newValue);
});
field.RegisterValueChangedCallback((evt) =>
{
if (!evt.newValue.Equals((int)slider.value))
slider.value = evt.newValue;
});
}
public void UpdateWeightInspector(ISpriteMeshData spriteMeshData, string[] boneNames, ISelection<int> selection, ICacheUndo cacheUndo)
{
m_WeightInspectorPanel.weightInspector.spriteMeshData = spriteMeshData;
m_WeightInspectorPanel.weightInspector.boneNames = ModuleUtility.ToGUIContentArray(boneNames);
m_WeightInspectorPanel.weightInspector.selection = selection;
m_WeightInspectorPanel.weightInspector.cacheUndo = cacheUndo;
}
public void UpdatePanel(string[] boneNames)
{
SetupMode();
UpdateBonePopup(boneNames);
}
private void UpdateBonePopup(string[] names)
{
VisualElement boneElement = null;
if (m_ModeField != null && mode == WeightEditorMode.Smooth)
{
boneElement = this.Q<VisualElement>("Bone");
boneElement.SetHiddenFromLayout(false);
}
if (m_BonePopup != null)
{
m_BonePopupContainer.Remove(m_BonePopup);
}
m_BonePopup = new PopupField<string>(new List<string>(names), 0);
m_BonePopup.name = "BonePopupField";
m_BonePopup.label = TextContent.bone;
m_BonePopup.tooltip = TextContent.boneToolTip;
m_BonePopup.RegisterValueChangedCallback((evt) =>
{
bonePopupChanged(boneIndex);
});
m_BonePopupContainer.Add(m_BonePopup);
if (boneElement != null)
{
boneElement.SetHiddenFromLayout(true);
}
}
internal void SetBoneSelectionByName(string boneName)
{
if (m_BonePopup != null)
m_BonePopup.value = boneName;
}
public static WeightPainterPanel GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/WeightPainterPanel.uxml");
var clone = visualTree.CloneTree().Q<WeightPainterPanel>("WeightPainterPanel");
// EnumField can only get type of Enum from the current running assembly when defined through UXML
// Manually create the EnumField here
var mode = clone.Q<VisualElement>("Mode");
var modeField = new EnumField(WeightEditorMode.AddAndSubtract);
modeField.name = "ModeField";
modeField.label = TextContent.mode;
modeField.tooltip = TextContent.modeTooltip;
mode.Add(modeField);
clone.BindElements();
return clone;
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b5e5a351c019c4444bc838b6e5fcd0a3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
using System;
using UnityEngine;
using UnityEngine.UIElements;
namespace UnityEditor.U2D.Animation
{
internal class WeightToolbar : Toolbar
{
public class CustomUXMLFactor : UxmlFactory<WeightToolbar, UxmlTraits> {}
public event Action<Tools> SetWeightTool = (mode) => {};
public SkinningCache skinningCache { get; set; }
public WeightToolbar()
{
styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/WeightToolbarStyle.uss"));
}
public void EnableBoneInfluenceWidget()
{
this.Q<Button>("BoneInfluenceWidget").SetEnabled(true);
}
public void DisableBoneInfluenceWidget()
{
this.Q<Button>("BoneInfluenceWidget").SetEnabled(false);
}
public void BindElements()
{
var button = this.Q<Button>("AutoGenerateWeight");
button.clickable.clicked += () => SetWeightTool(Tools.GenerateWeights);
button = this.Q<Button>("WeightPainterSlider");
button.clickable.clicked += () => SetWeightTool(Tools.WeightSlider);
button = this.Q<Button>("WeightPainterBrush");
button.clickable.clicked += () => SetWeightTool(Tools.WeightBrush);
button = this.Q<Button>("BoneInfluenceWidget");
button.clickable.clicked += () => SetWeightTool(Tools.BoneInfluence);
}
public static WeightToolbar GenerateFromUXML()
{
var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/WeightToolbar.uxml");
var clone = visualTree.CloneTree().Q<WeightToolbar>("WeightToolbar");
clone.BindElements();
return clone;
}
public void UpdateToggleState()
{
//TODO: Make UI not be aware of BaseTool, Cache, etc. Use Tool enum
var button = this.Q<Button>("WeightPainterSlider");
SetButtonChecked(button, skinningCache.GetTool(Tools.WeightSlider).isActive);
button = this.Q<Button>("BoneInfluenceWidget");
SetButtonChecked(button, skinningCache.GetTool(Tools.BoneInfluence).isActive);
button = this.Q<Button>("WeightPainterBrush");
SetButtonChecked(button, skinningCache.GetTool(Tools.WeightBrush).isActive);
button = this.Q<Button>("AutoGenerateWeight");
SetButtonChecked(button, skinningCache.GetTool(Tools.GenerateWeights).isActive);
}
}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d5b43421660b55349b6bb57288b4baf0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: