77 lines
3.4 KiB
C#
77 lines
3.4 KiB
C#
|
using System;
|
|||
|
using UnityEditor;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace Unity.Mathematics.Editor
|
|||
|
{
|
|||
|
[CustomPropertyDrawer(typeof(bool2)), CustomPropertyDrawer(typeof(bool3)), CustomPropertyDrawer(typeof(bool4))]
|
|||
|
[CustomPropertyDrawer(typeof(double2)), CustomPropertyDrawer(typeof(double3)), CustomPropertyDrawer(typeof(double4))]
|
|||
|
[CustomPropertyDrawer(typeof(float2)), CustomPropertyDrawer(typeof(float3)), CustomPropertyDrawer(typeof(float4))]
|
|||
|
[CustomPropertyDrawer(typeof(int2)), CustomPropertyDrawer(typeof(int3)), CustomPropertyDrawer(typeof(int4))]
|
|||
|
[CustomPropertyDrawer(typeof(uint2)), CustomPropertyDrawer(typeof(uint3)), CustomPropertyDrawer(typeof(uint4))]
|
|||
|
[CustomPropertyDrawer(typeof(DoNotNormalizeAttribute))]
|
|||
|
class PrimitiveVectorDrawer : PropertyDrawer
|
|||
|
{
|
|||
|
static class Content
|
|||
|
{
|
|||
|
public static readonly string doNotNormalizeCompatibility = L10n.Tr(
|
|||
|
$"{typeof(DoNotNormalizeAttribute).Name} only works with {typeof(quaternion)} and primitive vector types."
|
|||
|
);
|
|||
|
public static readonly string doNotNormalizeTooltip =
|
|||
|
L10n.Tr("This value is not normalized, which may produce unexpected results.");
|
|||
|
|
|||
|
public static readonly GUIContent[] labels2 = { new GUIContent("X"), new GUIContent("Y") };
|
|||
|
public static readonly GUIContent[] labels3 = { new GUIContent("X"), new GUIContent("Y"), new GUIContent("Z") };
|
|||
|
public static readonly GUIContent[] labels4 = { new GUIContent("X"), new GUIContent("Y"), new GUIContent("Z"), new GUIContent("W") };
|
|||
|
}
|
|||
|
|
|||
|
public override bool CanCacheInspectorGUI(SerializedProperty property)
|
|||
|
{
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
|||
|
{
|
|||
|
var height = EditorGUIUtility.singleLineHeight;
|
|||
|
if (!EditorGUIUtility.wideMode)
|
|||
|
height += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
|||
|
return height;
|
|||
|
}
|
|||
|
|
|||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|||
|
{
|
|||
|
var subLabels = Content.labels4;
|
|||
|
var startIter = "x";
|
|||
|
switch (property.type[property.type.Length - 1])
|
|||
|
{
|
|||
|
case '2':
|
|||
|
subLabels = Content.labels2;
|
|||
|
break;
|
|||
|
case '3':
|
|||
|
subLabels = Content.labels3;
|
|||
|
break;
|
|||
|
case '4':
|
|||
|
subLabels = Content.labels4;
|
|||
|
break;
|
|||
|
default:
|
|||
|
{
|
|||
|
if (property.type == nameof(quaternion))
|
|||
|
startIter = "value.x";
|
|||
|
else if (attribute is DoNotNormalizeAttribute)
|
|||
|
{
|
|||
|
EditorGUI.HelpBox(EditorGUI.PrefixLabel(position, label), Content.doNotNormalizeCompatibility, MessageType.None);
|
|||
|
return;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (attribute is DoNotNormalizeAttribute && string.IsNullOrEmpty(label.tooltip))
|
|||
|
label.tooltip = Content.doNotNormalizeTooltip;
|
|||
|
|
|||
|
EditorGUI.BeginProperty(position, label, property);
|
|||
|
EditorGUI.MultiPropertyField(position, subLabels, property.FindPropertyRelative(startIter), label);
|
|||
|
EditorGUI.EndProperty();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|