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.
86 lines
3.1 KiB
C#
86 lines
3.1 KiB
C#
1 year ago
|
using System;
|
||
|
using System.Globalization;
|
||
|
using UnityEngine.Timeline;
|
||
|
|
||
|
namespace UnityEditor.Timeline
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// The available display modes for time in the Timeline Editor.
|
||
|
/// </summary>
|
||
|
public enum TimeFormat
|
||
|
{
|
||
|
/// <summary>Displays time values as frames.</summary>
|
||
|
Frames,
|
||
|
|
||
|
/// <summary>Displays time values as timecode (SS:FF) format.</summary>
|
||
|
Timecode,
|
||
|
|
||
|
/// <summary>Displays time values as seconds.</summary>
|
||
|
Seconds
|
||
|
};
|
||
|
|
||
|
static class TimeDisplayUnitExtensions
|
||
|
{
|
||
|
public static TimeArea.TimeFormat ToTimeAreaFormat(this TimeFormat timeDisplayUnit)
|
||
|
{
|
||
|
switch (timeDisplayUnit)
|
||
|
{
|
||
|
case TimeFormat.Frames: return TimeArea.TimeFormat.Frame;
|
||
|
case TimeFormat.Timecode: return TimeArea.TimeFormat.TimeFrame;
|
||
|
case TimeFormat.Seconds: return TimeArea.TimeFormat.None;
|
||
|
}
|
||
|
|
||
|
return TimeArea.TimeFormat.Frame;
|
||
|
}
|
||
|
|
||
|
public static string ToTimeString(this TimeFormat timeFormat, double time, double frameRate, string format = "f2")
|
||
|
{
|
||
|
switch (timeFormat)
|
||
|
{
|
||
|
case TimeFormat.Frames: return TimeUtility.TimeAsFrames(time, frameRate, format);
|
||
|
case TimeFormat.Timecode: return TimeUtility.TimeAsTimeCode(time, frameRate, format);
|
||
|
case TimeFormat.Seconds: return time.ToString(format, (IFormatProvider)CultureInfo.InvariantCulture.NumberFormat);
|
||
|
}
|
||
|
|
||
|
return time.ToString(format);
|
||
|
}
|
||
|
|
||
|
public static string ToTimeStringWithDelta(this TimeFormat timeFormat, double time, double frameRate, double delta, string format = "f2")
|
||
|
{
|
||
|
const double epsilon = 1e-7;
|
||
|
var result = ToTimeString(timeFormat, time, frameRate, format);
|
||
|
if (delta > epsilon || delta < -epsilon)
|
||
|
{
|
||
|
var sign = ((delta >= 0) ? "+" : "-");
|
||
|
var deltaStr = ToTimeString(timeFormat, Math.Abs(delta), frameRate, format);
|
||
|
return $"{result} ({sign}{deltaStr})";
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
public static double FromTimeString(this TimeFormat timeFormat, string timeString, double frameRate, double defaultValue)
|
||
|
{
|
||
|
double time = defaultValue;
|
||
|
switch (timeFormat)
|
||
|
{
|
||
|
case TimeFormat.Frames:
|
||
|
if (!double.TryParse(timeString, NumberStyles.Any, CultureInfo.InvariantCulture, out time))
|
||
|
return defaultValue;
|
||
|
time = TimeUtility.FromFrames(time, frameRate);
|
||
|
break;
|
||
|
case TimeFormat.Seconds:
|
||
|
time = TimeUtility.ParseTimeSeconds(timeString, frameRate, defaultValue);
|
||
|
break;
|
||
|
case TimeFormat.Timecode:
|
||
|
time = TimeUtility.ParseTimeCode(timeString, frameRate, defaultValue);
|
||
|
break;
|
||
|
default:
|
||
|
time = defaultValue;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return time;
|
||
|
}
|
||
|
}
|
||
|
}
|