|
@@ -159,12 +159,12 @@ package spine.animation {
|
|
var current : TrackEntry = tracks[i];
|
|
var current : TrackEntry = tracks[i];
|
|
if (current == null || current.delay > 0) continue;
|
|
if (current == null || current.delay > 0) continue;
|
|
applied = true;
|
|
applied = true;
|
|
- var currentPose : MixPose = i == 0 ? MixPose.current : MixPose.currentLayered;
|
|
|
|
|
|
+ var blend : MixBlend = i == 0 ? MixBlend.first : current.mixBlend;
|
|
|
|
|
|
// Apply mixing from entries first.
|
|
// Apply mixing from entries first.
|
|
var mix : Number = current.alpha;
|
|
var mix : Number = current.alpha;
|
|
if (current.mixingFrom != null)
|
|
if (current.mixingFrom != null)
|
|
- mix *= applyMixingFrom(current, skeleton, currentPose);
|
|
|
|
|
|
+ mix *= applyMixingFrom(current, skeleton, blend);
|
|
else if (current.trackTime >= current.trackEnd && current.next == null)
|
|
else if (current.trackTime >= current.trackEnd && current.next == null)
|
|
mix = 0;
|
|
mix = 0;
|
|
|
|
|
|
@@ -173,9 +173,9 @@ package spine.animation {
|
|
var timelineCount : int = current.animation.timelines.length;
|
|
var timelineCount : int = current.animation.timelines.length;
|
|
var timelines : Vector.<Timeline> = current.animation.timelines;
|
|
var timelines : Vector.<Timeline> = current.animation.timelines;
|
|
var ii : int = 0;
|
|
var ii : int = 0;
|
|
- if (mix == 1) {
|
|
|
|
|
|
+ if (mix == 1 || blend == MixBlend.add) {
|
|
for (ii = 0; ii < timelineCount; ii++)
|
|
for (ii = 0; ii < timelineCount; ii++)
|
|
- Timeline(timelines[ii]).apply(skeleton, animationLast, animationTime, events, 1, MixPose.setup, MixDirection.In);
|
|
|
|
|
|
+ Timeline(timelines[ii]).apply(skeleton, animationLast, animationTime, events, mix, blend, MixDirection.In);
|
|
} else {
|
|
} else {
|
|
var timelineData : Vector.<int> = current.timelineData;
|
|
var timelineData : Vector.<int> = current.timelineData;
|
|
|
|
|
|
@@ -185,11 +185,11 @@ package spine.animation {
|
|
|
|
|
|
for (ii = 0; ii < timelineCount; ii++) {
|
|
for (ii = 0; ii < timelineCount; ii++) {
|
|
var timeline : Timeline = timelines[ii];
|
|
var timeline : Timeline = timelines[ii];
|
|
- var pose : MixPose = timelineData[ii] >= AnimationState.FIRST ? MixPose.setup : currentPose;
|
|
|
|
|
|
+ var timelineBlend : MixBlend = timelineData[ii] == AnimationState.SUBSEQUENT ? blend : MixBlend.setup;
|
|
if (timeline is RotateTimeline) {
|
|
if (timeline is RotateTimeline) {
|
|
- applyRotateTimeline(timeline, skeleton, animationTime, mix, pose, timelinesRotation, ii << 1, firstFrame);
|
|
|
|
|
|
+ applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineBlend, timelinesRotation, ii << 1, firstFrame);
|
|
} else
|
|
} else
|
|
- timeline.apply(skeleton, animationLast, animationTime, events, mix, pose, MixDirection.In);
|
|
|
|
|
|
+ timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineBlend, MixDirection.In);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
queueEvents(current, animationTime);
|
|
queueEvents(current, animationTime);
|
|
@@ -202,17 +202,18 @@ package spine.animation {
|
|
return applied;
|
|
return applied;
|
|
}
|
|
}
|
|
|
|
|
|
- private function applyMixingFrom(to : TrackEntry, skeleton : Skeleton, currentPose : MixPose) : Number {
|
|
|
|
|
|
+ private function applyMixingFrom(to : TrackEntry, skeleton : Skeleton, blend : MixBlend) : Number {
|
|
var from : TrackEntry = to.mixingFrom;
|
|
var from : TrackEntry = to.mixingFrom;
|
|
- if (from.mixingFrom != null) applyMixingFrom(from, skeleton, currentPose);
|
|
|
|
|
|
+ if (from.mixingFrom != null) applyMixingFrom(from, skeleton, blend);
|
|
|
|
|
|
var mix : Number = 0;
|
|
var mix : Number = 0;
|
|
if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.
|
|
if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.
|
|
mix = 1;
|
|
mix = 1;
|
|
- currentPose = MixPose.setup;
|
|
|
|
|
|
+ if (blend == MixBlend.first) blend = MixBlend.setup;
|
|
} else {
|
|
} else {
|
|
mix = to.mixTime / to.mixDuration;
|
|
mix = to.mixTime / to.mixDuration;
|
|
if (mix > 1) mix = 1;
|
|
if (mix > 1) mix = 1;
|
|
|
|
+ if (blend != MixBlend.first) blend = from.mixBlend;
|
|
}
|
|
}
|
|
|
|
|
|
var events : Vector.<Event> = mix < from.eventThreshold ? this.events : null;
|
|
var events : Vector.<Event> = mix < from.eventThreshold ? this.events : null;
|
|
@@ -220,49 +221,54 @@ package spine.animation {
|
|
var animationLast : Number = from.animationLast, animationTime : Number = from.getAnimationTime();
|
|
var animationLast : Number = from.animationLast, animationTime : Number = from.getAnimationTime();
|
|
var timelineCount : int = from.animation.timelines.length;
|
|
var timelineCount : int = from.animation.timelines.length;
|
|
var timelines : Vector.<Timeline> = from.animation.timelines;
|
|
var timelines : Vector.<Timeline> = from.animation.timelines;
|
|
- var timelineData : Vector.<int> = from.timelineData;
|
|
|
|
- var timelineDipMix : Vector.<TrackEntry> = from.timelineDipMix;
|
|
|
|
-
|
|
|
|
- var firstFrame : Boolean = from.timelinesRotation.length == 0;
|
|
|
|
- if (firstFrame) from.timelinesRotation.length = timelineCount << 1;
|
|
|
|
- var timelinesRotation : Vector.<Number> = from.timelinesRotation;
|
|
|
|
-
|
|
|
|
- var pose : MixPose;
|
|
|
|
var alphaDip : Number = from.alpha * to.interruptAlpha;
|
|
var alphaDip : Number = from.alpha * to.interruptAlpha;
|
|
var alphaMix : Number = alphaDip * (1 - mix);
|
|
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]) {
|
|
|
|
- case SUBSEQUENT:
|
|
|
|
- if (!attachments && timeline is AttachmentTimeline) continue;
|
|
|
|
- if (!drawOrder && timeline is DrawOrderTimeline) continue;
|
|
|
|
- pose = currentPose;
|
|
|
|
- alpha = alphaMix;
|
|
|
|
- break;
|
|
|
|
- case FIRST:
|
|
|
|
- pose = MixPose.setup;
|
|
|
|
- alpha = alphaMix;
|
|
|
|
- break;
|
|
|
|
- case DIP:
|
|
|
|
- pose = MixPose.setup;
|
|
|
|
- alpha = alphaDip;
|
|
|
|
- break;
|
|
|
|
- default:
|
|
|
|
- pose = MixPose.setup;
|
|
|
|
- alpha = alphaDip;
|
|
|
|
- var dipMix : TrackEntry = timelineDipMix[i];
|
|
|
|
- alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- from.totalAlpha += alpha;
|
|
|
|
- if (timeline is RotateTimeline)
|
|
|
|
- applyRotateTimeline(timeline, skeleton, animationTime, alpha, pose, timelinesRotation, i << 1, firstFrame);
|
|
|
|
- else {
|
|
|
|
- timeline.apply(skeleton, animationLast, animationTime, events, alpha, pose, MixDirection.Out);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ var i : int = 0;
|
|
|
|
+ if (blend == MixBlend.add) {
|
|
|
|
+ for (i = 0; i < timelineCount; i++)
|
|
|
|
+ timelines[i].apply(skeleton, animationLast, animationTime, events, alphaMix, blend, MixDirection.Out);
|
|
|
|
+ } else {
|
|
|
|
+ var timelineData : Vector.<int> = from.timelineData;
|
|
|
|
+ var timelineDipMix : Vector.<TrackEntry> = from.timelineDipMix;
|
|
|
|
+
|
|
|
|
+ var firstFrame : Boolean = from.timelinesRotation.length == 0;
|
|
|
|
+ if (firstFrame) from.timelinesRotation.length = timelineCount << 1;
|
|
|
|
+ var timelinesRotation : Vector.<Number> = from.timelinesRotation;
|
|
|
|
+
|
|
|
|
+ from.totalAlpha = 0;
|
|
|
|
+ for (i = 0; i < timelineCount; i++) {
|
|
|
|
+ var timeline : Timeline = timelines[i];
|
|
|
|
+ var timelineBlend: MixBlend;
|
|
|
|
+ var alpha : Number = 0;
|
|
|
|
+ switch (timelineData[i]) {
|
|
|
|
+ case SUBSEQUENT:
|
|
|
|
+ if (!attachments && timeline is AttachmentTimeline) continue;
|
|
|
|
+ if (!drawOrder && timeline is DrawOrderTimeline) continue;
|
|
|
|
+ timelineBlend = blend;
|
|
|
|
+ alpha = alphaMix;
|
|
|
|
+ break;
|
|
|
|
+ case FIRST:
|
|
|
|
+ timelineBlend = MixBlend.setup;
|
|
|
|
+ alpha = alphaMix;
|
|
|
|
+ break;
|
|
|
|
+ case DIP:
|
|
|
|
+ timelineBlend = MixBlend.setup;
|
|
|
|
+ alpha = alphaDip;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ timelineBlend = MixBlend.setup;
|
|
|
|
+ var dipMix : TrackEntry = timelineDipMix[i];
|
|
|
|
+ alpha = alphaDip * Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ from.totalAlpha += alpha;
|
|
|
|
+ if (timeline is RotateTimeline)
|
|
|
|
+ applyRotateTimeline(timeline, skeleton, animationTime, alpha, timelineBlend, timelinesRotation, i << 1, firstFrame);
|
|
|
|
+ else {
|
|
|
|
+ timeline.apply(skeleton, animationLast, animationTime, events, alpha, timelineBlend, MixDirection.Out);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if (to.mixDuration > 0) queueEvents(from, animationTime);
|
|
if (to.mixDuration > 0) queueEvents(from, animationTime);
|
|
this.events.length = 0;
|
|
this.events.length = 0;
|
|
@@ -272,11 +278,11 @@ package spine.animation {
|
|
return mix;
|
|
return mix;
|
|
}
|
|
}
|
|
|
|
|
|
- private function applyRotateTimeline(timeline : Timeline, skeleton : Skeleton, time : Number, alpha : Number, pose : MixPose, timelinesRotation : Vector.<Number>, i : int, firstFrame : Boolean) : void {
|
|
|
|
|
|
+ private function applyRotateTimeline(timeline : Timeline, skeleton : Skeleton, time : Number, alpha : Number, blend : MixBlend, timelinesRotation : Vector.<Number>, i : int, firstFrame : Boolean) : void {
|
|
if (firstFrame) timelinesRotation[i] = 0;
|
|
if (firstFrame) timelinesRotation[i] = 0;
|
|
|
|
|
|
if (alpha == 1) {
|
|
if (alpha == 1) {
|
|
- timeline.apply(skeleton, 0, time, null, 1, pose, MixDirection.In);
|
|
|
|
|
|
+ timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection.In);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -284,7 +290,7 @@ package spine.animation {
|
|
var frames : Vector.<Number> = rotateTimeline.frames;
|
|
var frames : Vector.<Number> = rotateTimeline.frames;
|
|
var bone : Bone = skeleton.bones[rotateTimeline.boneIndex];
|
|
var bone : Bone = skeleton.bones[rotateTimeline.boneIndex];
|
|
if (time < frames[0]) {
|
|
if (time < frames[0]) {
|
|
- if (pose == MixPose.setup) bone.rotation = bone.data.rotation;
|
|
|
|
|
|
+ if (blend == MixBlend.setup) bone.rotation = bone.data.rotation;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -305,7 +311,7 @@ package spine.animation {
|
|
}
|
|
}
|
|
|
|
|
|
// Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
|
|
// Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
|
|
- var r1 : Number = pose == MixPose.setup ? bone.data.rotation : bone.rotation;
|
|
|
|
|
|
+ var r1 : Number = blend == MixBlend.setup ? bone.data.rotation : bone.rotation;
|
|
var total : Number, diff : Number = r2 - r1;
|
|
var total : Number, diff : Number = r2 - r1;
|
|
if (diff == 0) {
|
|
if (diff == 0) {
|
|
total = timelinesRotation[i];
|
|
total = timelinesRotation[i];
|
|
@@ -559,7 +565,8 @@ package spine.animation {
|
|
var mixingTo : Vector.<TrackEntry> = this.mixingTo;
|
|
var mixingTo : Vector.<TrackEntry> = this.mixingTo;
|
|
for (var i : int = 0, n : int = tracks.length; i < n; i++) {
|
|
for (var i : int = 0, n : int = tracks.length; i < n; i++) {
|
|
var entry : TrackEntry = tracks[i];
|
|
var entry : TrackEntry = tracks[i];
|
|
- if (entry != null) entry.setTimelineData(null, mixingTo, propertyIDs);
|
|
|
|
|
|
+ if (entry != null && (i == 0 || entry.mixBlend != MixBlend.add))
|
|
|
|
+ entry.setTimelineData(null, mixingTo, propertyIDs);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|