Rasagar/Library/PackageCache/com.unity.cinemachine/Editor/Impulse/CinemachineImpulseEnvelopePropertyDrawer.cs
2024-08-26 23:07:20 +03:00

100 lines
4.6 KiB
C#

using UnityEngine;
using UnityEditor;
namespace Cinemachine.Editor
{
[CustomPropertyDrawer(typeof(CinemachineImpulseManager.EnvelopeDefinition))]
internal sealed class CinemachineImpulseEnvelopePropertyDrawer : PropertyDrawer
{
const int vSpace = 2;
static bool mExpanded = true;
CinemachineImpulseManager.EnvelopeDefinition myClass
= new CinemachineImpulseManager.EnvelopeDefinition(); // to access name strings
public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
{
float height = EditorGUIUtility.singleLineHeight;
rect.height = height;
mExpanded = EditorGUI.Foldout(rect, mExpanded, label, true);
if (mExpanded)
{
const float indentAmount = 15;
rect.width -= indentAmount; rect.x += indentAmount;
float oldWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth -= indentAmount;
rect.y += EditorGUIUtility.singleLineHeight + vSpace;
DrawCurveTimeProperty(
rect, new GUIContent("Attack", "The custom shape of the attack curve. Leave it blank for a default shape"),
property.FindPropertyRelative(() => myClass.m_AttackShape),
property.FindPropertyRelative(() => myClass.m_AttackTime));
rect.y += EditorGUIUtility.singleLineHeight + vSpace;
#if false // with "forever" button... dangerous because signal never goes away!
var holdProp = property.FindPropertyRelative(() => myClass.m_SustainTime);
InspectorUtility.MultiPropertyOnLine(
rect, new GUIContent(holdProp.displayName, holdProp.tooltip),
new SerializedProperty[] { holdProp, property.FindPropertyRelative(() => myClass.m_HoldForever) },
new GUIContent[] { GUIContent.none, new GUIContent("forever") });
#else
EditorGUI.PropertyField(rect, property.FindPropertyRelative(() => myClass.m_SustainTime));
#endif
rect.y += EditorGUIUtility.singleLineHeight + vSpace;
DrawCurveTimeProperty(
rect, new GUIContent("Decay", "The custom shape of the decay curve. Leave it blank for a default shape"),
property.FindPropertyRelative(() => myClass.m_DecayShape),
property.FindPropertyRelative(() => myClass.m_DecayTime));
rect.y += EditorGUIUtility.singleLineHeight + vSpace;
EditorGUI.PropertyField(rect, property.FindPropertyRelative(() => myClass.m_ScaleWithImpact));
EditorGUIUtility.labelWidth = oldWidth;
}
}
void DrawCurveTimeProperty(
Rect rect, GUIContent label,
SerializedProperty curveProp, SerializedProperty timeProp)
{
float floatFieldWidth = EditorGUIUtility.singleLineHeight * 2.5f;
GUIContent timeText = new GUIContent(" s", timeProp.tooltip);
var textDimensions = GUI.skin.label.CalcSize(timeText);
rect = EditorGUI.PrefixLabel(rect, label);
rect.height = EditorGUIUtility.singleLineHeight;
rect.width -= floatFieldWidth + textDimensions.x;
Rect r = rect; r.height += 1; r.y -= 1;
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(r, curveProp, GUIContent.none);
if (EditorGUI.EndChangeCheck())
{
curveProp.animationCurveValue = InspectorUtility.NormalizeCurve(curveProp.animationCurveValue);
if (curveProp.animationCurveValue.length < 1)
curveProp.animationCurveValue = new AnimationCurve();
curveProp.serializedObject.ApplyModifiedProperties();
}
float oldWidth = EditorGUIUtility.labelWidth;
EditorGUIUtility.labelWidth = textDimensions.x;
rect.x += rect.width; rect.width = floatFieldWidth + EditorGUIUtility.labelWidth;
EditorGUI.BeginChangeCheck();
EditorGUI.PropertyField(rect, timeProp, timeText);
if (EditorGUI.EndChangeCheck())
timeProp.floatValue = Mathf.Max(timeProp.floatValue, 0);
EditorGUIUtility.labelWidth = oldWidth;
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
float height = EditorGUIUtility.singleLineHeight + vSpace;
if (mExpanded)
height *= 5;
return height;
}
}
}