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.
84 lines
2.8 KiB
84 lines
2.8 KiB
using System; |
|
using UnityEngine; |
|
using UnityEngine.Playables; |
|
using UnityEngine.Timeline; |
|
|
|
namespace UnityEditor.Timeline |
|
{ |
|
partial class TimelineWindow |
|
{ |
|
void OnPreviewPlayModeChanged(bool isPlaying) |
|
{ |
|
if (state != null && !state.ignorePreview && isPlaying) |
|
{ |
|
PreparePreviewPlay(); |
|
EditorApplication.update += OnPreviewPlay; |
|
} |
|
else |
|
{ |
|
EditorApplication.update -= OnPreviewPlay; |
|
} |
|
} |
|
|
|
void PreparePreviewPlay() |
|
{ |
|
if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null) |
|
return; |
|
if (state.playRangeEnabled && !state.isJogging) |
|
{ |
|
EnsurePlayRangeIsRespected(); |
|
} |
|
} |
|
|
|
internal void OnPreviewPlay() |
|
{ |
|
if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null) |
|
return; |
|
|
|
var director = state.masterSequence.director; |
|
if (director.timeUpdateMode == DirectorUpdateMode.Manual) |
|
{ |
|
Repaint(); |
|
return; |
|
} |
|
|
|
if (state.isJogging) |
|
{ |
|
ApplyJog(); |
|
} |
|
else if (state.playRangeEnabled) |
|
{ |
|
EnsurePlayRangeIsRespected(); |
|
} |
|
|
|
if (director.extrapolationMode == DirectorWrapMode.None && director.playableGraph.IsValid() && !state.playRangeEnabled && director.playableGraph.IsDone()) |
|
{ |
|
//reset time if we hit the end of the timeline |
|
state.masterSequence.time = 0.0; |
|
state.Pause(); |
|
} |
|
|
|
Repaint(); |
|
AudioMixerWindow.RepaintAudioMixerWindow(); |
|
} |
|
|
|
void ApplyJog() |
|
{ |
|
state.masterSequence.time = Math.Max(0.0, Math.Min(state.masterSequence.duration, state.masterSequence.time + state.playbackSpeed)); |
|
} |
|
|
|
void EnsurePlayRangeIsRespected() |
|
{ |
|
var playRangeTime = state.playRange; |
|
var time = state.masterSequence.time; |
|
if (Math.Abs(time - playRangeTime.y) < TimeUtility.kFrameRateEpsilon || time > playRangeTime.y || time < playRangeTime.x) |
|
{ |
|
state.masterSequence.time = playRangeTime.x; |
|
// case 1215926 : Special case to make the director mode to play if the wrap mode is None. |
|
// In that mode, the engine stop the graph before we can ensure play range is respected. |
|
if (!state.playing && state.masterSequence.director.extrapolationMode == DirectorWrapMode.None) |
|
state.Play(); |
|
} |
|
} |
|
} |
|
}
|
|
|