mirror of
https://gitgud.io/AbstractConcept/rimworld-animation-studio.git
synced 2024-08-15 00:43:27 +00:00
Initial commit
This commit is contained in:
commit
3c7cc0c973
8391 changed files with 704313 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 68e86a17b9682ee4a81c0bd5627704a1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 06de59c21b18a5641b881cd7844c41be
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e498c656b0d8bb146b9446ea90d67e40
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: ba29542a56435e44a82237577ea08616
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 1bb64055b5d894141b91d275f422e5dc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 5d3bb77bab9e1a343983ee641d146f99
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b581e4fda8368f54987b99360c4b24e8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 26b0ec3fec60ce84eac8ead5fd651199
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 63a168f3fcb899c438f953c5e064a1b9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 83711169e2aa1fb439980c4d6fa5ef24
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: b5e5a351c019c4444bc838b6e5fcd0a3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d5b43421660b55349b6bb57288b4baf0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Add table
Add a link
Reference in a new issue