summaryrefslogtreecommitdiff
path: root/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Animation/ClipCurveEditor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Animation/ClipCurveEditor.cs')
-rw-r--r--Library/PackageCache/com.unity.timeline@1.2.13/Editor/Animation/ClipCurveEditor.cs332
1 files changed, 332 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Animation/ClipCurveEditor.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Animation/ClipCurveEditor.cs
new file mode 100644
index 0000000..da1d0e6
--- /dev/null
+++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Animation/ClipCurveEditor.cs
@@ -0,0 +1,332 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor.Timeline;
+using UnityEngine;
+using UnityEngine.Timeline;
+
+namespace UnityEditor
+{
+ class ClipCurveEditor
+ {
+ internal readonly CurveEditor m_CurveEditor;
+ static readonly CurveEditorSettings s_CurveEditorSettings = new CurveEditorSettings
+ {
+ hSlider = false,
+ vSlider = false,
+ hRangeLocked = false,
+ vRangeLocked = false,
+ scaleWithWindow = true,
+ hRangeMin = 0.0f,
+ showAxisLabels = true,
+ allowDeleteLastKeyInCurve = true,
+ rectangleToolFlags = CurveEditorSettings.RectangleToolFlags.MiniRectangleTool
+ };
+
+ static readonly float s_GridLabelWidth = 40.0f;
+
+ readonly BindingSelector m_BindingHierarchy;
+ public BindingSelector bindingHierarchy
+ {
+ get { return m_BindingHierarchy; }
+ }
+
+ public Rect shownAreaInsideMargins
+ {
+ get { return m_CurveEditor != null ? m_CurveEditor.shownAreaInsideMargins : new Rect(1, 1, 1, 1); }
+ }
+
+ Vector2 m_ScrollPosition = Vector2.zero;
+
+ readonly CurveDataSource m_DataSource;
+
+ float m_LastFrameRate = 30.0f;
+ int m_LastClipVersion = -1;
+ int m_LastCurveCount = -1;
+ TrackViewModelData m_ViewModel;
+ bool m_ShouldRestoreShownArea;
+
+ bool isNewSelection
+ {
+ get
+ {
+ if (m_ViewModel == null || m_DataSource == null)
+ return true;
+
+ return m_ViewModel.lastInlineCurveDataID != m_DataSource.id;
+ }
+ }
+
+ internal CurveEditor curveEditor
+ {
+ get { return m_CurveEditor; }
+ }
+
+ public ClipCurveEditor(CurveDataSource dataSource, TimelineWindow parentWindow, TrackAsset hostTrack)
+ {
+ m_DataSource = dataSource;
+
+ m_CurveEditor = new CurveEditor(new Rect(0, 0, 1000, 100), new CurveWrapper[0], false);
+
+ s_CurveEditorSettings.vTickStyle = new TickStyle
+ {
+ tickColor = { color = DirectorStyles.Instance.customSkin.colorInlineCurveVerticalLines },
+ distLabel = 20,
+ stubs = true
+ };
+
+ s_CurveEditorSettings.hTickStyle = new TickStyle
+ {
+ // hide horizontal lines by giving them a transparent color
+ tickColor = { color = new Color(0.0f, 0.0f, 0.0f, 0.0f) },
+ distLabel = 0
+ };
+
+ m_CurveEditor.settings = s_CurveEditorSettings;
+
+ m_ViewModel = TimelineWindowViewPrefs.GetTrackViewModelData(hostTrack);
+
+ m_ShouldRestoreShownArea = true;
+ m_CurveEditor.ignoreScrollWheelUntilClicked = true;
+ m_CurveEditor.curvesUpdated = OnCurvesUpdated;
+
+ m_BindingHierarchy = new BindingSelector(parentWindow, m_CurveEditor, m_ViewModel.inlineCurvesState);
+ }
+
+ public void SelectAllKeys()
+ {
+ m_CurveEditor.SelectAll();
+ }
+
+ public void FrameClip()
+ {
+ m_CurveEditor.InvalidateBounds();
+ m_CurveEditor.FrameClip(false, true);
+ }
+
+ public CurveDataSource dataSource
+ {
+ get { return m_DataSource; }
+ }
+
+ internal void OnCurvesUpdated()
+ {
+ if (m_DataSource == null)
+ return;
+
+ if (m_CurveEditor == null)
+ return;
+
+ if (m_CurveEditor.animationCurves.Length == 0)
+ return;
+
+ List<CurveWrapper> curvesToUpdate = m_CurveEditor.animationCurves.Where(c => c.changed).ToList();
+
+ // nothing changed, return.
+ if (curvesToUpdate.Count == 0)
+ return;
+
+ AnimationClip clip = m_DataSource.animationClip;
+
+ // something changed, manage the undo properly.
+ Undo.RegisterCompleteObjectUndo(clip, "Edit Clip Curve");
+
+ foreach (CurveWrapper c in curvesToUpdate)
+ {
+ AnimationUtility.SetEditorCurve(clip, c.binding, c.curve);
+ c.changed = false;
+ }
+
+ m_DataSource.UpdateCurves(curvesToUpdate);
+ }
+
+ public void DrawHeader(Rect headerRect)
+ {
+ m_BindingHierarchy.InitIfNeeded(headerRect, m_DataSource, isNewSelection);
+
+ try
+ {
+ GUILayout.BeginArea(headerRect);
+ m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUIStyle.none, GUI.skin.verticalScrollbar);
+ m_BindingHierarchy.OnGUI(new Rect(0, 0, headerRect.width, headerRect.height));
+ GUILayout.EndScrollView();
+ GUILayout.EndArea();
+ }
+ catch (Exception e)
+ {
+ Debug.LogException(e);
+ }
+ }
+
+ class FrameFormatCurveEditorState : ICurveEditorState
+ {
+ public TimeArea.TimeFormat timeFormat
+ {
+ get { return TimeArea.TimeFormat.Frame; }
+ }
+ public Vector2 timeRange { get { return new Vector2(0, 1); } }
+ public bool rippleTime { get { return false; } }
+ }
+
+ class UnformattedCurveEditorState : ICurveEditorState
+ {
+ public TimeArea.TimeFormat timeFormat
+ {
+ get { return TimeArea.TimeFormat.None; }
+ }
+ public Vector2 timeRange { get { return new Vector2(0, 1); } }
+ public bool rippleTime { get { return false; } }
+ }
+
+ void UpdateCurveEditorIfNeeded(WindowState state)
+ {
+ if ((Event.current.type != EventType.Layout) || (m_DataSource == null) || (m_BindingHierarchy == null) || (m_DataSource.animationClip == null))
+ return;
+
+ AnimationClipCurveInfo curveInfo = AnimationClipCurveCache.Instance.GetCurveInfo(m_DataSource.animationClip);
+ int version = curveInfo.version;
+ if (version != m_LastClipVersion)
+ {
+ // tree has changed
+ if (m_LastCurveCount != curveInfo.curves.Length)
+ {
+ m_BindingHierarchy.RefreshTree();
+ m_LastCurveCount = curveInfo.curves.Length;
+ }
+ else
+ {
+ // update just the curves
+ m_BindingHierarchy.RefreshCurves();
+ }
+ m_LastClipVersion = version;
+ }
+
+ if (state.timeInFrames)
+ m_CurveEditor.state = new FrameFormatCurveEditorState();
+ else
+ m_CurveEditor.state = new UnformattedCurveEditorState();
+
+ m_CurveEditor.invSnap = state.referenceSequence.frameRate;
+ }
+
+ public void DrawCurveEditor(Rect rect, WindowState state, Vector2 clipRange, bool loop, bool selected)
+ {
+ var curveEndTime = m_DataSource.start + m_DataSource.animationClip.length / m_DataSource.timeScale;
+ var curveRange = new Vector2(state.TimeToPixel(m_DataSource.start), state.TimeToPixel(curveEndTime));
+
+ SetupMarginsAndRect(rect, curveRange, state);
+ UpdateCurveEditorIfNeeded(state);
+
+ if (m_ShouldRestoreShownArea)
+ RestoreShownArea();
+ m_CurveEditor.SetShownHRangeInsideMargins(0.0f, m_DataSource.animationClip.length); //align the curve with the clip.
+
+ if (m_LastFrameRate != state.referenceSequence.frameRate)
+ {
+ m_CurveEditor.hTicks.SetTickModulosForFrameRate(state.referenceSequence.frameRate);
+ m_LastFrameRate = state.referenceSequence.frameRate;
+ }
+
+ foreach (var cw in m_CurveEditor.animationCurves)
+ cw.renderer.SetWrap(WrapMode.Default, loop ? WrapMode.Loop : WrapMode.Default);
+
+ using (new GUIGroupScope(rect))
+ {
+ var localRect = new Rect(0.0f, 0.0f, rect.width, rect.height);
+ var localClipRange = new Vector2(Mathf.Floor(clipRange.x - rect.xMin), Mathf.Ceil(clipRange.y - rect.xMin));
+ var localCurveRange = new Vector2(Mathf.Floor(curveRange.x - rect.xMin), Mathf.Ceil(curveRange.y - rect.xMin));
+
+ EditorGUI.DrawRect(new Rect(localCurveRange.x, 0.0f, 1.0f, rect.height), new Color(1.0f, 1.0f, 1.0f, 0.5f));
+ DrawCurveEditorBackground(localRect, localClipRange);
+
+ if (selected)
+ {
+ var selectionRect = new Rect(localClipRange.x, 0.0f, localClipRange.y - localClipRange.x, localRect.height);
+ DrawOutline(selectionRect);
+ }
+
+ EditorGUI.BeginChangeCheck();
+ {
+ var evt = Event.current;
+ if (evt.type == EventType.Layout || evt.type == EventType.Repaint || selected)
+ m_CurveEditor.CurveGUI();
+ }
+ if (EditorGUI.EndChangeCheck())
+ OnCurvesUpdated();
+
+ DrawOverlay(localRect, localClipRange, DirectorStyles.Instance.customSkin.colorInlineCurveOutOfRangeOverlay);
+ DrawGrid(localRect, localCurveRange);
+ }
+ }
+
+ void SetupMarginsAndRect(Rect rect, Vector2 curveRange, WindowState state)
+ {
+ var timelineWidth = state.TimeToPixel(Mathf.Max((float)state.editSequence.duration, state.timeAreaShownRange.y));
+ m_CurveEditor.rect = new Rect(-rect.xMin, 0.0f, timelineWidth, rect.height);
+ m_CurveEditor.leftmargin = curveRange.x;
+ m_CurveEditor.rightmargin = timelineWidth - curveRange.y;
+ m_CurveEditor.topmargin = m_CurveEditor.bottommargin = CalculateTopMargin(rect.height);
+ }
+
+ void RestoreShownArea()
+ {
+ if (isNewSelection)
+ FrameClip();
+ else
+ m_CurveEditor.shownAreaInsideMargins = m_ViewModel.inlineCurvesShownAreaInsideMargins;
+ m_ShouldRestoreShownArea = false;
+ }
+
+ static void DrawCurveEditorBackground(Rect rect, Vector2 activeRange)
+ {
+ if (EditorGUIUtility.isProSkin)
+ return;
+
+ var animEditorBackgroundRect = Rect.MinMaxRect(0.0f, rect.yMin, rect.xMax, rect.yMax);
+
+ // Curves are not legible in Personal Skin so we need to darken the background a bit.
+ EditorGUI.DrawRect(animEditorBackgroundRect, DirectorStyles.Instance.customSkin.colorInlineCurvesBackground);
+ }
+
+ static float CalculateTopMargin(float height)
+ {
+ return Mathf.Clamp(0.15f * height, 10.0f, 40.0f);
+ }
+
+ static void DrawOutline(Rect rect, float thickness = 2.0f)
+ {
+ // Draw top selected lines.
+ EditorGUI.DrawRect(new Rect(rect.xMin, rect.yMin, rect.width, thickness), Color.white);
+
+ // Draw bottom selected lines.
+ EditorGUI.DrawRect(new Rect(rect.xMin, rect.yMax - thickness, rect.width, thickness), Color.white);
+
+ // Draw Left Selected Lines
+ EditorGUI.DrawRect(new Rect(rect.xMin, rect.yMin, thickness, rect.height), Color.white);
+
+ // Draw Right Selected Lines
+ EditorGUI.DrawRect(new Rect(rect.xMax - thickness, rect.yMin, thickness, rect.height), Color.white);
+ }
+
+ static void DrawOverlay(Rect rect, Vector2 clipRange, Color color)
+ {
+ var leftSide = new Rect(rect.xMin, rect.yMin, clipRange.x - rect.xMin, rect.height);
+ EditorGUI.DrawRect(leftSide, color);
+
+ var rightSide = new Rect(Mathf.Max(0.0f, clipRange.y), rect.yMin, rect.xMax, rect.height);
+ EditorGUI.DrawRect(rightSide, color);
+ }
+
+ void DrawGrid(Rect rect, Vector2 curveRange)
+ {
+ var gridXPos = Mathf.Max(curveRange.x - s_GridLabelWidth, rect.xMin);
+ var gridRect = new Rect(gridXPos, rect.y, s_GridLabelWidth, rect.height);
+ var originalRect = m_CurveEditor.rect;
+
+ m_CurveEditor.rect = new Rect(0.0f, 0.0f, rect.width, rect.height);
+ using (new GUIGroupScope(gridRect))
+ m_CurveEditor.GridGUI();
+ m_CurveEditor.rect = originalRect;
+ }
+ }
+}