From c0908f19ed5a359905eae4fdd7995802d524e87a Mon Sep 17 00:00:00 2001 From: badlogic Date: Thu, 24 Nov 2016 13:01:14 +0100 Subject: [PATCH] [lua] Ported AnimationState changes --- spine-lua/AnimationState.lua | 40 +++++++++++++++++------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/spine-lua/AnimationState.lua b/spine-lua/AnimationState.lua index f83d544cd..01d060c12 100644 --- a/spine-lua/AnimationState.lua +++ b/spine-lua/AnimationState.lua @@ -247,11 +247,7 @@ function AnimationState:update (delta) end skip = true end - if not skip then - self:updateMixingFrom(current, delta, true); - end else - self:updateMixingFrom(current, delta, true) -- Clear the track when there is no next entry, the track end time is reached, and there is no mixingFrom. if current.trackLast >= current.trackEnd and current.mixingFrom == nil then tracks[i] = nil @@ -261,7 +257,10 @@ function AnimationState:update (delta) end end - if not skip then current.trackTime = current.trackTime + currentDelta end + if not skip then + self:updateMixingFrom(current, delta) + current.trackTime = current.trackTime + currentDelta + end end end end @@ -269,28 +268,23 @@ function AnimationState:update (delta) queue:drain() end -function AnimationState:updateMixingFrom (entry, delta, canEnd) +function AnimationState:updateMixingFrom (entry, delta) local from = entry.mixingFrom if from == nil then return end + self:updateMixingFrom(from, delta) + local queue = self.queue - if canEnd and entry.mixTime >= entry.mixDuration and entry.mixTime > 0 then + if entry.mixTime >= entry.mixDuration and from.mixingFrom == nil and entry.mixTime > 0 then + entry.mixingFrom = null queue:_end(from) - local newFrom = from.mixingFrom - entry.mixingFrom = newFrom - if newFrom == nil then return end - entry.mixTime = from.mixTime; - entry.mixDuration = from.mixDuration; - from = newFrom; + return end from.animationLast = from.nextAnimationLast from.trackLast = from.nextTrackLast - local mixingFromDelta = delta * from.timeScale - from.trackTime = from.trackTime + mixingFromDelta; - entry.mixTime = entry.mixTime + mixingFromDelta; - - self:updateMixingFrom(from, delta, canEnd and from.alpha == 1) + from.trackTime = from.trackTime + delta * from.timeScale; + entry.mixTime = entry.mixTime + delta * entry.timeScale; end function AnimationState:apply (skeleton) @@ -305,7 +299,11 @@ function AnimationState:apply (skeleton) if not (current == nil or current.delay > 0) then -- Apply mixing from entries first. local mix = current.alpha - if current.mixingFrom then mix = mix * self:applyMixingFrom(current, skeleton) end + if current.mixingFrom then + mix = mix * self:applyMixingFrom(current, skeleton) + elseif current.trackTime >= current.trackEnd then + mix = 0 + end -- Apply current entry. local animationLast = current.animationLast @@ -563,11 +561,11 @@ function AnimationState:setAnimation (trackIndex, animation, loop) if current then if current.nextTrackLast == -1 then -- Don't mix from an entry that was never applied. - tracks[trackIndex] = nil + tracks[trackIndex] = current.mixingFrom queue:interrupt(current) queue:_end(current) self:disposeNext(current) - current = nil + current = current.mixingFrom else self:disposeNext(current) end