123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using UnityEngine.Timeline;
-
- namespace UnityEditor.Timeline
- {
- enum CurveChangeType
- {
- None,
- CurveModified,
- CurveAddedOrRemoved
- }
-
- abstract class CurveDataSource
- {
- public static CurveDataSource Create(IRowGUI trackGUI)
- {
- if (trackGUI.asset is AnimationTrack)
- return new InfiniteClipCurveDataSource(trackGUI);
-
- return new TrackParametersCurveDataSource(trackGUI);
- }
-
- public static CurveDataSource Create(TimelineClipGUI clipGUI)
- {
- if (clipGUI.clip.animationClip != null)
- return new ClipAnimationCurveDataSource(clipGUI);
-
- return new ClipParametersCurveDataSource(clipGUI);
- }
-
- int? m_ID = null;
- public int id
- {
- get
- {
- if (!m_ID.HasValue)
- m_ID = CreateHashCode();
-
- return m_ID.Value;
- }
- }
-
- readonly IRowGUI m_TrackGUI;
- protected CurveDataSource(IRowGUI trackGUI)
- {
- m_TrackGUI = trackGUI;
- }
-
- public abstract AnimationClip animationClip { get; }
-
- public abstract float start { get; }
- public abstract float timeScale { get; }
- public abstract string groupingName { get; }
-
- // Applies changes from the visual curve in the curve wrapper back to the animation clips
- public virtual void ApplyCurveChanges(IEnumerable<CurveWrapper> updatedCurves)
- {
- Undo.RegisterCompleteObjectUndo(animationClip, "Edit Clip Curve");
- foreach (CurveWrapper c in updatedCurves)
- {
- if (c.curve.length > 0)
- AnimationUtility.SetEditorCurve(animationClip, c.binding, c.curve);
- else
- RemoveCurves(new[] { c.binding });
- c.changed = false;
- }
- }
-
- /// <summary>The clip version is a value that will change when a curve gets updated.
- /// it's used to detect when an animation clip has been changed externally </summary>
- /// <returns>A versioning value indicating the state of the curve. If the curve is updated externally this value will change. </returns>
- public virtual UInt64 GetClipVersion()
- {
- return animationClip.ClipVersion();
- }
-
- /// <summary>Call this method to check if the underlying clip has changed</summary>
- /// <param name="curveVersion">A versioning value. This will be updated to the latest version</param>
- /// <returns>A value indicating how the clip has changed</returns>
- public virtual CurveChangeType UpdateExternalChanges(ref UInt64 curveVersion)
- {
- return animationClip.GetChangeType(ref curveVersion);
- }
-
- public virtual string ModifyPropertyDisplayName(string path, string propertyName) => propertyName;
-
- public virtual void RemoveCurves(IEnumerable<EditorCurveBinding> bindings)
- {
- Undo.RegisterCompleteObjectUndo(animationClip, "Remove Curve(s)");
- foreach (var binding in bindings)
- {
- if (binding.isPPtrCurve)
- AnimationUtility.SetObjectReferenceCurve(animationClip, binding, null);
- else
- AnimationUtility.SetEditorCurve(animationClip, binding, null);
- }
- }
-
- public Rect GetBackgroundRect(WindowState state)
- {
- var trackRect = m_TrackGUI.boundingRect;
- return new Rect(
- state.timeAreaTranslation.x + trackRect.xMin,
- trackRect.y,
- (float)state.editSequence.asset.duration * state.timeAreaScale.x,
- trackRect.height
- );
- }
-
- public List<CurveWrapper> GenerateWrappers(IEnumerable<EditorCurveBinding> bindings)
- {
- var wrappers = new List<CurveWrapper>(bindings.Count());
- int curveWrapperId = 0;
-
- foreach (EditorCurveBinding b in bindings)
- {
- // General configuration
- var wrapper = new CurveWrapper
- {
- id = curveWrapperId++,
- binding = b,
- groupId = -1,
- hidden = false,
- readOnly = false,
- getAxisUiScalarsCallback = () => new Vector2(1, 1)
- };
-
- // Specific configuration
- ConfigureCurveWrapper(wrapper);
-
- wrappers.Add(wrapper);
- }
-
- return wrappers;
- }
-
- protected virtual void ConfigureCurveWrapper(CurveWrapper wrapper)
- {
- wrapper.color = CurveUtility.GetPropertyColor(wrapper.binding.propertyName);
- wrapper.renderer = new NormalCurveRenderer(AnimationUtility.GetEditorCurve(animationClip, wrapper.binding));
- wrapper.renderer.SetCustomRange(0.0f, animationClip.length);
- }
-
- protected virtual int CreateHashCode()
- {
- return m_TrackGUI.asset.GetHashCode();
- }
- }
-
- class ClipAnimationCurveDataSource : CurveDataSource
- {
- static readonly string k_GroupingName = L10n.Tr("Animated Values");
-
- readonly TimelineClipGUI m_ClipGUI;
-
- public ClipAnimationCurveDataSource(TimelineClipGUI clipGUI) : base(clipGUI.parent)
- {
- m_ClipGUI = clipGUI;
- }
-
- public override AnimationClip animationClip
- {
- get { return m_ClipGUI.clip.animationClip; }
- }
-
- public override float start
- {
- get { return (float)m_ClipGUI.clip.FromLocalTimeUnbound(0.0); }
- }
-
- public override float timeScale
- {
- get { return (float)m_ClipGUI.clip.timeScale; }
- }
-
- public override string groupingName
- {
- get { return k_GroupingName; }
- }
-
- protected override int CreateHashCode()
- {
- return base.CreateHashCode().CombineHash(m_ClipGUI.clip.GetHashCode());
- }
-
- public override string ModifyPropertyDisplayName(string path, string propertyName)
- {
- if (!AnimatedPropertyUtility.IsMaterialProperty(propertyName))
- return propertyName;
-
- var track = m_ClipGUI.clip.GetParentTrack();
- if (track == null)
- return propertyName;
-
- var gameObjectBinding = TimelineUtility.GetSceneGameObject(TimelineEditor.inspectedDirector, track);
- if (gameObjectBinding == null)
- return propertyName;
-
- if (!string.IsNullOrEmpty(path))
- {
- var transform = gameObjectBinding.transform.Find(path);
- if (transform == null)
- return propertyName;
- gameObjectBinding = transform.gameObject;
- }
-
- return AnimatedPropertyUtility.RemapMaterialName(gameObjectBinding, propertyName);
- }
- }
-
- class ClipParametersCurveDataSource : CurveDataSource
- {
- static readonly string k_GroupingName = L10n.Tr("Clip Properties");
-
- readonly TimelineClipGUI m_ClipGUI;
- readonly CurvesProxy m_CurvesProxy;
-
- private int m_ClipDirtyVersion;
-
- public ClipParametersCurveDataSource(TimelineClipGUI clipGUI) : base(clipGUI.parent)
- {
- m_ClipGUI = clipGUI;
- m_CurvesProxy = new CurvesProxy(clipGUI.clip);
- }
-
- public override AnimationClip animationClip
- {
- get { return m_CurvesProxy.curves; }
- }
-
- public override UInt64 GetClipVersion()
- {
- return sourceAnimationClip.ClipVersion();
- }
-
- public override CurveChangeType UpdateExternalChanges(ref ulong curveVersion)
- {
- if (m_ClipGUI == null || m_ClipGUI.clip == null)
- return CurveChangeType.None;
-
- var changeType = sourceAnimationClip.GetChangeType(ref curveVersion);
- if (changeType != CurveChangeType.None)
- {
- m_CurvesProxy.ApplyExternalChangesToProxy();
- }
- else if (m_ClipDirtyVersion != m_ClipGUI.clip.DirtyIndex)
- {
- m_CurvesProxy.UpdateProxyCurves();
- if (changeType == CurveChangeType.None)
- changeType = CurveChangeType.CurveModified;
- }
- m_ClipDirtyVersion = m_ClipGUI.clip.DirtyIndex;
- return changeType;
- }
-
- public override float start
- {
- get { return (float)m_ClipGUI.clip.FromLocalTimeUnbound(0.0); }
- }
-
- public override float timeScale
- {
- get { return (float)m_ClipGUI.clip.timeScale; }
- }
-
- public override string groupingName
- {
- get { return k_GroupingName; }
- }
-
- public override void RemoveCurves(IEnumerable<EditorCurveBinding> bindings)
- {
- m_CurvesProxy.RemoveCurves(bindings);
- }
-
- public override void ApplyCurveChanges(IEnumerable<CurveWrapper> updatedCurves)
- {
- m_CurvesProxy.UpdateCurves(updatedCurves);
- }
-
- protected override void ConfigureCurveWrapper(CurveWrapper wrapper)
- {
- m_CurvesProxy.ConfigureCurveWrapper(wrapper);
- }
-
- protected override int CreateHashCode()
- {
- return base.CreateHashCode().CombineHash(m_ClipGUI.clip.GetHashCode());
- }
-
- private AnimationClip sourceAnimationClip
- {
- get
- {
- if (m_ClipGUI == null || m_ClipGUI.clip == null || m_ClipGUI.clip.curves == null)
- return null;
- return m_ClipGUI.clip.curves;
- }
- }
- }
-
- class InfiniteClipCurveDataSource : CurveDataSource
- {
- static readonly string k_GroupingName = L10n.Tr("Animated Values");
-
- readonly AnimationTrack m_AnimationTrack;
-
- public InfiniteClipCurveDataSource(IRowGUI trackGui) : base(trackGui)
- {
- m_AnimationTrack = trackGui.asset as AnimationTrack;
- }
-
- public override AnimationClip animationClip
- {
- get { return m_AnimationTrack.infiniteClip; }
- }
-
- public override float start
- {
- get { return 0.0f; }
- }
-
- public override float timeScale
- {
- get { return 1.0f; }
- }
-
- public override string groupingName
- {
- get { return k_GroupingName; }
- }
-
- public override string ModifyPropertyDisplayName(string path, string propertyName)
- {
- if (m_AnimationTrack == null || !AnimatedPropertyUtility.IsMaterialProperty(propertyName))
- return propertyName;
-
- var binding = m_AnimationTrack.GetBinding(TimelineEditor.inspectedDirector);
- if (binding == null)
- return propertyName;
-
- var target = binding.transform;
- if (!string.IsNullOrEmpty(path))
- target = target.Find(path);
-
- if (target == null)
- return propertyName;
-
- return AnimatedPropertyUtility.RemapMaterialName(target.gameObject, propertyName);
- }
- }
-
- class TrackParametersCurveDataSource : CurveDataSource
- {
- static readonly string k_GroupingName = L10n.Tr("Track Properties");
-
- readonly CurvesProxy m_CurvesProxy;
- private int m_TrackDirtyVersion;
-
- public TrackParametersCurveDataSource(IRowGUI trackGui) : base(trackGui)
- {
- m_CurvesProxy = new CurvesProxy(trackGui.asset);
- }
-
- public override AnimationClip animationClip
- {
- get { return m_CurvesProxy.curves; }
- }
-
- public override UInt64 GetClipVersion()
- {
- return sourceAnimationClip.ClipVersion();
- }
-
- public override CurveChangeType UpdateExternalChanges(ref ulong curveVersion)
- {
- if (m_CurvesProxy.targetTrack == null)
- return CurveChangeType.None;
-
- var changeType = sourceAnimationClip.GetChangeType(ref curveVersion);
- if (changeType != CurveChangeType.None)
- {
- m_CurvesProxy.ApplyExternalChangesToProxy();
- }
- // track property has changed externally, update the curve proxies
- else if (m_TrackDirtyVersion != m_CurvesProxy.targetTrack.DirtyIndex)
- {
- if (changeType == CurveChangeType.None)
- changeType = CurveChangeType.CurveModified;
- m_CurvesProxy.UpdateProxyCurves();
- }
- m_TrackDirtyVersion = m_CurvesProxy.targetTrack.DirtyIndex;
- return changeType;
- }
-
- public override float start
- {
- get { return 0.0f; }
- }
-
- public override float timeScale
- {
- get { return 1.0f; }
- }
-
- public override string groupingName
- {
- get { return k_GroupingName; }
- }
-
- public override void RemoveCurves(IEnumerable<EditorCurveBinding> bindings)
- {
- m_CurvesProxy.RemoveCurves(bindings);
- }
-
- public override void ApplyCurveChanges(IEnumerable<CurveWrapper> updatedCurves)
- {
- m_CurvesProxy.UpdateCurves(updatedCurves);
- }
-
- protected override void ConfigureCurveWrapper(CurveWrapper wrapper)
- {
- m_CurvesProxy.ConfigureCurveWrapper(wrapper);
- }
-
- private AnimationClip sourceAnimationClip
- {
- get
- {
- if (m_CurvesProxy.targetTrack == null || m_CurvesProxy.targetTrack.curves == null)
- return null;
- return m_CurvesProxy.targetTrack.curves;
- }
- }
- }
- }
|