152 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			152 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using JetBrains.Annotations; | ||
|  | using UnityEditor.Timeline.Actions; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Timeline; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     [MenuEntry("Add Override Track", MenuPriority.CustomTrackActionSection.addOverrideTrack), UsedImplicitly] | ||
|  |     class AddOverrideTrackAction : TrackAction | ||
|  |     { | ||
|  |         public override bool Execute(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             foreach (var animTrack in tracks.OfType<AnimationTrack>()) | ||
|  |             { | ||
|  |                 TimelineHelpers.CreateTrack(animTrack.GetType(), animTrack, "Override " + animTrack.GetChildTracks().Count()); | ||
|  |             } | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override ActionValidity Validate(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             if (tracks.Any(t => t.isSubTrack || !typeof(AnimationTrack).IsAssignableFrom(t.GetType()))) | ||
|  |                 return ActionValidity.NotApplicable; | ||
|  | 
 | ||
|  |             if (tracks.Any(t => t.lockedInHierarchy)) | ||
|  |                 return ActionValidity.Invalid; | ||
|  | 
 | ||
|  |             return ActionValidity.Valid; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [MenuEntry("Convert To Clip Track", MenuPriority.CustomTrackActionSection.convertToClipMode), UsedImplicitly] | ||
|  |     class ConvertToClipModeAction : TrackAction | ||
|  |     { | ||
|  |         public override bool Execute(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             foreach (var animTrack in tracks.OfType<AnimationTrack>()) | ||
|  |                 animTrack.ConvertToClipMode(); | ||
|  | 
 | ||
|  |             TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override ActionValidity Validate(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             if (tracks.Any(t => !typeof(AnimationTrack).IsAssignableFrom(t.GetType()))) | ||
|  |                 return ActionValidity.NotApplicable; | ||
|  | 
 | ||
|  |             if (tracks.Any(t => t.lockedInHierarchy)) | ||
|  |                 return ActionValidity.Invalid; | ||
|  | 
 | ||
|  |             if (tracks.OfType<AnimationTrack>().All(a => a.CanConvertToClipMode())) | ||
|  |                 return ActionValidity.Valid; | ||
|  | 
 | ||
|  |             return ActionValidity.NotApplicable; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [MenuEntry("Convert To Infinite Clip", MenuPriority.CustomTrackActionSection.convertFromClipMode), UsedImplicitly] | ||
|  |     class ConvertFromClipTrackAction : TrackAction | ||
|  |     { | ||
|  |         public override bool Execute(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             foreach (var animTrack in tracks.OfType<AnimationTrack>()) | ||
|  |                 animTrack.ConvertFromClipMode(TimelineEditor.inspectedAsset); | ||
|  | 
 | ||
|  |             TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override ActionValidity Validate(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             if (tracks.Any(t => !typeof(AnimationTrack).IsAssignableFrom(t.GetType()))) | ||
|  |                 return ActionValidity.NotApplicable; | ||
|  | 
 | ||
|  |             if (tracks.Any(t => t.lockedInHierarchy)) | ||
|  |                 return ActionValidity.Invalid; | ||
|  | 
 | ||
|  |             if (tracks.OfType<AnimationTrack>().All(a => a.CanConvertFromClipMode())) | ||
|  |                 return ActionValidity.Valid; | ||
|  | 
 | ||
|  |             return ActionValidity.NotApplicable; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     abstract class TrackOffsetBaseAction : TrackAction | ||
|  |     { | ||
|  |         public abstract TrackOffset trackOffset { get; } | ||
|  | 
 | ||
|  |         public override ActionValidity Validate(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             if (tracks.Any(t => !typeof(AnimationTrack).IsAssignableFrom(t.GetType()))) | ||
|  |                 return ActionValidity.NotApplicable; | ||
|  | 
 | ||
|  |             if (tracks.Any(t => t.lockedInHierarchy)) | ||
|  |             { | ||
|  |                 return ActionValidity.Invalid; | ||
|  |             } | ||
|  | 
 | ||
|  |             return ActionValidity.Valid; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override bool Execute(IEnumerable<TrackAsset> tracks) | ||
|  |         { | ||
|  |             foreach (var animTrack in tracks.OfType<AnimationTrack>()) | ||
|  |             { | ||
|  |                 animTrack.UnarmForRecord(); | ||
|  |                 animTrack.trackOffset = trackOffset; | ||
|  |             } | ||
|  | 
 | ||
|  |             TimelineEditor.Refresh(RefreshReason.ContentsModified); | ||
|  |             return true; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     [MenuEntry("Track Offsets/Apply Transform Offsets", MenuPriority.CustomTrackActionSection.applyTrackOffset), UsedImplicitly] | ||
|  |     [ApplyDefaultUndo] | ||
|  |     class ApplyTransformOffsetAction : TrackOffsetBaseAction | ||
|  |     { | ||
|  |         public override TrackOffset trackOffset | ||
|  |         { | ||
|  |             get { return TrackOffset.ApplyTransformOffsets; } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [MenuEntry("Track Offsets/Apply Scene Offsets", MenuPriority.CustomTrackActionSection.applySceneOffset), UsedImplicitly] | ||
|  |     [ApplyDefaultUndo] | ||
|  |     class ApplySceneOffsetAction : TrackOffsetBaseAction | ||
|  |     { | ||
|  |         public override TrackOffset trackOffset | ||
|  |         { | ||
|  |             get { return TrackOffset.ApplySceneOffsets; } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     [MenuEntry("Track Offsets/Auto (Deprecated)", MenuPriority.CustomTrackActionSection.applyAutoOffset), UsedImplicitly] | ||
|  |     [ApplyDefaultUndo] | ||
|  |     class ApplyAutoAction : TrackOffsetBaseAction | ||
|  |     { | ||
|  |         public override TrackOffset trackOffset | ||
|  |         { | ||
|  |             get { return TrackOffset.Auto; } | ||
|  |         } | ||
|  |     } | ||
|  | } |