132 lines
4.1 KiB
C#
132 lines
4.1 KiB
C#
|
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());
|
||
|
}
|
||
|
}
|
||
|
}
|