diff --git a/spine-as3/spine-as3-example/lib/spine-as3.swc b/spine-as3/spine-as3-example/lib/spine-as3.swc index eebf4bf24..9cb61d560 100644 Binary files a/spine-as3/spine-as3-example/lib/spine-as3.swc and b/spine-as3/spine-as3-example/lib/spine-as3.swc differ diff --git a/spine-as3/spine-as3/src/spine/animation/AnimationState.as b/spine-as3/spine-as3/src/spine/animation/AnimationState.as index 0a0f444c0..be7d96f94 100644 --- a/spine-as3/spine-as3/src/spine/animation/AnimationState.as +++ b/spine-as3/spine-as3/src/spine/animation/AnimationState.as @@ -39,6 +39,7 @@ package spine.animation { public static var SUBSEQUENT : int = 0; public static var FIRST : int = 1; public static var DIP : int = 2; + public static var DIP_MIX : int = 3; internal static var emptyAnimation : Animation = new Animation("", new Vector.(), 0); public var data : AnimationStateData; public var tracks : Vector. = new Vector.(); @@ -107,7 +108,7 @@ package spine.animation { continue; } } - if (current.mixingFrom != null && updateMixingFrom(current, delta, 2)) { + if (current.mixingFrom != null && updateMixingFrom(current, delta)) { // End mixing from entries once all have completed. var from : TrackEntry = current.mixingFrom; current.mixingFrom = null; @@ -123,21 +124,18 @@ package spine.animation { queue.drain(); } - private function updateMixingFrom(entry : TrackEntry, delta : Number, animationCount : int) : Boolean { - var from : TrackEntry = entry.mixingFrom; + private function updateMixingFrom(to : TrackEntry, delta : Number) : Boolean { + var from : TrackEntry = to.mixingFrom; if (from == null) return true; - var finished : Boolean = updateMixingFrom(from, delta, animationCount + 1); + var finished : Boolean = updateMixingFrom(from, delta); // Require mixTime > 0 to ensure the mixing from entry was applied at least once. - if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { - if (animationCount > 5 && from.mixingFrom == null) { - // Limit linked list by speeding up and removing old entries. - entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); - if (entry.interruptAlpha <= 0) { - entry.mixingFrom = null; - queue.end(from); - } + if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) { + if (from.totalAlpha == 0) { + to.mixingFrom = from.mixingFrom; + to.interruptAlpha = from.interruptAlpha; + queue.end(from); } return finished; } @@ -145,7 +143,7 @@ package spine.animation { from.animationLast = from.nextAnimationLast; from.trackLast = from.nextTrackLast; from.trackTime += delta * from.timeScale; - entry.mixTime += delta * entry.timeScale; + to.mixTime += delta * to.timeScale; return false; } @@ -184,9 +182,9 @@ package spine.animation { for (ii = 0; ii < timelineCount; ii++) { var timeline : Timeline = timelines[ii]; if (timeline is RotateTimeline) { - applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); + applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= FIRST, timelinesRotation, ii << 1, firstFrame); } else - timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); + timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= FIRST, false); } } queueEvents(current, animationTime); @@ -226,6 +224,7 @@ package spine.animation { var alphaDip : Number = from.alpha * to.interruptAlpha; var alphaMix : Number = alphaDip * (1 - mix); var alpha : Number = 0; + from.totalAlpha = 0; for (var i : int = 0; i < timelineCount; i++) { var timeline : Timeline = timelines[i]; switch (timelineData[i]) { @@ -237,13 +236,18 @@ package spine.animation { first = true; alpha = alphaMix; break; + case DIP: + first = true; + alpha = alphaDip; + break; default: first = true; alpha = alphaDip; var dipMix : TrackEntry = timelineDipMix[i]; - if (dipMix != null) alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); + alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); break; } + from.totalAlpha += alpha; if (timeline is RotateTimeline) applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); else { diff --git a/spine-as3/spine-as3/src/spine/animation/TrackEntry.as b/spine-as3/spine-as3/src/spine/animation/TrackEntry.as index 623e6eb48..b26ee29f8 100644 --- a/spine-as3/spine-as3/src/spine/animation/TrackEntry.as +++ b/spine-as3/spine-as3/src/spine/animation/TrackEntry.as @@ -46,7 +46,7 @@ package spine.animation { public var eventThreshold : Number, attachmentThreshold : Number, drawOrderThreshold : Number; public var animationStart : Number, animationEnd : Number, animationLast : Number, nextAnimationLast : Number; public var delay : Number, trackTime : Number, trackLast : Number, nextTrackLast : Number, trackEnd : Number, timeScale : Number; - public var alpha : Number, mixTime : Number, mixDuration : Number, interruptAlpha : Number; + public var alpha : Number, mixTime : Number, mixDuration : Number, interruptAlpha : Number, totalAlpha : Number; public var timelineData : Vector. = new Vector.(); public var timelineDipMix : Vector. = new Vector.(); public var timelinesRotation : Vector. = new Vector.(); @@ -89,6 +89,7 @@ package spine.animation { var timelinesCount : int = animation.timelines.length; var timelineData : Vector. = this.timelineData; timelineData.length = timelinesCount; + this.timelineDipMix.length = 0; var timelineDipMix : Vector. = this.timelineDipMix; timelineDipMix.length = timelinesCount; @@ -101,16 +102,19 @@ package spine.animation { timelineData[i] = AnimationState.SUBSEQUENT; } else if (to == null || !to.hasTimeline(intId)) timelineData[i] = AnimationState.FIRST; - else { - timelineData[i] = AnimationState.DIP; + else { for (var ii : int = mixingToLast; ii >= 0; ii--) { var entry : TrackEntry = mixingTo[ii]; if (!entry.hasTimeline(intId)) { - if (entry.mixDuration > 0) timelineDipMix[i] = entry; - continue outer; - } + if (entry.mixDuration > 0) { + timelineData[i] = AnimationState.DIP_MIX; + timelineDipMix[i] = entry; + continue outer; + } + break; + } } - timelineDipMix[i] = null; + timelineData[i] = AnimationState.DIP; } } return lastEntry; diff --git a/spine-starling/spine-starling-example/lib/spine-as3.swc b/spine-starling/spine-starling-example/lib/spine-as3.swc index eebf4bf24..9cb61d560 100644 Binary files a/spine-starling/spine-starling-example/lib/spine-as3.swc and b/spine-starling/spine-starling-example/lib/spine-as3.swc differ diff --git a/spine-starling/spine-starling/lib/spine-as3.swc b/spine-starling/spine-starling/lib/spine-as3.swc index eebf4bf24..9cb61d560 100644 Binary files a/spine-starling/spine-starling/lib/spine-as3.swc and b/spine-starling/spine-starling/lib/spine-as3.swc differ