public void Process(Clip clip, AnimationClipBindingConstant bindings, IReadOnlyDictionary <uint, string> tos)
        {
            IReadOnlyList <StreamedFrame> streamedFrames = clip.StreamedClip.GenerateFrames(m_version, m_platform, m_flags);
            float lastDenseFrame  = clip.DenseClip.FrameCount / clip.DenseClip.SampleRate;
            float lastSampleFrame = streamedFrames.Count > 1 ? streamedFrames[streamedFrames.Count - 2].Time : 0.0f;
            float lastFrame       = Math.Max(lastDenseFrame, lastSampleFrame);

            Clear();
            ProcessStreams(streamedFrames, bindings, tos);
            ProcessDenses(clip, bindings, tos);
            if (Clip.IsReadConstantClip(m_version))
            {
                ProcessConstant(clip, bindings, tos, lastFrame);
            }
            CreateCurves();
        }
        private void ProcessInner()
        {
            Clip clip = m_clip.MuscleClip.Clip;
            AnimationClipBindingConstant       bindings = m_clip.ClipBindingConstant;
            IReadOnlyDictionary <uint, string> tos      = m_clip.FindTOS();

            IReadOnlyList <StreamedFrame> streamedFrames = clip.StreamedClip.GenerateFrames(Version, Platform, Flags);
            float lastDenseFrame  = clip.DenseClip.FrameCount / clip.DenseClip.SampleRate;
            float lastSampleFrame = streamedFrames.Count > 1 ? streamedFrames[streamedFrames.Count - 2].Time : 0.0f;
            float lastFrame       = Math.Max(lastDenseFrame, lastSampleFrame);

            ProcessStreams(streamedFrames, bindings, tos, clip.DenseClip.SampleRate);
            ProcessDenses(clip, bindings, tos);
            if (Clip.IsReadConstantClip(Version))
            {
                ProcessConstant(clip, bindings, tos, lastFrame);
            }
            CreateCurves();
        }