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