| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | 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.parentTrack;            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());        }    }}
 |