You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.1 KiB
C#

1 year ago
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());
}
}
}