No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GenerateGeometryPanel.cs 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using UnityEditor.U2D.Common;
  3. using UnityEngine;
  4. using UnityEngine.UIElements;
  5. namespace UnityEditor.U2D.Animation
  6. {
  7. #if ENABLE_UXML_SERIALIZED_DATA
  8. [UxmlElement]
  9. #endif
  10. internal partial class GenerateGeometryPanel : VisualElement
  11. {
  12. #if ENABLE_UXML_TRAITS
  13. public class GenerateGeometryPanelFactory : UxmlFactory<GenerateGeometryPanel, GenerateGeometryPanelUxmlTraits> {}
  14. public class GenerateGeometryPanelUxmlTraits : UxmlTraits {}
  15. #endif
  16. public enum GenerateMode
  17. {
  18. Single,
  19. Multiple
  20. }
  21. private IntegerField m_OutlineDetailField;
  22. private IntegerField m_AlphaToleranceField;
  23. private IntegerField m_SubdivideField;
  24. private Toggle m_Toggle;
  25. public event Action<float, byte, float> onAutoGenerateGeometry;
  26. public event Action<float, byte, float> onAutoGenerateGeometryAll;
  27. public bool generateWeights
  28. {
  29. get { return m_Toggle.value; }
  30. set { m_Toggle.value = value; }
  31. }
  32. public SkinningCache skinningCache { get; set; }
  33. public GenerateGeometryPanel()
  34. {
  35. styleSheets.Add(ResourceLoader.Load<StyleSheet>("SkinningModule/GenerateGeometryPanelStyle.uss"));
  36. RegisterCallback<MouseDownEvent>((e) => { e.StopPropagation(); });
  37. RegisterCallback<MouseUpEvent>((e) => { e.StopPropagation(); });
  38. }
  39. private void BindElements()
  40. {
  41. var generateButton = this.Q<Button>("GenerateGeometryButton");
  42. generateButton.clickable.clicked += GenerateGeometry;
  43. generateButton.AddManipulator(generateButton.clickable);
  44. var generateAllButton = this.Q<Button>("GenerateGeometryAllButton");
  45. generateAllButton.clickable.clicked += GenerateGeometryAll;
  46. generateAllButton.AddManipulator(generateAllButton.clickable);
  47. m_OutlineDetailField = this.Q<IntegerField>("OutlineDetailField");
  48. m_AlphaToleranceField = this.Q<IntegerField>("AlphaToleranceField");
  49. m_SubdivideField = this.Q<IntegerField>("SubdivideField");
  50. m_Toggle = this.Q<Toggle>("GenerateWeightsField");
  51. var slider = this.Q<Slider>("OutlineDetailSlider");
  52. LinkSliderToFloatField(slider, m_OutlineDetailField, (x) =>
  53. {
  54. GenerateGeomertySettings.outlineDetail = x;
  55. });
  56. m_OutlineDetailField.SetValueWithoutNotify(GenerateGeomertySettings.outlineDetail);
  57. slider.SetValueWithoutNotify(GenerateGeomertySettings.outlineDetail);
  58. slider = this.Q<Slider>("AlphaToleranceSlider");
  59. LinkSliderToFloatField(slider, m_AlphaToleranceField,(x) =>
  60. {
  61. GenerateGeomertySettings.alphaTolerance = x;
  62. });
  63. m_AlphaToleranceField.SetValueWithoutNotify(GenerateGeomertySettings.alphaTolerance);
  64. slider.SetValueWithoutNotify(GenerateGeomertySettings.alphaTolerance);
  65. slider = this.Q<Slider>("SubdivideSlider");
  66. LinkSliderToFloatField(slider, m_SubdivideField,(x) =>
  67. {
  68. GenerateGeomertySettings.subdivide = x;
  69. });
  70. m_SubdivideField.SetValueWithoutNotify(GenerateGeomertySettings.subdivide);
  71. slider.SetValueWithoutNotify(GenerateGeomertySettings.subdivide);
  72. m_Toggle.value = GenerateGeomertySettings.generateWeights;
  73. m_Toggle.RegisterValueChangedCallback((evt) =>
  74. {
  75. GenerateGeomertySettings.generateWeights = evt.newValue;
  76. });
  77. }
  78. private void LinkSliderToFloatField(Slider slider, IntegerField field, Action<int> updatePreferenceAction)
  79. {
  80. slider.RegisterValueChangedCallback((evt) =>
  81. {
  82. if (!evt.newValue.Equals(field.value))
  83. {
  84. var intValue = Mathf.RoundToInt(evt.newValue);
  85. field.SetValueWithoutNotify(intValue);
  86. updatePreferenceAction(intValue);
  87. }
  88. });
  89. field.RegisterValueChangedCallback((evt) =>
  90. {
  91. var newValue = evt.newValue;
  92. if (!newValue.Equals(slider.value))
  93. {
  94. newValue = Math.Min(newValue, (int)slider.highValue);
  95. newValue = Math.Max(newValue, (int)slider.lowValue);
  96. slider.value = newValue;
  97. field.SetValueWithoutNotify(newValue);
  98. updatePreferenceAction(newValue);
  99. }
  100. });
  101. }
  102. public void SetMode(GenerateMode mode)
  103. {
  104. RemoveFromClassList("Multiple");
  105. RemoveFromClassList("Single");
  106. AddToClassList(mode.ToString());
  107. }
  108. public void GenerateGeometry()
  109. {
  110. if (onAutoGenerateGeometry != null)
  111. onAutoGenerateGeometry(m_OutlineDetailField.value, Convert.ToByte(m_AlphaToleranceField.value), m_SubdivideField.value);
  112. }
  113. public void GenerateGeometryAll()
  114. {
  115. if (onAutoGenerateGeometryAll != null)
  116. onAutoGenerateGeometryAll(m_OutlineDetailField.value, Convert.ToByte(m_AlphaToleranceField.value), m_SubdivideField.value);
  117. }
  118. public static GenerateGeometryPanel GenerateFromUXML()
  119. {
  120. var visualTree = ResourceLoader.Load<VisualTreeAsset>("SkinningModule/GenerateGeometryPanel.uxml");
  121. var clone = visualTree.CloneTree().Q<GenerateGeometryPanel>("GenerateGeometryPanel");
  122. clone.LocalizeTextInChildren();
  123. clone.BindElements();
  124. return clone;
  125. }
  126. }
  127. }