//----------------------------------------------------------------------------------------------------------------------

        //Calculate the used image index for the passed localTime
        internal int LocalTimeToImageIndex(TimelineClip clip, double localTime)
        {
            TimelineClipSISData timelineSISData = GetBoundTimelineClipSISData();

            if (null != timelineSISData)
            {
                double scaledTimePerFrame = TimelineUtility.CalculateTimePerFrame(clip) * clip.timeScale;

                //Try to check if this frame is "dropped", so that we should use the image in the prev frame
                int playableFrameIndex         = Mathf.RoundToInt((float)localTime / (float)scaledTimePerFrame);
                SISPlayableFrame playableFrame = timelineSISData.GetPlayableFrame(playableFrameIndex);
                while (playableFrameIndex > 0 && !playableFrame.IsUsed())
                {
                    --playableFrameIndex;
                    playableFrame = timelineSISData.GetPlayableFrame(playableFrameIndex);
                    localTime     = playableFrameIndex * scaledTimePerFrame;
                }
            }


            double imageSequenceTime = LocalTimeToCurveTime(clip, localTime);
            int    count             = m_imageFiles.Count;

            //Can't round up, because if the time for the next frame hasn't been reached, then we should stick
            int index = Mathf.FloorToInt(count * (float)imageSequenceTime);

            index = Mathf.Clamp(index, 0, count - 1);
            return(index);
        }
Пример #2
0
//----------------------------------------------------------------------------------------------------------------------
        private static SISPlayableFrame CreatePlayableFrame(TimelineClipSISData owner, int index, double timePerFrame)
        {
            SISPlayableFrame playableFrame = new SISPlayableFrame(owner);

            playableFrame.SetIndexAndLocalTime(index, timePerFrame * index);
            return(playableFrame);
        }
Пример #3
0
        internal TimelineClipSISData(TimelineClip owner, TimelineClipSISData other) : this(owner){
            Assert.IsNotNull(m_playableFrames);

            foreach (SISPlayableFrame otherFrame in other.m_playableFrames)
            {
                SISPlayableFrame newFrame = new SISPlayableFrame(this, otherFrame);
                m_playableFrames.Add(newFrame);
            }

            m_frameMarkersRequested = other.m_frameMarkersRequested;
        }
        internal static T GetTimelineClipAsset <T>(this SISPlayableFrame playableFrame) where T : Object
        {
            TimelineClip timelineClip = playableFrame?.GetOwner().GetOwner();

            if (null == timelineClip)
            {
                return(null);
            }

            T clipAsset = timelineClip.asset as T;

            return(clipAsset);
        }
        internal static void SetUsed(this SISPlayableFrame playableFrame, bool used)
        {
#if UNITY_EDITOR
            bool prevUsed = playableFrame.IsUsed();
#endif

            playableFrame.SetBoolProperty(PlayableFramePropertyID.USED, used);

#if UNITY_EDITOR
            //Refresh
            if (used != prevUsed)
            {
                TimelineEditor.Refresh(RefreshReason.ContentsModified);
            }
#endif
        }
Пример #6
0
//----------------------------------------------------------------------------------------------------------------------

        //Calculate the used image index for the passed localTime
        internal int LocalTimeToImageIndex(TimelineClip clip, double localTime)
        {
            SISClipData clipData = GetBoundClipData();

            if (null == clipData)
            {
                return(0);
            }


            {
                //drop disabled frames
                double scaledTimePerFrame = TimelineUtility.CalculateTimePerFrame(clip) * clip.timeScale;

                //Try to check if this frame is "dropped", so that we should use the image in the prev frame
                int playableFrameIndex = Mathf.RoundToInt((float)(localTime - clip.clipIn) / (float)scaledTimePerFrame);
                if (playableFrameIndex < 0)
                {
                    return(0);
                }

                SISPlayableFrame playableFrame = clipData.GetPlayableFrame(playableFrameIndex);
                while (playableFrameIndex > 0 && !playableFrame.IsUsed())
                {
                    --playableFrameIndex;
                    playableFrame = clipData.GetPlayableFrame(playableFrameIndex);
                    localTime     = playableFrameIndex * scaledTimePerFrame;
                }
            }

            AnimationCurve curve             = clipData.GetAnimationCurve();
            double         imageSequenceTime = curve.Evaluate((float)localTime);

            int count = m_imageFiles.Count;

            //Can't round up, because if the time for the next frame hasn't been reached, then we should stick
            int index = Mathf.FloorToInt(count * (float)imageSequenceTime);

            index = Mathf.Clamp(index, 0, count - 1);
            return(index);
        }
//----------------------------------------------------------------------------------------------------------------------

        private void UpdatePlayableFramesSize(int reqPlayableFramesSize)
        {
            TimelineClip clipOwner = GetOwner();

            Assert.IsNotNull(clipOwner);

            double timePerFrame = TimelineUtility.CalculateTimePerFrame(clipOwner);

            //Resize m_playableFrames
            if (m_playableFrames.Count < reqPlayableFramesSize)
            {
                int numNewPlayableFrames = (reqPlayableFramesSize - m_playableFrames.Count);
                List <SISPlayableFrame> newPlayableFrames = new List <SISPlayableFrame>(numNewPlayableFrames);
                for (int i = m_playableFrames.Count; i < reqPlayableFramesSize; ++i)
                {
                    newPlayableFrames.Add(CreatePlayableFrame(this, i, timePerFrame));
                }
                m_playableFrames.AddRange(newPlayableFrames);
            }

            if (m_playableFrames.Count > reqPlayableFramesSize)
            {
                int numLastPlayableFrames = m_playableFrames.Count;
                for (int i = reqPlayableFramesSize; i < numLastPlayableFrames; ++i)
                {
                    SISPlayableFrame curFrame = m_playableFrames[i];
                    curFrame?.Destroy();
                }
                m_playableFrames.RemoveRange(reqPlayableFramesSize, numLastPlayableFrames - reqPlayableFramesSize);
            }

            Assert.IsTrue(m_playableFrames.Count == reqPlayableFramesSize);

            for (int i = 0; i < reqPlayableFramesSize; ++i)
            {
                SISPlayableFrame curPlayableFrame = m_playableFrames[i];
                Assert.IsNotNull(curPlayableFrame);
                m_playableFrames[i].SetIndexAndLocalTime(i, timePerFrame * i);
            }
        }
 internal static bool IsLocked(this SISPlayableFrame playableFrame)
 {
     return(null != playableFrame && playableFrame.GetBoolProperty(PlayableFramePropertyID.LOCKED));
 }
//----------------------------------------------------------------------------------------------------------------------

        internal static void SetLocked(this SISPlayableFrame playableFrame, bool used)
        {
            playableFrame.SetBoolProperty(PlayableFramePropertyID.LOCKED, used);
        }
Пример #10
0
//----------------------------------------------------------------------------------------------------------------------

        internal void SetOwner(SISPlayableFrame controller)
        {
            m_playableFrameOwner = controller;
        }
Пример #11
0
 internal void Init(SISPlayableFrame controller, double initialTime)
 {
     m_playableFrameOwner = controller;
     time = initialTime;
 }
Пример #12
0
 internal SISPlayableFrame(PlayableFrameClipData owner, SISPlayableFrame otherFrame)
 {
     m_clipDataOwner  = owner;
     m_boolProperties = otherFrame.m_boolProperties;
     m_localTime      = otherFrame.m_localTime;
 }