A game about forced loneliness, made by TACStudios
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}