85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			85 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | 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.end) < TimeUtility.kFrameRateEpsilon || time > playRangeTime.end || time < playRangeTime.start) | ||
|  |             { | ||
|  |                 state.masterSequence.time = playRangeTime.start; | ||
|  |                 // 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(); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |