67 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			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; | ||
|  |         } | ||
|  |     } | ||
|  | } |