AnimationTrackDrawer.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.ComponentModel;
  3. using System.Linq;
  4. using JetBrains.Annotations;
  5. using UnityEngine;
  6. using UnityEditor;
  7. using UnityEngine.Timeline;
  8. namespace UnityEditor.Timeline
  9. {
  10. [CustomTrackDrawer(typeof(AnimationTrack)), UsedImplicitly]
  11. class AnimationTrackDrawer : TrackDrawer
  12. {
  13. internal static class Styles
  14. {
  15. public static readonly GUIContent AnimationButtonOnTooltip = EditorGUIUtility.TrTextContent("", "Avatar Mask enabled\nClick to disable");
  16. public static readonly GUIContent AnimationButtonOffTooltip = EditorGUIUtility.TrTextContent("", "Avatar Mask disabled\nClick to enable");
  17. }
  18. public override bool DrawTrackHeaderButton(Rect rect, TrackAsset track, WindowState state)
  19. {
  20. var animTrack = track as AnimationTrack;
  21. bool hasAvatarMask = animTrack != null && animTrack.avatarMask != null;
  22. if (hasAvatarMask)
  23. {
  24. var style = animTrack.applyAvatarMask
  25. ? DirectorStyles.Instance.avatarMaskOn
  26. : DirectorStyles.Instance.avatarMaskOff;
  27. var tooltip = animTrack.applyAvatarMask
  28. ? Styles.AnimationButtonOnTooltip
  29. : Styles.AnimationButtonOffTooltip;
  30. if (GUI.Button(rect, tooltip, style))
  31. {
  32. animTrack.applyAvatarMask = !animTrack.applyAvatarMask;
  33. if (state != null)
  34. state.rebuildGraph = true;
  35. }
  36. }
  37. return hasAvatarMask;
  38. }
  39. public override void DrawRecordingBackground(Rect trackRect, TrackAsset trackAsset, Vector2 visibleTime, WindowState state)
  40. {
  41. base.DrawRecordingBackground(trackRect, trackAsset, visibleTime, state);
  42. DrawBorderOfAddedRecordingClip(trackRect, trackAsset, visibleTime, (WindowState)state);
  43. }
  44. static void DrawBorderOfAddedRecordingClip(Rect trackRect, TrackAsset trackAsset, Vector2 visibleTime, WindowState state)
  45. {
  46. if (!state.IsArmedForRecord(trackAsset))
  47. return;
  48. AnimationTrack animTrack = trackAsset as AnimationTrack;
  49. if (animTrack == null || !animTrack.inClipMode)
  50. return;
  51. // make sure there is no clip but we can add one
  52. TimelineClip clip = null;
  53. if (trackAsset.FindRecordingClipAtTime(state.editSequence.time, out clip) || clip != null)
  54. return;
  55. float yMax = trackRect.yMax;
  56. float yMin = trackRect.yMin;
  57. double startGap = 0;
  58. double endGap = 0;
  59. trackAsset.GetGapAtTime(state.editSequence.time, out startGap, out endGap);
  60. if (double.IsInfinity(endGap))
  61. endGap = visibleTime.y;
  62. if (startGap > visibleTime.y || endGap < visibleTime.x)
  63. return;
  64. startGap = Math.Max(startGap, visibleTime.x);
  65. endGap = Math.Min(endGap, visibleTime.y);
  66. float xMin = state.TimeToPixel(startGap);
  67. float xMax = state.TimeToPixel(endGap);
  68. var r = Rect.MinMaxRect(xMin, yMin, xMax, yMax);
  69. ClipDrawer.DrawClipSelectionBorder(r, ClipBorder.Recording(), ClipBlends.kNone);
  70. }
  71. }
  72. }