/// <summary>
 /// Обновление анимации
 /// </summary>
 protected override void UpdateAnimation()
 {
     Frame[] frms = Frames;
     if (frms != null)
     {
         QueuedMeshUpdate q = queuedUpdate;
         MorphFrame       f1, f2;
         float            d = 0;
         if (q.Time < 0)
         {
             f1 = transitionFrame;
             f2 = GetFrameForward(q.Time, q.IsLooping, q.FirstFrame, q.LastFrame);
             d  = 1f + q.Time;
         }
         else
         {
             f1 = GetFrameBackward(q.Time, q.IsLooping, q.FirstFrame, q.LastFrame);
             f2 = GetFrameForward(q.Time, q.IsLooping, q.FirstFrame, q.LastFrame);
             if (f2 == null)
             {
                 f2 = f1;
             }
             else if (f1 == null)
             {
                 f1 = f2;
             }
             else
             {
                 if (f1.Time != f2.Time)
                 {
                     d = (q.Time - f1.Time) / (f2.Time - f1.Time);
                 }
             }
             if (d < 0)
             {
                 d = 1f + d;
             }
         }
         if (GraphicalCaps.ShaderPipeline)
         {
             UpdateBuffers(f1, f2, d);
         }
         else
         {
             currentFrame = InterpolateFrame(f1, f2, d);
             vertices     = currentFrame.verts;
             normals      = currentFrame.normals;
         }
     }
 }
 /// <summary>
 /// Создание переходного кадра
 /// </summary>
 protected override void UpdateTransition()
 {
     Frame[] frms = Frames;
     if (frms != null)
     {
         QueuedMeshUpdate q = queuedTransitionUpdate;
         MorphFrame       f1, f2;
         float            d = 0;
         if (q.Time < 0)
         {
             if (transitionFrame == null)
             {
                 // WTF
                 transitionFrame = GetFrameForward(q.FirstFrame, true, q.FirstFrame, q.LastFrame);
             }
             f1 = transitionFrame;
             f2 = GetFrameForward(q.Time, q.IsLooping, q.FirstFrame, q.LastFrame);
             d  = 1f + q.Time;
         }
         else
         {
             f1 = GetFrameBackward(q.Time, q.IsLooping, q.FirstFrame, q.LastFrame);
             f2 = GetFrameForward(q.Time, q.IsLooping, q.FirstFrame, q.LastFrame);
             if (f2 == null)
             {
                 f2 = f1;
             }
             else if (f1 == null)
             {
                 f1 = f2;
             }
             else
             {
                 if (f1.Time != f2.Time)
                 {
                     d = (q.Time - f1.Time) / (f2.Time - f1.Time);
                 }
             }
             if (d < 0)
             {
                 d = 1f + d;
             }
         }
         transitionFrame = InterpolateFrame(f1, f2, d);
     }
 }