[ts] Ported Animation State changes, see #908

This commit is contained in:
badlogic 2017-05-24 13:14:06 +02:00
parent 679a1997c0
commit ea3cfdc643
19 changed files with 208 additions and 153 deletions

View File

@ -231,6 +231,7 @@ declare module spine {
static SUBSEQUENT: number; static SUBSEQUENT: number;
static FIRST: number; static FIRST: number;
static DIP: number; static DIP: number;
static DIP_MIX: number;
data: AnimationStateData; data: AnimationStateData;
tracks: TrackEntry[]; tracks: TrackEntry[];
events: Event[]; events: Event[];
@ -243,7 +244,7 @@ declare module spine {
trackEntryPool: Pool<TrackEntry>; trackEntryPool: Pool<TrackEntry>;
constructor(data: AnimationStateData); constructor(data: AnimationStateData);
update(delta: number): void; update(delta: number): void;
updateMixingFrom(entry: TrackEntry, delta: number, animationCount: number): boolean; updateMixingFrom(to: TrackEntry, delta: number): boolean;
apply(skeleton: Skeleton): void; apply(skeleton: Skeleton): void;
applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number; applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number;
applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void; applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void;
@ -292,6 +293,7 @@ declare module spine {
mixTime: number; mixTime: number;
mixDuration: number; mixDuration: number;
interruptAlpha: number; interruptAlpha: number;
totalAlpha: number;
timelineData: number[]; timelineData: number[];
timelineDipMix: TrackEntry[]; timelineDipMix: TrackEntry[];
timelinesRotation: number[]; timelinesRotation: number[];

View File

@ -1100,7 +1100,7 @@ var spine;
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
var from = current.mixingFrom; var from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
while (from != null) { while (from != null) {
@ -1112,25 +1112,23 @@ var spine;
} }
this.queue.drain(); this.queue.drain();
}; };
AnimationState.prototype.updateMixingFrom = function (entry, delta, animationCount) { AnimationState.prototype.updateMixingFrom = function (to, delta) {
var from = entry.mixingFrom; var from = to.mixingFrom;
if (from == null) if (from == null)
return true; return true;
var finished = this.updateMixingFrom(from, delta, animationCount + 1); var finished = this.updateMixingFrom(from, delta);
if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.mixingFrom = from.mixingFrom;
if (entry.interruptAlpha <= 0) { to.interruptAlpha = from.interruptAlpha;
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
}; };
AnimationState.prototype.apply = function (skeleton) { AnimationState.prototype.apply = function (skeleton) {
@ -1165,10 +1163,10 @@ var spine;
for (var ii = 0; ii < timelineCount; ii++) { for (var ii = 0; ii < timelineCount; ii++) {
var timeline = timelines[ii]; var timeline = timelines[ii];
if (timeline instanceof spine.RotateTimeline) { if (timeline instanceof spine.RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1, firstFrame);
} }
else else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -1203,6 +1201,7 @@ var spine;
var timelinesRotation = from.timelinesRotation; var timelinesRotation = from.timelinesRotation;
var first = false; var first = false;
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
var timeline = timelines[i]; var timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -1214,14 +1213,18 @@ var spine;
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
var dipMix = timelineDipMix[i]; var dipMix = timelineDipMix[i];
if (dipMix != null)
alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof spine.RotateTimeline) if (timeline instanceof spine.RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -1533,6 +1536,7 @@ var spine;
AnimationState.SUBSEQUENT = 0; AnimationState.SUBSEQUENT = 0;
AnimationState.FIRST = 1; AnimationState.FIRST = 1;
AnimationState.DIP = 2; AnimationState.DIP = 2;
AnimationState.DIP_MIX = 3;
spine.AnimationState = AnimationState; spine.AnimationState = AnimationState;
var TrackEntry = (function () { var TrackEntry = (function () {
function TrackEntry() { function TrackEntry() {
@ -1560,6 +1564,7 @@ var spine;
var timelines = this.animation.timelines; var timelines = this.animation.timelines;
var timelinesCount = this.animation.timelines.length; var timelinesCount = this.animation.timelines.length;
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount); var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount); var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: for (var i = 0; i < timelinesCount; i++) { outer: for (var i = 0; i < timelinesCount; i++) {
var id = timelines[i].getPropertyId(); var id = timelines[i].getPropertyId();
@ -1568,16 +1573,17 @@ var spine;
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
var entry = mixingTo[ii]; var entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry; timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;

File diff suppressed because one or more lines are too long

View File

@ -231,6 +231,7 @@ declare module spine {
static SUBSEQUENT: number; static SUBSEQUENT: number;
static FIRST: number; static FIRST: number;
static DIP: number; static DIP: number;
static DIP_MIX: number;
data: AnimationStateData; data: AnimationStateData;
tracks: TrackEntry[]; tracks: TrackEntry[];
events: Event[]; events: Event[];
@ -243,7 +244,7 @@ declare module spine {
trackEntryPool: Pool<TrackEntry>; trackEntryPool: Pool<TrackEntry>;
constructor(data: AnimationStateData); constructor(data: AnimationStateData);
update(delta: number): void; update(delta: number): void;
updateMixingFrom(entry: TrackEntry, delta: number, animationCount: number): boolean; updateMixingFrom(to: TrackEntry, delta: number): boolean;
apply(skeleton: Skeleton): void; apply(skeleton: Skeleton): void;
applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number; applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number;
applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void; applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void;
@ -292,6 +293,7 @@ declare module spine {
mixTime: number; mixTime: number;
mixDuration: number; mixDuration: number;
interruptAlpha: number; interruptAlpha: number;
totalAlpha: number;
timelineData: number[]; timelineData: number[];
timelineDipMix: TrackEntry[]; timelineDipMix: TrackEntry[];
timelinesRotation: number[]; timelinesRotation: number[];

View File

@ -1100,7 +1100,7 @@ var spine;
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
var from = current.mixingFrom; var from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
while (from != null) { while (from != null) {
@ -1112,25 +1112,23 @@ var spine;
} }
this.queue.drain(); this.queue.drain();
}; };
AnimationState.prototype.updateMixingFrom = function (entry, delta, animationCount) { AnimationState.prototype.updateMixingFrom = function (to, delta) {
var from = entry.mixingFrom; var from = to.mixingFrom;
if (from == null) if (from == null)
return true; return true;
var finished = this.updateMixingFrom(from, delta, animationCount + 1); var finished = this.updateMixingFrom(from, delta);
if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.mixingFrom = from.mixingFrom;
if (entry.interruptAlpha <= 0) { to.interruptAlpha = from.interruptAlpha;
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
}; };
AnimationState.prototype.apply = function (skeleton) { AnimationState.prototype.apply = function (skeleton) {
@ -1165,10 +1163,10 @@ var spine;
for (var ii = 0; ii < timelineCount; ii++) { for (var ii = 0; ii < timelineCount; ii++) {
var timeline = timelines[ii]; var timeline = timelines[ii];
if (timeline instanceof spine.RotateTimeline) { if (timeline instanceof spine.RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1, firstFrame);
} }
else else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -1203,6 +1201,7 @@ var spine;
var timelinesRotation = from.timelinesRotation; var timelinesRotation = from.timelinesRotation;
var first = false; var first = false;
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
var timeline = timelines[i]; var timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -1214,14 +1213,18 @@ var spine;
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
var dipMix = timelineDipMix[i]; var dipMix = timelineDipMix[i];
if (dipMix != null)
alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof spine.RotateTimeline) if (timeline instanceof spine.RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -1533,6 +1536,7 @@ var spine;
AnimationState.SUBSEQUENT = 0; AnimationState.SUBSEQUENT = 0;
AnimationState.FIRST = 1; AnimationState.FIRST = 1;
AnimationState.DIP = 2; AnimationState.DIP = 2;
AnimationState.DIP_MIX = 3;
spine.AnimationState = AnimationState; spine.AnimationState = AnimationState;
var TrackEntry = (function () { var TrackEntry = (function () {
function TrackEntry() { function TrackEntry() {
@ -1560,6 +1564,7 @@ var spine;
var timelines = this.animation.timelines; var timelines = this.animation.timelines;
var timelinesCount = this.animation.timelines.length; var timelinesCount = this.animation.timelines.length;
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount); var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount); var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: for (var i = 0; i < timelinesCount; i++) { outer: for (var i = 0; i < timelinesCount; i++) {
var id = timelines[i].getPropertyId(); var id = timelines[i].getPropertyId();
@ -1568,16 +1573,17 @@ var spine;
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
var entry = mixingTo[ii]; var entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry; timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;

File diff suppressed because one or more lines are too long

View File

@ -231,6 +231,7 @@ declare module spine {
static SUBSEQUENT: number; static SUBSEQUENT: number;
static FIRST: number; static FIRST: number;
static DIP: number; static DIP: number;
static DIP_MIX: number;
data: AnimationStateData; data: AnimationStateData;
tracks: TrackEntry[]; tracks: TrackEntry[];
events: Event[]; events: Event[];
@ -243,7 +244,7 @@ declare module spine {
trackEntryPool: Pool<TrackEntry>; trackEntryPool: Pool<TrackEntry>;
constructor(data: AnimationStateData); constructor(data: AnimationStateData);
update(delta: number): void; update(delta: number): void;
updateMixingFrom(entry: TrackEntry, delta: number, animationCount: number): boolean; updateMixingFrom(to: TrackEntry, delta: number): boolean;
apply(skeleton: Skeleton): void; apply(skeleton: Skeleton): void;
applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number; applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number;
applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void; applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void;
@ -292,6 +293,7 @@ declare module spine {
mixTime: number; mixTime: number;
mixDuration: number; mixDuration: number;
interruptAlpha: number; interruptAlpha: number;
totalAlpha: number;
timelineData: number[]; timelineData: number[];
timelineDipMix: TrackEntry[]; timelineDipMix: TrackEntry[];
timelinesRotation: number[]; timelinesRotation: number[];

View File

@ -1100,7 +1100,7 @@ var spine;
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
var from = current.mixingFrom; var from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
while (from != null) { while (from != null) {
@ -1112,25 +1112,23 @@ var spine;
} }
this.queue.drain(); this.queue.drain();
}; };
AnimationState.prototype.updateMixingFrom = function (entry, delta, animationCount) { AnimationState.prototype.updateMixingFrom = function (to, delta) {
var from = entry.mixingFrom; var from = to.mixingFrom;
if (from == null) if (from == null)
return true; return true;
var finished = this.updateMixingFrom(from, delta, animationCount + 1); var finished = this.updateMixingFrom(from, delta);
if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.mixingFrom = from.mixingFrom;
if (entry.interruptAlpha <= 0) { to.interruptAlpha = from.interruptAlpha;
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
}; };
AnimationState.prototype.apply = function (skeleton) { AnimationState.prototype.apply = function (skeleton) {
@ -1165,10 +1163,10 @@ var spine;
for (var ii = 0; ii < timelineCount; ii++) { for (var ii = 0; ii < timelineCount; ii++) {
var timeline = timelines[ii]; var timeline = timelines[ii];
if (timeline instanceof spine.RotateTimeline) { if (timeline instanceof spine.RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1, firstFrame);
} }
else else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -1203,6 +1201,7 @@ var spine;
var timelinesRotation = from.timelinesRotation; var timelinesRotation = from.timelinesRotation;
var first = false; var first = false;
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
var timeline = timelines[i]; var timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -1214,14 +1213,18 @@ var spine;
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
var dipMix = timelineDipMix[i]; var dipMix = timelineDipMix[i];
if (dipMix != null)
alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof spine.RotateTimeline) if (timeline instanceof spine.RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -1533,6 +1536,7 @@ var spine;
AnimationState.SUBSEQUENT = 0; AnimationState.SUBSEQUENT = 0;
AnimationState.FIRST = 1; AnimationState.FIRST = 1;
AnimationState.DIP = 2; AnimationState.DIP = 2;
AnimationState.DIP_MIX = 3;
spine.AnimationState = AnimationState; spine.AnimationState = AnimationState;
var TrackEntry = (function () { var TrackEntry = (function () {
function TrackEntry() { function TrackEntry() {
@ -1560,6 +1564,7 @@ var spine;
var timelines = this.animation.timelines; var timelines = this.animation.timelines;
var timelinesCount = this.animation.timelines.length; var timelinesCount = this.animation.timelines.length;
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount); var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount); var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: for (var i = 0; i < timelinesCount; i++) { outer: for (var i = 0; i < timelinesCount; i++) {
var id = timelines[i].getPropertyId(); var id = timelines[i].getPropertyId();
@ -1568,16 +1573,17 @@ var spine;
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
var entry = mixingTo[ii]; var entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry; timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;

File diff suppressed because one or more lines are too long

View File

@ -231,6 +231,7 @@ declare module spine {
static SUBSEQUENT: number; static SUBSEQUENT: number;
static FIRST: number; static FIRST: number;
static DIP: number; static DIP: number;
static DIP_MIX: number;
data: AnimationStateData; data: AnimationStateData;
tracks: TrackEntry[]; tracks: TrackEntry[];
events: Event[]; events: Event[];
@ -243,7 +244,7 @@ declare module spine {
trackEntryPool: Pool<TrackEntry>; trackEntryPool: Pool<TrackEntry>;
constructor(data: AnimationStateData); constructor(data: AnimationStateData);
update(delta: number): void; update(delta: number): void;
updateMixingFrom(entry: TrackEntry, delta: number, animationCount: number): boolean; updateMixingFrom(to: TrackEntry, delta: number): boolean;
apply(skeleton: Skeleton): void; apply(skeleton: Skeleton): void;
applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number; applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number;
applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void; applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void;
@ -292,6 +293,7 @@ declare module spine {
mixTime: number; mixTime: number;
mixDuration: number; mixDuration: number;
interruptAlpha: number; interruptAlpha: number;
totalAlpha: number;
timelineData: number[]; timelineData: number[];
timelineDipMix: TrackEntry[]; timelineDipMix: TrackEntry[];
timelinesRotation: number[]; timelinesRotation: number[];

View File

@ -1100,7 +1100,7 @@ var spine;
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
var from = current.mixingFrom; var from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
while (from != null) { while (from != null) {
@ -1112,25 +1112,23 @@ var spine;
} }
this.queue.drain(); this.queue.drain();
}; };
AnimationState.prototype.updateMixingFrom = function (entry, delta, animationCount) { AnimationState.prototype.updateMixingFrom = function (to, delta) {
var from = entry.mixingFrom; var from = to.mixingFrom;
if (from == null) if (from == null)
return true; return true;
var finished = this.updateMixingFrom(from, delta, animationCount + 1); var finished = this.updateMixingFrom(from, delta);
if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.mixingFrom = from.mixingFrom;
if (entry.interruptAlpha <= 0) { to.interruptAlpha = from.interruptAlpha;
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
}; };
AnimationState.prototype.apply = function (skeleton) { AnimationState.prototype.apply = function (skeleton) {
@ -1165,10 +1163,10 @@ var spine;
for (var ii = 0; ii < timelineCount; ii++) { for (var ii = 0; ii < timelineCount; ii++) {
var timeline = timelines[ii]; var timeline = timelines[ii];
if (timeline instanceof spine.RotateTimeline) { if (timeline instanceof spine.RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1, firstFrame);
} }
else else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -1203,6 +1201,7 @@ var spine;
var timelinesRotation = from.timelinesRotation; var timelinesRotation = from.timelinesRotation;
var first = false; var first = false;
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
var timeline = timelines[i]; var timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -1214,14 +1213,18 @@ var spine;
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
var dipMix = timelineDipMix[i]; var dipMix = timelineDipMix[i];
if (dipMix != null)
alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof spine.RotateTimeline) if (timeline instanceof spine.RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -1533,6 +1536,7 @@ var spine;
AnimationState.SUBSEQUENT = 0; AnimationState.SUBSEQUENT = 0;
AnimationState.FIRST = 1; AnimationState.FIRST = 1;
AnimationState.DIP = 2; AnimationState.DIP = 2;
AnimationState.DIP_MIX = 3;
spine.AnimationState = AnimationState; spine.AnimationState = AnimationState;
var TrackEntry = (function () { var TrackEntry = (function () {
function TrackEntry() { function TrackEntry() {
@ -1560,6 +1564,7 @@ var spine;
var timelines = this.animation.timelines; var timelines = this.animation.timelines;
var timelinesCount = this.animation.timelines.length; var timelinesCount = this.animation.timelines.length;
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount); var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount); var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: for (var i = 0; i < timelinesCount; i++) { outer: for (var i = 0; i < timelinesCount; i++) {
var id = timelines[i].getPropertyId(); var id = timelines[i].getPropertyId();
@ -1568,16 +1573,17 @@ var spine;
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
var entry = mixingTo[ii]; var entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry; timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;

File diff suppressed because one or more lines are too long

View File

@ -231,6 +231,7 @@ declare module spine {
static SUBSEQUENT: number; static SUBSEQUENT: number;
static FIRST: number; static FIRST: number;
static DIP: number; static DIP: number;
static DIP_MIX: number;
data: AnimationStateData; data: AnimationStateData;
tracks: TrackEntry[]; tracks: TrackEntry[];
events: Event[]; events: Event[];
@ -243,7 +244,7 @@ declare module spine {
trackEntryPool: Pool<TrackEntry>; trackEntryPool: Pool<TrackEntry>;
constructor(data: AnimationStateData); constructor(data: AnimationStateData);
update(delta: number): void; update(delta: number): void;
updateMixingFrom(entry: TrackEntry, delta: number, animationCount: number): boolean; updateMixingFrom(to: TrackEntry, delta: number): boolean;
apply(skeleton: Skeleton): void; apply(skeleton: Skeleton): void;
applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number; applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number;
applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void; applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void;
@ -292,6 +293,7 @@ declare module spine {
mixTime: number; mixTime: number;
mixDuration: number; mixDuration: number;
interruptAlpha: number; interruptAlpha: number;
totalAlpha: number;
timelineData: number[]; timelineData: number[];
timelineDipMix: TrackEntry[]; timelineDipMix: TrackEntry[];
timelinesRotation: number[]; timelinesRotation: number[];

View File

@ -1100,7 +1100,7 @@ var spine;
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
var from = current.mixingFrom; var from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
while (from != null) { while (from != null) {
@ -1112,25 +1112,23 @@ var spine;
} }
this.queue.drain(); this.queue.drain();
}; };
AnimationState.prototype.updateMixingFrom = function (entry, delta, animationCount) { AnimationState.prototype.updateMixingFrom = function (to, delta) {
var from = entry.mixingFrom; var from = to.mixingFrom;
if (from == null) if (from == null)
return true; return true;
var finished = this.updateMixingFrom(from, delta, animationCount + 1); var finished = this.updateMixingFrom(from, delta);
if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.mixingFrom = from.mixingFrom;
if (entry.interruptAlpha <= 0) { to.interruptAlpha = from.interruptAlpha;
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
}; };
AnimationState.prototype.apply = function (skeleton) { AnimationState.prototype.apply = function (skeleton) {
@ -1165,10 +1163,10 @@ var spine;
for (var ii = 0; ii < timelineCount; ii++) { for (var ii = 0; ii < timelineCount; ii++) {
var timeline = timelines[ii]; var timeline = timelines[ii];
if (timeline instanceof spine.RotateTimeline) { if (timeline instanceof spine.RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1, firstFrame);
} }
else else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -1203,6 +1201,7 @@ var spine;
var timelinesRotation = from.timelinesRotation; var timelinesRotation = from.timelinesRotation;
var first = false; var first = false;
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
var timeline = timelines[i]; var timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -1214,14 +1213,18 @@ var spine;
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
var dipMix = timelineDipMix[i]; var dipMix = timelineDipMix[i];
if (dipMix != null)
alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof spine.RotateTimeline) if (timeline instanceof spine.RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -1533,6 +1536,7 @@ var spine;
AnimationState.SUBSEQUENT = 0; AnimationState.SUBSEQUENT = 0;
AnimationState.FIRST = 1; AnimationState.FIRST = 1;
AnimationState.DIP = 2; AnimationState.DIP = 2;
AnimationState.DIP_MIX = 3;
spine.AnimationState = AnimationState; spine.AnimationState = AnimationState;
var TrackEntry = (function () { var TrackEntry = (function () {
function TrackEntry() { function TrackEntry() {
@ -1560,6 +1564,7 @@ var spine;
var timelines = this.animation.timelines; var timelines = this.animation.timelines;
var timelinesCount = this.animation.timelines.length; var timelinesCount = this.animation.timelines.length;
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount); var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount); var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: for (var i = 0; i < timelinesCount; i++) { outer: for (var i = 0; i < timelinesCount; i++) {
var id = timelines[i].getPropertyId(); var id = timelines[i].getPropertyId();
@ -1568,16 +1573,17 @@ var spine;
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
var entry = mixingTo[ii]; var entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry; timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;

File diff suppressed because one or more lines are too long

View File

@ -231,6 +231,7 @@ declare module spine {
static SUBSEQUENT: number; static SUBSEQUENT: number;
static FIRST: number; static FIRST: number;
static DIP: number; static DIP: number;
static DIP_MIX: number;
data: AnimationStateData; data: AnimationStateData;
tracks: TrackEntry[]; tracks: TrackEntry[];
events: Event[]; events: Event[];
@ -243,7 +244,7 @@ declare module spine {
trackEntryPool: Pool<TrackEntry>; trackEntryPool: Pool<TrackEntry>;
constructor(data: AnimationStateData); constructor(data: AnimationStateData);
update(delta: number): void; update(delta: number): void;
updateMixingFrom(entry: TrackEntry, delta: number, animationCount: number): boolean; updateMixingFrom(to: TrackEntry, delta: number): boolean;
apply(skeleton: Skeleton): void; apply(skeleton: Skeleton): void;
applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number; applyMixingFrom(to: TrackEntry, skeleton: Skeleton): number;
applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void; applyRotateTimeline(timeline: Timeline, skeleton: Skeleton, time: number, alpha: number, setupPose: boolean, timelinesRotation: Array<number>, i: number, firstFrame: boolean): void;
@ -292,6 +293,7 @@ declare module spine {
mixTime: number; mixTime: number;
mixDuration: number; mixDuration: number;
interruptAlpha: number; interruptAlpha: number;
totalAlpha: number;
timelineData: number[]; timelineData: number[];
timelineDipMix: TrackEntry[]; timelineDipMix: TrackEntry[];
timelinesRotation: number[]; timelinesRotation: number[];

View File

@ -1100,7 +1100,7 @@ var spine;
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
var from = current.mixingFrom; var from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
while (from != null) { while (from != null) {
@ -1112,25 +1112,23 @@ var spine;
} }
this.queue.drain(); this.queue.drain();
}; };
AnimationState.prototype.updateMixingFrom = function (entry, delta, animationCount) { AnimationState.prototype.updateMixingFrom = function (to, delta) {
var from = entry.mixingFrom; var from = to.mixingFrom;
if (from == null) if (from == null)
return true; return true;
var finished = this.updateMixingFrom(from, delta, animationCount + 1); var finished = this.updateMixingFrom(from, delta);
if (entry.mixTime > 0 && (entry.mixTime >= entry.mixDuration || entry.timeScale == 0)) { if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.mixingFrom = from.mixingFrom;
if (entry.interruptAlpha <= 0) { to.interruptAlpha = from.interruptAlpha;
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
}; };
AnimationState.prototype.apply = function (skeleton) { AnimationState.prototype.apply = function (skeleton) {
@ -1165,10 +1163,10 @@ var spine;
for (var ii = 0; ii < timelineCount; ii++) { for (var ii = 0; ii < timelineCount; ii++) {
var timeline = timelines[ii]; var timeline = timelines[ii];
if (timeline instanceof spine.RotateTimeline) { if (timeline instanceof spine.RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1, firstFrame);
} }
else else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -1203,6 +1201,7 @@ var spine;
var timelinesRotation = from.timelinesRotation; var timelinesRotation = from.timelinesRotation;
var first = false; var first = false;
var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
var timeline = timelines[i]; var timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -1214,14 +1213,18 @@ var spine;
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
var dipMix = timelineDipMix[i]; var dipMix = timelineDipMix[i];
if (dipMix != null)
alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof spine.RotateTimeline) if (timeline instanceof spine.RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -1533,6 +1536,7 @@ var spine;
AnimationState.SUBSEQUENT = 0; AnimationState.SUBSEQUENT = 0;
AnimationState.FIRST = 1; AnimationState.FIRST = 1;
AnimationState.DIP = 2; AnimationState.DIP = 2;
AnimationState.DIP_MIX = 3;
spine.AnimationState = AnimationState; spine.AnimationState = AnimationState;
var TrackEntry = (function () { var TrackEntry = (function () {
function TrackEntry() { function TrackEntry() {
@ -1560,6 +1564,7 @@ var spine;
var timelines = this.animation.timelines; var timelines = this.animation.timelines;
var timelinesCount = this.animation.timelines.length; var timelinesCount = this.animation.timelines.length;
var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount); var timelineData = spine.Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount); var timelineDipMix = spine.Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: for (var i = 0; i < timelinesCount; i++) { outer: for (var i = 0; i < timelinesCount; i++) {
var id = timelines[i].getPropertyId(); var id = timelines[i].getPropertyId();
@ -1568,16 +1573,17 @@ var spine;
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
var entry = mixingTo[ii]; var entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry; timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;

File diff suppressed because one or more lines are too long

View File

@ -34,6 +34,7 @@ module spine {
static SUBSEQUENT = 0; static SUBSEQUENT = 0;
static FIRST = 1; static FIRST = 1;
static DIP = 2; static DIP = 2;
static DIP_MIX = 3;
data: AnimationStateData; data: AnimationStateData;
tracks = new Array<TrackEntry>(); tracks = new Array<TrackEntry>();
@ -91,7 +92,7 @@ module spine {
this.disposeNext(current); this.disposeNext(current);
continue; continue;
} }
if (current.mixingFrom != null && this.updateMixingFrom(current, delta, 2)) { if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) {
// End mixing from entries once all have completed. // End mixing from entries once all have completed.
let from = current.mixingFrom; let from = current.mixingFrom;
current.mixingFrom = null; current.mixingFrom = null;
@ -107,29 +108,26 @@ module spine {
this.queue.drain(); this.queue.drain();
} }
updateMixingFrom (entry: TrackEntry, delta: number, animationCount: number): boolean { updateMixingFrom (to: TrackEntry, delta: number): boolean {
let from = entry.mixingFrom; let from = to.mixingFrom;
if (from == null) return true; if (from == null) return true;
let finished = this.updateMixingFrom(from, delta, animationCount + 1); let finished = this.updateMixingFrom(from, delta);
// Require mixTime > 0 to ensure the mixing from entry was applied at least once. // 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 (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) {
if (animationCount > 5 && from.mixingFrom == null) { if (from.totalAlpha == 0) {
// Limit linked list by speeding up and removing old entries. to.mixingFrom = from.mixingFrom;
entry.interruptAlpha = Math.max(0, entry.interruptAlpha - delta * 0.66); to.interruptAlpha = from.interruptAlpha;
if (entry.interruptAlpha <= 0) {
entry.mixingFrom = null;
this.queue.end(from); this.queue.end(from);
} }
}
return finished; return finished;
} }
from.animationLast = from.nextAnimationLast; from.animationLast = from.nextAnimationLast;
from.trackLast = from.nextTrackLast; from.trackLast = from.nextTrackLast;
from.trackTime += delta * from.timeScale; from.trackTime += delta * from.timeScale;
entry.mixTime += delta * entry.timeScale; to.mixTime += delta * to.timeScale;
return false; return false;
} }
@ -168,10 +166,10 @@ module spine {
for (let ii = 0; ii < timelineCount; ii++) { for (let ii = 0; ii < timelineCount; ii++) {
let timeline = timelines[ii]; let timeline = timelines[ii];
if (timeline instanceof RotateTimeline) { if (timeline instanceof RotateTimeline) {
this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] > 0, timelinesRotation, ii << 1, this.applyRotateTimeline(timeline, skeleton, animationTime, mix, timelineData[ii] >= AnimationState.FIRST, timelinesRotation, ii << 1,
firstFrame); firstFrame);
} else } else
timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] > 0, false); timeline.apply(skeleton, animationLast, animationTime, events, mix, timelineData[ii] >= AnimationState.FIRST, false);
} }
} }
this.queueEvents(current, animationTime); this.queueEvents(current, animationTime);
@ -209,6 +207,7 @@ module spine {
let first = false; let first = false;
let alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha; let alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha;
from.totalAlpha = 0;
for (var i = 0; i < timelineCount; i++) { for (var i = 0; i < timelineCount; i++) {
let timeline = timelines[i]; let timeline = timelines[i];
switch (timelineData[i]) { switch (timelineData[i]) {
@ -220,13 +219,18 @@ module spine {
first = true; first = true;
alpha = alphaMix; alpha = alphaMix;
break; break;
case AnimationState.DIP:
first = true;
alpha = alphaDip;
break;
default: default:
first = true; first = true;
alpha = alphaDip; alpha = alphaDip;
let dipMix = timelineDipMix[i]; let dipMix = timelineDipMix[i];
if (dipMix != null) alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration);
break; break;
} }
from.totalAlpha += alpha;
if (timeline instanceof RotateTimeline) if (timeline instanceof RotateTimeline)
this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame); this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, first, timelinesRotation, i << 1, firstFrame);
else { else {
@ -578,7 +582,7 @@ module spine {
eventThreshold: number; attachmentThreshold: number; drawOrderThreshold: number; eventThreshold: number; attachmentThreshold: number; drawOrderThreshold: number;
animationStart: number; animationEnd: number; animationLast: number; nextAnimationLast: number; animationStart: number; animationEnd: number; animationLast: number; nextAnimationLast: number;
delay: number; trackTime: number; trackLast: number; nextTrackLast: number; trackEnd: number; timeScale: number; delay: number; trackTime: number; trackLast: number; nextTrackLast: number; trackEnd: number; timeScale: number;
alpha: number; mixTime: number; mixDuration: number; interruptAlpha: number; alpha: number; mixTime: number; mixDuration: number; interruptAlpha: number; totalAlpha: number;
timelineData = new Array<number>(); timelineData = new Array<number>();
timelineDipMix = new Array<TrackEntry>(); timelineDipMix = new Array<TrackEntry>();
timelinesRotation = new Array<number>(); timelinesRotation = new Array<number>();
@ -603,6 +607,7 @@ module spine {
let timelines = this.animation.timelines; let timelines = this.animation.timelines;
let timelinesCount = this.animation.timelines.length; let timelinesCount = this.animation.timelines.length;
let timelineData = Utils.setArraySize(this.timelineData, timelinesCount); let timelineData = Utils.setArraySize(this.timelineData, timelinesCount);
this.timelineDipMix.length = 0;
let timelineDipMix = Utils.setArraySize(this.timelineDipMix, timelinesCount); let timelineDipMix = Utils.setArraySize(this.timelineDipMix, timelinesCount);
outer: outer:
@ -613,15 +618,17 @@ module spine {
else if (to == null || !to.hasTimeline(id)) else if (to == null || !to.hasTimeline(id))
timelineData[i] = AnimationState.FIRST; timelineData[i] = AnimationState.FIRST;
else { else {
timelineData[i] = AnimationState.DIP;
for (var ii = mixingToLast; ii >= 0; ii--) { for (var ii = mixingToLast; ii >= 0; ii--) {
let entry = mixingTo[ii]; let entry = mixingTo[ii];
if (!entry.hasTimeline(id)) { if (!entry.hasTimeline(id)) {
if (entry.mixDuration > 0) timelineDipMix[i] = entry; if (entry.mixDuration > 0) {
timelineData[i] = AnimationState.DIP_MIX;
timelineDipMix[i] = entry;
continue outer; continue outer;
} }
} }
timelineDipMix[i] = null; }
timelineData[i] = AnimationState.DIP;
} }
} }
return lastEntry; return lastEntry;