/// <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); } }