98 lines
4.8 KiB
C#
98 lines
4.8 KiB
C#
|
using System;
|
||
|
using UnityEditor.Splines.Editor.GUI;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Internal;
|
||
|
using UnityEngine.Splines;
|
||
|
|
||
|
namespace UnityEditor.Splines
|
||
|
{
|
||
|
[ExcludeFromDocs]
|
||
|
[CustomPropertyDrawer(typeof(SplineData<>))]
|
||
|
public class SplineDataPropertyDrawer : PropertyDrawer
|
||
|
{
|
||
|
readonly static string k_MultiSplineEditMessage = L10n.Tr("Multi-selection is not supported for SplineData");
|
||
|
readonly static string k_DataUnitTooltip = L10n.Tr("The unit Data Points are using to be associated to the spline. 'Spline Distance' is " +
|
||
|
"using the distance in Unity Units from the spline origin, 'Normalized Distance' is using a normalized value of the spline " +
|
||
|
"length between [0,1] and 'Knot Index' is using Spline Knot indeces.");
|
||
|
|
||
|
readonly static GUIContent[] k_PathUnitIndexLabels = new[]
|
||
|
{
|
||
|
new GUIContent(L10n.Tr("Spline Distance")),
|
||
|
new GUIContent(L10n.Tr("Normalized Distance")),
|
||
|
new GUIContent(L10n.Tr("Knot Index"))
|
||
|
};
|
||
|
|
||
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
||
|
{
|
||
|
float height = EditorGUIUtility.singleLineHeight;
|
||
|
if(!property.isExpanded || property.serializedObject.isEditingMultipleObjects)
|
||
|
return height;
|
||
|
|
||
|
//Adding space for the object field
|
||
|
height += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
|
||
|
height += EditorGUI.GetPropertyHeight(property.FindPropertyRelative("m_IndexUnit")) + EditorGUIUtility.standardVerticalSpacing;
|
||
|
|
||
|
var datapointsProperty = property.FindPropertyRelative("m_DataPoints");
|
||
|
height += EditorGUIUtility.singleLineHeight;
|
||
|
if(datapointsProperty.isExpanded)
|
||
|
{
|
||
|
height += 2 * EditorGUIUtility.singleLineHeight;
|
||
|
var arraySize = datapointsProperty.arraySize;
|
||
|
if(arraySize == 0)
|
||
|
{
|
||
|
height += EditorGUIUtility.singleLineHeight;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
for(int dataPointIndex = 0; dataPointIndex < arraySize; dataPointIndex++)
|
||
|
{
|
||
|
height += datapointsProperty.GetArrayElementAtIndex(dataPointIndex).isExpanded
|
||
|
? 3 * EditorGUIUtility.singleLineHeight + 2 * EditorGUIUtility.standardVerticalSpacing
|
||
|
: EditorGUIUtility.singleLineHeight;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return height;
|
||
|
}
|
||
|
|
||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||
|
{
|
||
|
EditorGUI.BeginProperty(position, label, property);
|
||
|
if(property.serializedObject.isEditingMultipleObjects)
|
||
|
{
|
||
|
EditorGUI.LabelField(position,L10n.Tr(k_MultiSplineEditMessage), EditorStyles.helpBox);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
property.isExpanded = EditorGUI.Foldout(SplineUIManager.ReserveSpace(EditorGUIUtility.singleLineHeight, ref position), property.isExpanded, label);
|
||
|
if (property.isExpanded)
|
||
|
{
|
||
|
EditorGUI.indentLevel++;
|
||
|
SplineUIManager.ReserveSpace(EditorGUIUtility.standardVerticalSpacing, ref position);
|
||
|
|
||
|
var indexProperty = property.FindPropertyRelative("m_IndexUnit");
|
||
|
var dataPointsProperty = property.FindPropertyRelative("m_DataPoints");
|
||
|
var pathUnit = (PathIndexUnit)indexProperty.intValue;
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
var newPathUnit = EditorGUI.Popup(SplineUIManager.ReserveSpace(EditorGUI.GetPropertyHeight(indexProperty), ref position),
|
||
|
new GUIContent("Data Index Unit",L10n.Tr(k_DataUnitTooltip)), (int)pathUnit, k_PathUnitIndexLabels);
|
||
|
if(EditorGUI.EndChangeCheck())
|
||
|
{
|
||
|
if(dataPointsProperty.arraySize == 0)
|
||
|
indexProperty.intValue = newPathUnit;
|
||
|
else
|
||
|
SplineDataConversionWindow.DoConfirmWindow(property, indexProperty, fieldInfo, property.serializedObject.targetObject as Component, newPathUnit);
|
||
|
}
|
||
|
|
||
|
SplineUIManager.ReserveSpace(EditorGUIUtility.standardVerticalSpacing, ref position);
|
||
|
|
||
|
dataPointsProperty.isExpanded = EditorGUI.Foldout(SplineUIManager.ReserveSpace(EditorGUIUtility.singleLineHeight, ref position), dataPointsProperty.isExpanded, new GUIContent("Data Points"));
|
||
|
if(dataPointsProperty.isExpanded)
|
||
|
SplineDataUIManager.instance.GetDataPointsReorderableList(property, dataPointsProperty, fieldInfo, pathUnit).DoList(position);
|
||
|
}
|
||
|
EditorGUI.EndProperty();
|
||
|
}
|
||
|
}
|
||
|
}
|