You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.1 KiB
131 lines
4.1 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Text; |
|
using UnityEngine; |
|
using UnityEngine.Playables; |
|
using UnityEngine.Timeline; |
|
|
|
namespace UnityEditor.Timeline |
|
{ |
|
[Serializable] |
|
class SequencePath |
|
{ |
|
[SerializeField] int m_SelectionRoot; |
|
|
|
public int selectionRoot |
|
{ |
|
get { return m_SelectionRoot; } |
|
} |
|
|
|
[SerializeField] List<SequencePathSubElement> m_SubElements; |
|
|
|
public List<SequencePathSubElement> subElements |
|
{ |
|
get { return m_SubElements ?? (m_SubElements = new List<SequencePathSubElement>()); } |
|
} |
|
|
|
public void SetSelectionRoot(int instanceID) |
|
{ |
|
m_SelectionRoot = instanceID; |
|
subElements.Clear(); |
|
} |
|
|
|
public void AddSubSequence(ISequenceState state, IExposedPropertyTable resolver) |
|
{ |
|
subElements.Add(SequencePathSubElement.Create(state, resolver)); |
|
} |
|
|
|
public void Clear() |
|
{ |
|
m_SelectionRoot = 0; |
|
subElements.Clear(); |
|
} |
|
|
|
public static bool AreEqual(SequencePath lhs, SequencePath rhs) |
|
{ |
|
if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true; |
|
if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false; |
|
if (ReferenceEquals(lhs, rhs)) return true; |
|
|
|
var result = lhs.selectionRoot == rhs.selectionRoot && |
|
lhs.subElements.Count == rhs.subElements.Count; |
|
|
|
if (!result) |
|
return false; |
|
|
|
for (int i = 0, n = lhs.subElements.Count; i < n; ++i) |
|
result = result && SequencePathSubElement.AreEqual(lhs.subElements[i], rhs.subElements[i]); |
|
|
|
return result; |
|
} |
|
|
|
public override string ToString() |
|
{ |
|
var sb = new StringBuilder(); |
|
|
|
sb.AppendFormat("[{0}]", m_SelectionRoot.ToString()); |
|
|
|
if (m_SubElements != null && m_SubElements.Count > 0) |
|
{ |
|
foreach (var element in m_SubElements) |
|
{ |
|
sb.Append(" > "); |
|
sb.Append(element.ToString()); |
|
} |
|
} |
|
|
|
return sb.ToString(); |
|
} |
|
} |
|
|
|
[Serializable] |
|
class SequencePathSubElement |
|
{ |
|
public int trackInstanceID; |
|
public int trackHash; |
|
public int clipIndex; |
|
public int clipHash; |
|
public int subDirectorIndex; |
|
|
|
public static SequencePathSubElement Create(ISequenceState state, IExposedPropertyTable resolver) |
|
{ |
|
var clip = state.hostClip; |
|
Debug.Assert(clip != null); |
|
var track = clip.GetParentTrack(); |
|
Debug.Assert(track != null); |
|
var asset = track.timelineAsset; |
|
Debug.Assert(asset != null); |
|
var directors = TimelineUtility.GetSubTimelines(clip, resolver as PlayableDirector); |
|
|
|
return new SequencePathSubElement |
|
{ |
|
trackInstanceID = track.GetInstanceID(), |
|
trackHash = track.Hash(), |
|
clipIndex = Array.IndexOf(track.clips, clip), |
|
clipHash = clip.Hash(), |
|
subDirectorIndex = directors.IndexOf(state.director) |
|
}; |
|
} |
|
|
|
public static bool AreEqual(SequencePathSubElement lhs, SequencePathSubElement rhs) |
|
{ |
|
if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true; |
|
if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false; |
|
if (ReferenceEquals(lhs, rhs)) return true; |
|
|
|
return lhs.trackInstanceID == rhs.trackInstanceID && |
|
lhs.trackHash == rhs.trackHash && |
|
lhs.clipIndex == rhs.clipIndex && |
|
lhs.clipHash == rhs.clipHash && |
|
lhs.subDirectorIndex == rhs.subDirectorIndex; |
|
} |
|
|
|
public override string ToString() |
|
{ |
|
return string.Format( |
|
"[track[{0}] ({1}) > clip[{2}] ({3})]", |
|
trackInstanceID.ToString(), trackHash.ToString(), |
|
clipIndex.ToString(), clipHash.ToString()); |
|
} |
|
} |
|
}
|
|
|