A game about forced loneliness, made by TACStudios
at master 84 lines 2.8 kB view raw
1using System; 2using UnityEngine; 3using UnityEngine.Playables; 4using UnityEngine.Timeline; 5 6namespace UnityEditor.Timeline 7{ 8 partial class TimelineWindow 9 { 10 void OnPreviewPlayModeChanged(bool isPlaying) 11 { 12 if (state != null && !state.ignorePreview && isPlaying) 13 { 14 PreparePreviewPlay(); 15 EditorApplication.update += OnPreviewPlay; 16 } 17 else 18 { 19 EditorApplication.update -= OnPreviewPlay; 20 } 21 } 22 23 void PreparePreviewPlay() 24 { 25 if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null) 26 return; 27 if (state.playRangeEnabled && !state.isJogging) 28 { 29 EnsurePlayRangeIsRespected(); 30 } 31 } 32 33 internal void OnPreviewPlay() 34 { 35 if (state == null || state.masterSequence.asset == null || state.masterSequence.director == null) 36 return; 37 38 var director = state.masterSequence.director; 39 if (director.timeUpdateMode == DirectorUpdateMode.Manual) 40 { 41 Repaint(); 42 return; 43 } 44 45 if (state.isJogging) 46 { 47 ApplyJog(); 48 } 49 else if (state.playRangeEnabled) 50 { 51 EnsurePlayRangeIsRespected(); 52 } 53 54 if (director.extrapolationMode == DirectorWrapMode.None && director.playableGraph.IsValid() && !state.playRangeEnabled && director.playableGraph.IsDone()) 55 { 56 //reset time if we hit the end of the timeline 57 state.masterSequence.time = 0.0; 58 state.Pause(); 59 } 60 61 Repaint(); 62 AudioMixerWindow.RepaintAudioMixerWindow(); 63 } 64 65 void ApplyJog() 66 { 67 state.masterSequence.time = Math.Max(0.0, Math.Min(state.masterSequence.duration, state.masterSequence.time + state.playbackSpeed)); 68 } 69 70 void EnsurePlayRangeIsRespected() 71 { 72 var playRangeTime = state.playRange; 73 var time = state.masterSequence.time; 74 if (Math.Abs(time - playRangeTime.end) < TimeUtility.kFrameRateEpsilon || time > playRangeTime.end || time < playRangeTime.start) 75 { 76 state.masterSequence.time = playRangeTime.start; 77 // case 1215926 : Special case to make the director mode to play if the wrap mode is None. 78 // In that mode, the engine stop the graph before we can ensure play range is respected. 79 if (!state.playing && state.masterSequence.director.extrapolationMode == DirectorWrapMode.None) 80 state.Play(); 81 } 82 } 83 } 84}