You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.7 KiB
66 lines
2.7 KiB
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; |
|
} |
|
} |
|
}
|
|
|