2022-01-12 10:39:15 +03:00
|
|
|
using System.Collections.Generic;
|
2022-01-12 10:06:03 +03:00
|
|
|
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(typeof(AnimationTrack), animTrack, "Override " + animTrack.GetChildTracks().Count());
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override ActionValidity Validate(IEnumerable<TrackAsset> tracks)
|
|
|
|
{
|
|
|
|
if (tracks.Any(t => t.isSubTrack || !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
|
|
|
|
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 => !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
|
|
|
|
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 => !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
|
|
|
|
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 => !t.GetType().IsAssignableFrom(typeof(AnimationTrack))))
|
|
|
|
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; }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|