AnimationTrackActions.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System.ComponentModel;
  2. using System.Linq;
  3. using JetBrains.Annotations;
  4. using UnityEngine;
  5. using UnityEngine.Timeline;
  6. namespace UnityEditor.Timeline
  7. {
  8. [MenuEntry("Add Override Track", MenuOrder.CustomTrackAction.AnimAddOverrideTrack), UsedImplicitly]
  9. class AddOverrideTrackAction : TrackAction
  10. {
  11. public override bool Execute(WindowState state, TrackAsset[] tracks)
  12. {
  13. foreach (var animTrack in tracks.OfType<AnimationTrack>())
  14. {
  15. TimelineHelpers.CreateTrack(typeof(AnimationTrack), animTrack, "Override " + animTrack.GetChildTracks().Count());
  16. }
  17. return true;
  18. }
  19. protected override MenuActionDisplayState GetDisplayState(WindowState state, TrackAsset[] tracks)
  20. {
  21. if (tracks.Any(t => t.isSubTrack || !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
  22. return MenuActionDisplayState.Hidden;
  23. if (tracks.Any(t => t.lockedInHierarchy))
  24. return MenuActionDisplayState.Disabled;
  25. return MenuActionDisplayState.Visible;
  26. }
  27. }
  28. [MenuEntry("Convert To Clip Track", MenuOrder.CustomTrackAction.AnimConvertToClipMode), UsedImplicitly]
  29. class ConvertToClipModeAction : TrackAction
  30. {
  31. public override bool Execute(WindowState state, TrackAsset[] tracks)
  32. {
  33. foreach (var animTrack in tracks.OfType<AnimationTrack>())
  34. animTrack.ConvertToClipMode();
  35. TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved);
  36. return true;
  37. }
  38. protected override MenuActionDisplayState GetDisplayState(WindowState state, TrackAsset[] tracks)
  39. {
  40. if (tracks.Any(t => !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
  41. return MenuActionDisplayState.Hidden;
  42. if (tracks.Any(t => t.lockedInHierarchy))
  43. return MenuActionDisplayState.Disabled;
  44. if (tracks.OfType<AnimationTrack>().All(a => a.CanConvertToClipMode()))
  45. return MenuActionDisplayState.Visible;
  46. return MenuActionDisplayState.Hidden;
  47. }
  48. }
  49. [MenuEntry("Convert To Infinite Clip", MenuOrder.CustomTrackAction.AnimConvertFromClipMode), UsedImplicitly]
  50. class ConvertFromClipTrackAction : TrackAction
  51. {
  52. public override bool Execute(WindowState state, TrackAsset[] tracks)
  53. {
  54. foreach (var animTrack in tracks.OfType<AnimationTrack>())
  55. animTrack.ConvertFromClipMode(state.editSequence.asset);
  56. TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved);
  57. return true;
  58. }
  59. protected override MenuActionDisplayState GetDisplayState(WindowState state, TrackAsset[] tracks)
  60. {
  61. if (tracks.Any(t => !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
  62. return MenuActionDisplayState.Hidden;
  63. if (tracks.Any(t => t.lockedInHierarchy))
  64. return MenuActionDisplayState.Disabled;
  65. if (tracks.OfType<AnimationTrack>().All(a => a.CanConvertFromClipMode()))
  66. return MenuActionDisplayState.Visible;
  67. return MenuActionDisplayState.Hidden;
  68. }
  69. }
  70. abstract class TrackOffsetBaseAction : TrackAction
  71. {
  72. public abstract TrackOffset trackOffset { get; }
  73. protected override MenuActionDisplayState GetDisplayState(WindowState state, TrackAsset[] tracks)
  74. {
  75. if (tracks.Any(t => !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
  76. return MenuActionDisplayState.Hidden;
  77. if (tracks.Any(t => t.lockedInHierarchy))
  78. return MenuActionDisplayState.Disabled;
  79. return MenuActionDisplayState.Visible;
  80. }
  81. protected override bool IsChecked(WindowState state, TrackAsset[] tracks)
  82. {
  83. return tracks.OfType<AnimationTrack>().All(t => t.trackOffset == trackOffset);
  84. }
  85. public override bool Execute(WindowState state, TrackAsset[] tracks)
  86. {
  87. foreach (var animTrack in tracks.OfType<AnimationTrack>())
  88. {
  89. state.UnarmForRecord(animTrack);
  90. TimelineUndo.PushUndo(animTrack, "Set Transform Offsets");
  91. animTrack.trackOffset = trackOffset;
  92. }
  93. TimelineEditor.Refresh(RefreshReason.ContentsModified);
  94. return true;
  95. }
  96. }
  97. [MenuEntry("Track Offsets/Apply Transform Offsets", MenuOrder.CustomTrackAction.AnimApplyTrackOffset), UsedImplicitly]
  98. class ApplyTransformOffsetAction : TrackOffsetBaseAction
  99. {
  100. public override TrackOffset trackOffset
  101. {
  102. get { return TrackOffset.ApplyTransformOffsets; }
  103. }
  104. }
  105. [MenuEntry("Track Offsets/Apply Scene Offsets", MenuOrder.CustomTrackAction.AnimApplySceneOffset), UsedImplicitly]
  106. class ApplySceneOffsetAction : TrackOffsetBaseAction
  107. {
  108. public override TrackOffset trackOffset
  109. {
  110. get { return TrackOffset.ApplySceneOffsets; }
  111. }
  112. }
  113. [MenuEntry("Track Offsets/Auto (Deprecated)", MenuOrder.CustomTrackAction.AnimApplyAutoOffset), UsedImplicitly]
  114. class ApplyAutoAction : TrackOffsetBaseAction
  115. {
  116. public override TrackOffset trackOffset
  117. {
  118. get { return TrackOffset.Auto; }
  119. }
  120. }
  121. }