You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
5.7 KiB
C#
106 lines
5.7 KiB
C#
3 months ago
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace MPUIKIT.Editor {
|
||
|
[CustomPropertyDrawer(typeof(Hexagon))]
|
||
|
public class HexagonPropertyDrawer : PropertyDrawer {
|
||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
|
||
|
EditorGUI.BeginProperty(position, label, property);
|
||
|
{
|
||
|
SerializedProperty rectRadius = property.FindPropertyRelative("m_CornerRadius");
|
||
|
SerializedProperty uniformRect = property.FindPropertyRelative("m_UniformCornerRadius");
|
||
|
SerializedProperty triSizes = property.FindPropertyRelative("m_TipSize");
|
||
|
SerializedProperty uniformTriS = property.FindPropertyRelative("m_UniformTipSize");
|
||
|
SerializedProperty triRadius = property.FindPropertyRelative("m_TipRadius");
|
||
|
SerializedProperty uniformTriR = property.FindPropertyRelative("m_UniformTipRadius");
|
||
|
|
||
|
Vector4 radiusVectorValue = rectRadius.vector4Value;
|
||
|
float radiusFloatValue = radiusVectorValue.x;
|
||
|
bool rectBoolVal = uniformRect.boolValue;
|
||
|
float[] zw = new[] {radiusVectorValue.w, radiusVectorValue.z};
|
||
|
float[] xy = new[] {radiusVectorValue.x, radiusVectorValue.y};
|
||
|
Vector2 triSizesVectorValue = triSizes.vector2Value;
|
||
|
float triSizesFloatValue = triSizesVectorValue.x;
|
||
|
Vector2 triRadiusVectorValue = triRadius.vector2Value;
|
||
|
float triRadiusFloatValue = triRadiusVectorValue.x;
|
||
|
|
||
|
Rect line = position;
|
||
|
line.height = EditorGUIUtility.singleLineHeight;
|
||
|
string[] toolbarLabel = new[] {"Free", "Uniform"};
|
||
|
MPEditorUtility.CornerRadiusModeGUI(line, ref uniformRect, toolbarLabel);
|
||
|
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
{
|
||
|
EditorGUI.showMixedValue = rectRadius.hasMultipleDifferentValues;
|
||
|
if (rectBoolVal) {
|
||
|
radiusFloatValue = EditorGUI.FloatField(line, "Uniform Radius", radiusFloatValue);
|
||
|
}
|
||
|
else {
|
||
|
EditorGUI.MultiFloatField(line, new []{new GUIContent("W"), new GUIContent("Z")}, zw);
|
||
|
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
EditorGUI.MultiFloatField(line, new []{new GUIContent("X"), new GUIContent("Y")}, xy);
|
||
|
}
|
||
|
EditorGUI.showMixedValue = false;
|
||
|
}
|
||
|
if (EditorGUI.EndChangeCheck()) {
|
||
|
rectRadius.vector4Value = rectBoolVal
|
||
|
? new Vector4(radiusFloatValue, radiusFloatValue, radiusFloatValue, radiusFloatValue)
|
||
|
: new Vector4(xy[0], xy[1], zw[1], zw[0]);
|
||
|
}
|
||
|
|
||
|
|
||
|
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
MPEditorUtility.CornerRadiusModeGUI(line, ref uniformTriS, toolbarLabel, "Tip Size");
|
||
|
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
{
|
||
|
EditorGUI.showMixedValue = triSizes.hasMultipleDifferentValues;
|
||
|
if (uniformTriS.boolValue) {
|
||
|
triSizesFloatValue = EditorGUI.FloatField(line, "Uniform Size", triSizesFloatValue);
|
||
|
}
|
||
|
else {
|
||
|
triSizesVectorValue = EditorGUI.Vector2Field(line, string.Empty, triSizesVectorValue);
|
||
|
}
|
||
|
|
||
|
EditorGUI.showMixedValue = false;
|
||
|
}
|
||
|
if (EditorGUI.EndChangeCheck()) {
|
||
|
triSizes.vector2Value = uniformTriS.boolValue
|
||
|
? new Vector2(triSizesFloatValue, triSizesFloatValue)
|
||
|
: triSizesVectorValue;
|
||
|
}
|
||
|
|
||
|
|
||
|
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
MPEditorUtility.CornerRadiusModeGUI(line, ref uniformTriR, toolbarLabel, "Tip Radius");
|
||
|
line.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
{
|
||
|
EditorGUI.showMixedValue = triRadius.hasMultipleDifferentValues;
|
||
|
if (uniformTriR.boolValue) {
|
||
|
triRadiusFloatValue = EditorGUI.FloatField(line, "Uniform Radius", triRadiusFloatValue);
|
||
|
}
|
||
|
else {
|
||
|
triRadiusVectorValue = EditorGUI.Vector2Field(line, string.Empty, triRadiusVectorValue);
|
||
|
}
|
||
|
|
||
|
EditorGUI.showMixedValue = false;
|
||
|
}
|
||
|
if (EditorGUI.EndChangeCheck()) {
|
||
|
triRadius.vector2Value = uniformTriR.boolValue
|
||
|
? new Vector2(triRadiusFloatValue, triRadiusFloatValue)
|
||
|
: triRadiusVectorValue;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
EditorGUI.EndProperty();
|
||
|
}
|
||
|
|
||
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
|
||
|
if (property.FindPropertyRelative("m_UniformCornerRadius").boolValue) {
|
||
|
return EditorGUIUtility.singleLineHeight * 6 + EditorGUIUtility.standardVerticalSpacing * 5;
|
||
|
}
|
||
|
return EditorGUIUtility.singleLineHeight * 7 + EditorGUIUtility.standardVerticalSpacing * 6;
|
||
|
}
|
||
|
}
|
||
|
}
|