123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- using System;
- using UnityEditorInternal;
- using UnityEngine;
- using UnityEngine.Timeline;
- using Object = UnityEngine.Object;
- namespace UnityEditor.Timeline
- {
- class TimelineWindowTimeControl : IAnimationWindowControl
- {
- [Serializable]
- public struct ClipData
- {
- public double start;
- public double duration;
- public TrackAsset track;
- }
- [SerializeField] ClipData m_ClipData;
- [SerializeField] TimelineClip m_Clip;
- [SerializeField] AnimationWindowState m_AnimWindowState;
- TrackAsset track
- {
- get
- {
- if (m_Clip != null)
- {
- return m_Clip.parentTrack;
- }
- return m_ClipData.track;
- }
- }
- static TimelineWindow window
- {
- get
- {
- return TimelineWindow.instance;
- }
- }
- static WindowState state
- {
- get
- {
- if (window != null)
- return window.state;
- return null;
- }
- }
- void OnStateChange()
- {
- if (state != null && state.dirtyStamp > 0 && m_AnimWindowState != null)
- m_AnimWindowState.Repaint();
- }
- public void Init(AnimationWindowState animState, TimelineClip clip)
- {
- m_Clip = clip;
- m_AnimWindowState = animState;
- }
- public void Init(AnimationWindowState animState, ClipData clip)
- {
- m_ClipData = clip;
- m_AnimWindowState = animState;
- }
- public override void OnEnable()
- {
- if (state != null)
- state.OnTimeChange += OnStateChange;
- base.OnEnable();
- }
- public void OnDisable()
- {
- if (state != null)
- state.OnTimeChange -= OnStateChange;
- }
- public override AnimationKeyTime time
- {
- get
- {
- if (state == null)
- return AnimationKeyTime.Time(0.0f, 0.0f);
- return AnimationKeyTime.Time(ToAnimationClipTime(state.editSequence.time), state.referenceSequence.frameRate);
- }
- }
- void ChangeTime(float newTime)
- {
- if (state != null && state.editSequence.director != null)
- {
- // avoid rounding errors
- var finalTime = ToGlobalTime(newTime);
- if (TimeUtility.OnFrameBoundary(finalTime, state.referenceSequence.frameRate, TimeUtility.kFrameRateEpsilon))
- finalTime = TimeUtility.RoundToFrame(finalTime, state.referenceSequence.frameRate);
- state.editSequence.time = finalTime;
- window.Repaint();
- }
- }
- static void ChangeFrame(int frame)
- {
- if (state != null)
- {
- state.editSequence.frame = frame;
- window.Repaint();
- }
- }
- public override void GoToTime(float newTime)
- {
- ChangeTime(newTime);
- }
- public override void GoToFrame(int frame)
- {
- ChangeFrame(frame);
- }
- public override void StartScrubTime() {}
- public override void EndScrubTime() {}
- public override void ScrubTime(float newTime)
- {
- ChangeTime(newTime);
- }
- public override void GoToPreviousFrame()
- {
- if (state != null)
- ChangeFrame(state.editSequence.frame - 1);
- }
- public override void GoToNextFrame()
- {
- if (state != null)
- ChangeFrame(state.editSequence.frame + 1);
- }
- AnimationWindowCurve[] GetCurves()
- {
- var curves =
- (m_AnimWindowState.showCurveEditor &&
- m_AnimWindowState.activeCurves.Count > 0) ? m_AnimWindowState.activeCurves : m_AnimWindowState.allCurves;
- return curves.ToArray();
- }
- public override void GoToPreviousKeyframe()
- {
- var newTime = AnimationWindowUtility.GetPreviousKeyframeTime(GetCurves(), time.time, m_AnimWindowState.clipFrameRate);
- GoToTime(m_AnimWindowState.SnapToFrame(newTime, AnimationWindowState.SnapMode.SnapToClipFrame));
- }
- public override void GoToNextKeyframe()
- {
- var newTime = AnimationWindowUtility.GetNextKeyframeTime(GetCurves(), time.time, m_AnimWindowState.clipFrameRate);
- GoToTime(m_AnimWindowState.SnapToFrame(newTime, AnimationWindowState.SnapMode.SnapToClipFrame));
- }
- public override void GoToFirstKeyframe()
- {
- GoToTime(0);
- }
- public override void GoToLastKeyframe()
- {
- double animClipTime = 0;
- if (m_Clip != null)
- {
- var curves = m_Clip.curves;
- var animAsset = m_Clip.asset as AnimationPlayableAsset;
- if (animAsset != null)
- {
- animClipTime = animAsset.clip != null ? animAsset.clip.length : 0;
- }
- else if (curves != null)
- {
- animClipTime = curves.length;
- }
- else
- {
- animClipTime = m_Clip.clipAssetDuration;
- }
- }
- else
- {
- animClipTime = m_ClipData.duration;
- }
- GoToTime((float)animClipTime);
- }
- public override bool canPlay
- {
- get
- {
- return state != null && state.previewMode;
- }
- }
- public override bool playing
- {
- get
- {
- return state != null && state.playing;
- }
- }
- static void SetPlaybackState(bool playbackState)
- {
- if (state == null || playbackState == state.playing)
- return;
- state.SetPlaying(playbackState);
- }
- public override bool StartPlayback()
- {
- SetPlaybackState(true);
- return state != null && state.playing;
- }
- public override void StopPlayback()
- {
- SetPlaybackState(false);
- }
- public override bool PlaybackUpdate() { return state != null && state.playing; }
- public override bool canRecord
- {
- get { return state != null && state.canRecord; }
- }
- public override bool recording
- {
- get { return state != null && state.recording; }
- }
- public override bool canPreview
- {
- get { return false; }
- }
- public override bool previewing
- {
- get { return false; }
- }
- public override bool StartRecording(Object targetObject)
- {
- if (!canRecord)
- return false;
- if (track != null && state != null && !state.ignorePreview)
- {
- state.ArmForRecord(track);
- return state.recording;
- }
- return false;
- }
- public override void StopRecording()
- {
- if (track != null && state != null && !state.ignorePreview)
- state.UnarmForRecord(track);
- }
- public override void OnSelectionChanged() {}
- public override void ResampleAnimation() {}
- public override bool StartPreview()
- {
- if (state != null)
- state.previewMode = true;
- return state != null && state.previewMode;
- }
- public override void StopPreview()
- {
- if (state != null)
- state.previewMode = false;
- }
- public override void ProcessCandidates() {}
- public override void ClearCandidates() {}
- double ToGlobalTime(float localTime)
- {
- if (m_Clip != null)
- return Math.Max(0, m_Clip.FromLocalTimeUnbound(localTime));
- return Math.Max(0, m_ClipData.start + localTime);
- }
- float ToAnimationClipTime(double globalTime)
- {
- if (m_Clip != null)
- return (float)m_Clip.ToLocalTimeUnbound(globalTime);
- return (float)(globalTime - m_ClipData.start);
- }
- }
- }
|