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.

67 lines
2.7 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Timeline;
using TimelineEditorSettings = UnityEngine.Timeline.TimelineAsset.EditorSettings;
#if TIMELINE_FRAMEACCURATE
using UnityEngine.Playables;
#endif
namespace UnityEditor.Timeline
{
[CustomPropertyDrawer(typeof(FrameRateFieldAttribute), true)]
class FrameRateDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var frameRateAttribute = attribute as FrameRateFieldAttribute;
if (frameRateAttribute == null)
return;
EditorGUI.BeginProperty(position, label, property);
property.doubleValue = FrameRateField(property.doubleValue, label, position, out bool frameRateIsValid);
EditorGUI.EndProperty();
#if TIMELINE_FRAMEACCURATE
if (!frameRateIsValid && TimelinePreferences.instance.playbackLockedToFrame)
EditorGUILayout.HelpBox(
L10n.Tr("Locking playback cannot be enabled for this frame rate."),
MessageType.Warning);
#endif
}
public static double FrameRateField(double frameRate, GUIContent label, Rect position, out bool isValid)
{
double frameRateDouble = FrameRateDisplayUtility.RoundFrameRate(frameRate);
FrameRate frameRateObj = TimeUtility.GetClosestFrameRate(frameRateDouble);
isValid = frameRateObj.IsValid();
TimeUtility.ToStandardFrameRate(frameRateObj, out StandardFrameRates option);
position = EditorGUI.PrefixLabel(position, label);
Rect posPopup = new Rect(position.x, position.y, position.width / 2, position.height);
Rect posFloatField = new Rect(posPopup.xMax, position.y, position.width / 2, position.height);
using (var checkOption = new EditorGUI.ChangeCheckScope())
{
option = (StandardFrameRates)EditorGUI.Popup(posPopup, (int)option,
FrameRateDisplayUtility.GetDefaultFrameRatesLabels(option));
if (checkOption.changed)
{
isValid = true;
return TimeUtility.ToFrameRate(option).rate;
}
}
using (var checkFrame = new EditorGUI.ChangeCheckScope())
{
frameRateDouble = Math.Abs(EditorGUI.DoubleField(posFloatField, frameRateDouble));
frameRateObj = TimeUtility.GetClosestFrameRate(frameRateDouble);
if (checkFrame.changed)
{
isValid = frameRateObj.IsValid();
return isValid ? frameRateObj.rate : frameRateDouble;
}
}
return frameRateDouble;
}
}
}