@esotericsoftware/spine-core 4.0.7 → 4.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Animation.js +577 -710
- package/dist/AnimationState.js +239 -259
- package/dist/AnimationStateData.js +15 -17
- package/dist/AssetManagerBase.d.ts +3 -0
- package/dist/AssetManagerBase.js +168 -147
- package/dist/AtlasAttachmentLoader.js +20 -22
- package/dist/Bone.js +89 -91
- package/dist/BoneData.js +4 -6
- package/dist/ConstraintData.js +4 -6
- package/dist/Event.js +4 -6
- package/dist/EventData.js +4 -6
- package/dist/IkConstraint.js +48 -50
- package/dist/IkConstraintData.js +12 -31
- package/dist/PathConstraint.js +116 -118
- package/dist/PathConstraintData.js +9 -28
- package/dist/Skeleton.d.ts +0 -4
- package/dist/Skeleton.js +190 -213
- package/dist/SkeletonBinary.js +352 -363
- package/dist/SkeletonBounds.js +79 -81
- package/dist/SkeletonClipping.js +86 -88
- package/dist/SkeletonData.d.ts +0 -2
- package/dist/SkeletonData.js +46 -66
- package/dist/SkeletonJson.js +307 -307
- package/dist/Skin.js +65 -69
- package/dist/Slot.js +16 -18
- package/dist/SlotData.js +4 -6
- package/dist/Texture.js +14 -39
- package/dist/TextureAtlas.js +56 -85
- package/dist/TransformConstraint.js +77 -79
- package/dist/TransformConstraintData.js +20 -39
- package/dist/Triangulator.js +71 -73
- package/dist/Updatable.js +1 -1
- package/dist/Utils.js +183 -245
- package/dist/VertexEffect.js +1 -1
- package/dist/attachments/Attachment.js +41 -62
- package/dist/attachments/AttachmentLoader.js +1 -1
- package/dist/attachments/BoundingBoxAttachment.js +9 -28
- package/dist/attachments/ClippingAttachment.js +9 -28
- package/dist/attachments/MeshAttachment.js +29 -48
- package/dist/attachments/PathAttachment.js +11 -30
- package/dist/attachments/PointAttachment.js +16 -35
- package/dist/attachments/RegionAttachment.js +82 -101
- package/dist/attachments/index.js +1 -1
- package/dist/iife/spine-core.js +89 -85
- package/dist/iife/spine-core.js.map +2 -2
- package/dist/iife/spine-core.min.js +2 -2
- package/dist/index.js +1 -1
- package/dist/polyfills.js +2 -2
- package/dist/vertexeffects/JitterEffect.js +10 -12
- package/dist/vertexeffects/SwirlEffect.js +18 -20
- package/package.json +1 -1
- package/dist/Animation.js.map +0 -1
- package/dist/AnimationState.js.map +0 -1
- package/dist/AnimationStateData.js.map +0 -1
- package/dist/AssetManagerBase.js.map +0 -1
- package/dist/AtlasAttachmentLoader.js.map +0 -1
- package/dist/Bone.js.map +0 -1
- package/dist/BoneData.js.map +0 -1
- package/dist/ConstraintData.js.map +0 -1
- package/dist/Event.js.map +0 -1
- package/dist/EventData.js.map +0 -1
- package/dist/IkConstraint.js.map +0 -1
- package/dist/IkConstraintData.js.map +0 -1
- package/dist/PathConstraint.js.map +0 -1
- package/dist/PathConstraintData.js.map +0 -1
- package/dist/Skeleton.js.map +0 -1
- package/dist/SkeletonBinary.js.map +0 -1
- package/dist/SkeletonBounds.js.map +0 -1
- package/dist/SkeletonClipping.js.map +0 -1
- package/dist/SkeletonData.js.map +0 -1
- package/dist/SkeletonJson.js.map +0 -1
- package/dist/Skin.js.map +0 -1
- package/dist/Slot.js.map +0 -1
- package/dist/SlotData.js.map +0 -1
- package/dist/Texture.js.map +0 -1
- package/dist/TextureAtlas.js.map +0 -1
- package/dist/TransformConstraint.js.map +0 -1
- package/dist/TransformConstraintData.js.map +0 -1
- package/dist/Triangulator.js.map +0 -1
- package/dist/Updatable.js.map +0 -1
- package/dist/Utils.js.map +0 -1
- package/dist/VertexEffect.js.map +0 -1
- package/dist/attachments/Attachment.js.map +0 -1
- package/dist/attachments/AttachmentLoader.js.map +0 -1
- package/dist/attachments/BoundingBoxAttachment.js.map +0 -1
- package/dist/attachments/ClippingAttachment.js.map +0 -1
- package/dist/attachments/MeshAttachment.js.map +0 -1
- package/dist/attachments/PathAttachment.js.map +0 -1
- package/dist/attachments/PointAttachment.js.map +0 -1
- package/dist/attachments/RegionAttachment.js.map +0 -1
- package/dist/attachments/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/polyfills.js.map +0 -1
- package/dist/vertexeffects/JitterEffect.js.map +0 -1
- package/dist/vertexeffects/SwirlEffect.js.map +0 -1
package/dist/AnimationState.js
CHANGED
|
@@ -32,8 +32,8 @@ import { StringSet, Pool, Utils, MathUtils } from "./Utils";
|
|
|
32
32
|
* multiple animations on top of each other (layering).
|
|
33
33
|
*
|
|
34
34
|
* See [Applying Animations](http://esotericsoftware.com/spine-applying-animations/) in the Spine Runtimes Guide. */
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
export class AnimationState {
|
|
36
|
+
constructor(data) {
|
|
37
37
|
/** The list of tracks that currently have animations, which may contain null entries. */
|
|
38
38
|
this.tracks = new Array();
|
|
39
39
|
/** Multiplier for the delta time when the animation state is updated, causing time for all animations and mixes to play slower
|
|
@@ -47,25 +47,25 @@ var AnimationState = /** @class */ (function () {
|
|
|
47
47
|
this.queue = new EventQueue(this);
|
|
48
48
|
this.propertyIDs = new StringSet();
|
|
49
49
|
this.animationsChanged = false;
|
|
50
|
-
this.trackEntryPool = new Pool(
|
|
50
|
+
this.trackEntryPool = new Pool(() => new TrackEntry());
|
|
51
51
|
this.data = data;
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
static emptyAnimation() {
|
|
54
54
|
if (!_emptyAnimation)
|
|
55
55
|
_emptyAnimation = new Animation("<empty>", [], 0);
|
|
56
56
|
return _emptyAnimation;
|
|
57
|
-
}
|
|
57
|
+
}
|
|
58
58
|
/** Increments each track entry {@link TrackEntry#trackTime()}, setting queued animations as current if needed. */
|
|
59
|
-
|
|
59
|
+
update(delta) {
|
|
60
60
|
delta *= this.timeScale;
|
|
61
|
-
|
|
62
|
-
for (
|
|
63
|
-
|
|
61
|
+
let tracks = this.tracks;
|
|
62
|
+
for (let i = 0, n = tracks.length; i < n; i++) {
|
|
63
|
+
let current = tracks[i];
|
|
64
64
|
if (!current)
|
|
65
65
|
continue;
|
|
66
66
|
current.animationLast = current.nextAnimationLast;
|
|
67
67
|
current.trackLast = current.nextTrackLast;
|
|
68
|
-
|
|
68
|
+
let currentDelta = delta * current.timeScale;
|
|
69
69
|
if (current.delay > 0) {
|
|
70
70
|
current.delay -= currentDelta;
|
|
71
71
|
if (current.delay > 0)
|
|
@@ -73,10 +73,10 @@ var AnimationState = /** @class */ (function () {
|
|
|
73
73
|
currentDelta = -current.delay;
|
|
74
74
|
current.delay = 0;
|
|
75
75
|
}
|
|
76
|
-
|
|
76
|
+
let next = current.next;
|
|
77
77
|
if (next) {
|
|
78
78
|
// When the next entry's delay is passed, change to the next entry, preserving leftover time.
|
|
79
|
-
|
|
79
|
+
let nextTime = current.trackLast - next.delay;
|
|
80
80
|
if (nextTime >= 0) {
|
|
81
81
|
next.delay = 0;
|
|
82
82
|
next.trackTime += current.timeScale == 0 ? 0 : (nextTime / current.timeScale + delta) * next.timeScale;
|
|
@@ -97,7 +97,7 @@ var AnimationState = /** @class */ (function () {
|
|
|
97
97
|
}
|
|
98
98
|
if (current.mixingFrom && this.updateMixingFrom(current, delta)) {
|
|
99
99
|
// End mixing from entries once all have completed.
|
|
100
|
-
|
|
100
|
+
let from = current.mixingFrom;
|
|
101
101
|
current.mixingFrom = null;
|
|
102
102
|
if (from)
|
|
103
103
|
from.mixingTo = null;
|
|
@@ -109,13 +109,13 @@ var AnimationState = /** @class */ (function () {
|
|
|
109
109
|
current.trackTime += currentDelta;
|
|
110
110
|
}
|
|
111
111
|
this.queue.drain();
|
|
112
|
-
}
|
|
112
|
+
}
|
|
113
113
|
/** Returns true when all mixing from entries are complete. */
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
updateMixingFrom(to, delta) {
|
|
115
|
+
let from = to.mixingFrom;
|
|
116
116
|
if (!from)
|
|
117
117
|
return true;
|
|
118
|
-
|
|
118
|
+
let finished = this.updateMixingFrom(from, delta);
|
|
119
119
|
from.animationLast = from.nextAnimationLast;
|
|
120
120
|
from.trackLast = from.nextTrackLast;
|
|
121
121
|
// Require mixTime > 0 to ensure the mixing from entry was applied at least once.
|
|
@@ -133,41 +133,41 @@ var AnimationState = /** @class */ (function () {
|
|
|
133
133
|
from.trackTime += delta * from.timeScale;
|
|
134
134
|
to.mixTime += delta;
|
|
135
135
|
return false;
|
|
136
|
-
}
|
|
136
|
+
}
|
|
137
137
|
/** Poses the skeleton using the track entry animations. There are no side effects other than invoking listeners, so the
|
|
138
138
|
* animation state can be applied to multiple skeletons to pose them identically.
|
|
139
139
|
* @returns True if any animations were applied. */
|
|
140
|
-
|
|
140
|
+
apply(skeleton) {
|
|
141
141
|
if (!skeleton)
|
|
142
142
|
throw new Error("skeleton cannot be null.");
|
|
143
143
|
if (this.animationsChanged)
|
|
144
144
|
this._animationsChanged();
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
for (
|
|
149
|
-
|
|
145
|
+
let events = this.events;
|
|
146
|
+
let tracks = this.tracks;
|
|
147
|
+
let applied = false;
|
|
148
|
+
for (let i = 0, n = tracks.length; i < n; i++) {
|
|
149
|
+
let current = tracks[i];
|
|
150
150
|
if (!current || current.delay > 0)
|
|
151
151
|
continue;
|
|
152
152
|
applied = true;
|
|
153
|
-
|
|
153
|
+
let blend = i == 0 ? MixBlend.first : current.mixBlend;
|
|
154
154
|
// Apply mixing from entries first.
|
|
155
|
-
|
|
155
|
+
let mix = current.alpha;
|
|
156
156
|
if (current.mixingFrom)
|
|
157
157
|
mix *= this.applyMixingFrom(current, skeleton, blend);
|
|
158
158
|
else if (current.trackTime >= current.trackEnd && !current.next)
|
|
159
159
|
mix = 0;
|
|
160
160
|
// Apply current entry.
|
|
161
|
-
|
|
162
|
-
|
|
161
|
+
let animationLast = current.animationLast, animationTime = current.getAnimationTime(), applyTime = animationTime;
|
|
162
|
+
let applyEvents = events;
|
|
163
163
|
if (current.reverse) {
|
|
164
164
|
applyTime = current.animation.duration - applyTime;
|
|
165
165
|
applyEvents = null;
|
|
166
166
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if ((
|
|
170
|
-
for (
|
|
167
|
+
let timelines = current.animation.timelines;
|
|
168
|
+
let timelineCount = timelines.length;
|
|
169
|
+
if ((i == 0 && mix == 1) || blend == MixBlend.add) {
|
|
170
|
+
for (let ii = 0; ii < timelineCount; ii++) {
|
|
171
171
|
// Fixes issue #302 on IOS9 where mix, blend sometimes became undefined and caused assets
|
|
172
172
|
// to sometimes stop rendering when using color correction, as their RGBA values become NaN.
|
|
173
173
|
// (https://github.com/pixijs/pixi-spine/issues/302)
|
|
@@ -180,23 +180,23 @@ var AnimationState = /** @class */ (function () {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
else {
|
|
183
|
-
|
|
184
|
-
|
|
183
|
+
let timelineMode = current.timelineMode;
|
|
184
|
+
let firstFrame = current.timelinesRotation.length != timelineCount << 1;
|
|
185
185
|
if (firstFrame)
|
|
186
186
|
current.timelinesRotation.length = timelineCount << 1;
|
|
187
|
-
for (
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (
|
|
191
|
-
this.applyRotateTimeline(
|
|
187
|
+
for (let ii = 0; ii < timelineCount; ii++) {
|
|
188
|
+
let timeline = timelines[ii];
|
|
189
|
+
let timelineBlend = timelineMode[ii] == SUBSEQUENT ? blend : MixBlend.setup;
|
|
190
|
+
if (timeline instanceof RotateTimeline) {
|
|
191
|
+
this.applyRotateTimeline(timeline, skeleton, applyTime, mix, timelineBlend, current.timelinesRotation, ii << 1, firstFrame);
|
|
192
192
|
}
|
|
193
|
-
else if (
|
|
194
|
-
this.applyAttachmentTimeline(
|
|
193
|
+
else if (timeline instanceof AttachmentTimeline) {
|
|
194
|
+
this.applyAttachmentTimeline(timeline, skeleton, applyTime, blend, true);
|
|
195
195
|
}
|
|
196
196
|
else {
|
|
197
197
|
// This fixes the WebKit 602 specific issue described at http://esotericsoftware.com/forum/iOS-10-disappearing-graphics-10109
|
|
198
198
|
Utils.webkit602BugfixHelper(mix, blend);
|
|
199
|
-
|
|
199
|
+
timeline.apply(skeleton, animationLast, applyTime, applyEvents, mix, timelineBlend, MixDirection.mixIn);
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
202
|
}
|
|
@@ -220,12 +220,12 @@ var AnimationState = /** @class */ (function () {
|
|
|
220
220
|
this.unkeyedState += 2; // Increasing after each use avoids the need to reset attachmentState for every slot.
|
|
221
221
|
this.queue.drain();
|
|
222
222
|
return applied;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
|
|
223
|
+
}
|
|
224
|
+
applyMixingFrom(to, skeleton, blend) {
|
|
225
|
+
let from = to.mixingFrom;
|
|
226
226
|
if (from.mixingFrom)
|
|
227
227
|
this.applyMixingFrom(from, skeleton, blend);
|
|
228
|
-
|
|
228
|
+
let mix = 0;
|
|
229
229
|
if (to.mixDuration == 0) { // Single frame mix to undo mixingFrom changes.
|
|
230
230
|
mix = 1;
|
|
231
231
|
if (blend == MixBlend.first)
|
|
@@ -238,32 +238,32 @@ var AnimationState = /** @class */ (function () {
|
|
|
238
238
|
if (blend != MixBlend.first)
|
|
239
239
|
blend = from.mixBlend;
|
|
240
240
|
}
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
241
|
+
let attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold;
|
|
242
|
+
let timelines = from.animation.timelines;
|
|
243
|
+
let timelineCount = timelines.length;
|
|
244
|
+
let alphaHold = from.alpha * to.interruptAlpha, alphaMix = alphaHold * (1 - mix);
|
|
245
|
+
let animationLast = from.animationLast, animationTime = from.getAnimationTime(), applyTime = animationTime;
|
|
246
|
+
let events = null;
|
|
247
247
|
if (from.reverse)
|
|
248
248
|
applyTime = from.animation.duration - applyTime;
|
|
249
249
|
else if (mix < from.eventThreshold)
|
|
250
250
|
events = this.events;
|
|
251
251
|
if (blend == MixBlend.add) {
|
|
252
|
-
for (
|
|
252
|
+
for (let i = 0; i < timelineCount; i++)
|
|
253
253
|
timelines[i].apply(skeleton, animationLast, applyTime, events, alphaMix, blend, MixDirection.mixOut);
|
|
254
254
|
}
|
|
255
255
|
else {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
256
|
+
let timelineMode = from.timelineMode;
|
|
257
|
+
let timelineHoldMix = from.timelineHoldMix;
|
|
258
|
+
let firstFrame = from.timelinesRotation.length != timelineCount << 1;
|
|
259
259
|
if (firstFrame)
|
|
260
260
|
from.timelinesRotation.length = timelineCount << 1;
|
|
261
261
|
from.totalAlpha = 0;
|
|
262
|
-
for (
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
262
|
+
for (let i = 0; i < timelineCount; i++) {
|
|
263
|
+
let timeline = timelines[i];
|
|
264
|
+
let direction = MixDirection.mixOut;
|
|
265
|
+
let timelineBlend;
|
|
266
|
+
let alpha = 0;
|
|
267
267
|
switch (timelineMode[i]) {
|
|
268
268
|
case SUBSEQUENT:
|
|
269
269
|
if (!drawOrder && timeline instanceof DrawOrderTimeline)
|
|
@@ -285,7 +285,7 @@ var AnimationState = /** @class */ (function () {
|
|
|
285
285
|
break;
|
|
286
286
|
default:
|
|
287
287
|
timelineBlend = MixBlend.setup;
|
|
288
|
-
|
|
288
|
+
let holdMix = timelineHoldMix[i];
|
|
289
289
|
alpha = alphaHold * Math.max(0, 1 - holdMix.mixTime / holdMix.mixDuration);
|
|
290
290
|
break;
|
|
291
291
|
}
|
|
@@ -309,8 +309,8 @@ var AnimationState = /** @class */ (function () {
|
|
|
309
309
|
from.nextAnimationLast = animationTime;
|
|
310
310
|
from.nextTrackLast = from.trackTime;
|
|
311
311
|
return mix;
|
|
312
|
-
}
|
|
313
|
-
|
|
312
|
+
}
|
|
313
|
+
applyAttachmentTimeline(timeline, skeleton, time, blend, attachments) {
|
|
314
314
|
var slot = skeleton.slots[timeline.slotIndex];
|
|
315
315
|
if (!slot.bone.active)
|
|
316
316
|
return;
|
|
@@ -323,24 +323,24 @@ var AnimationState = /** @class */ (function () {
|
|
|
323
323
|
// If an attachment wasn't set (ie before the first frame or attachments is false), set the setup attachment later.
|
|
324
324
|
if (slot.attachmentState <= this.unkeyedState)
|
|
325
325
|
slot.attachmentState = this.unkeyedState + SETUP;
|
|
326
|
-
}
|
|
327
|
-
|
|
326
|
+
}
|
|
327
|
+
setAttachment(skeleton, slot, attachmentName, attachments) {
|
|
328
328
|
slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(slot.data.index, attachmentName));
|
|
329
329
|
if (attachments)
|
|
330
330
|
slot.attachmentState = this.unkeyedState + CURRENT;
|
|
331
|
-
}
|
|
332
|
-
|
|
331
|
+
}
|
|
332
|
+
applyRotateTimeline(timeline, skeleton, time, alpha, blend, timelinesRotation, i, firstFrame) {
|
|
333
333
|
if (firstFrame)
|
|
334
334
|
timelinesRotation[i] = 0;
|
|
335
335
|
if (alpha == 1) {
|
|
336
336
|
timeline.apply(skeleton, 0, time, null, 1, blend, MixDirection.mixIn);
|
|
337
337
|
return;
|
|
338
338
|
}
|
|
339
|
-
|
|
339
|
+
let bone = skeleton.bones[timeline.boneIndex];
|
|
340
340
|
if (!bone.active)
|
|
341
341
|
return;
|
|
342
|
-
|
|
343
|
-
|
|
342
|
+
let frames = timeline.frames;
|
|
343
|
+
let r1 = 0, r2 = 0;
|
|
344
344
|
if (time < frames[0]) {
|
|
345
345
|
switch (blend) {
|
|
346
346
|
case MixBlend.setup:
|
|
@@ -357,13 +357,13 @@ var AnimationState = /** @class */ (function () {
|
|
|
357
357
|
r2 = bone.data.rotation + timeline.getCurveValue(time);
|
|
358
358
|
}
|
|
359
359
|
// Mix between rotations using the direction of the shortest route on the first frame while detecting crosses.
|
|
360
|
-
|
|
360
|
+
let total = 0, diff = r2 - r1;
|
|
361
361
|
diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360;
|
|
362
362
|
if (diff == 0) {
|
|
363
363
|
total = timelinesRotation[i];
|
|
364
364
|
}
|
|
365
365
|
else {
|
|
366
|
-
|
|
366
|
+
let lastTotal = 0, lastDiff = 0;
|
|
367
367
|
if (firstFrame) {
|
|
368
368
|
lastTotal = 0;
|
|
369
369
|
lastDiff = diff;
|
|
@@ -372,7 +372,7 @@ var AnimationState = /** @class */ (function () {
|
|
|
372
372
|
lastTotal = timelinesRotation[i]; // Angle and direction of mix, including loops.
|
|
373
373
|
lastDiff = timelinesRotation[i + 1]; // Difference between bones.
|
|
374
374
|
}
|
|
375
|
-
|
|
375
|
+
let current = diff > 0, dir = lastTotal >= 0;
|
|
376
376
|
// Detect cross at 0 (not 180).
|
|
377
377
|
if (MathUtils.signum(lastDiff) != MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) {
|
|
378
378
|
// A cross after a 360 rotation is a loop.
|
|
@@ -387,24 +387,24 @@ var AnimationState = /** @class */ (function () {
|
|
|
387
387
|
}
|
|
388
388
|
timelinesRotation[i + 1] = diff;
|
|
389
389
|
bone.rotation = r1 + total * alpha;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
390
|
+
}
|
|
391
|
+
queueEvents(entry, animationTime) {
|
|
392
|
+
let animationStart = entry.animationStart, animationEnd = entry.animationEnd;
|
|
393
|
+
let duration = animationEnd - animationStart;
|
|
394
|
+
let trackLastWrapped = entry.trackLast % duration;
|
|
395
395
|
// Queue events before complete.
|
|
396
|
-
|
|
397
|
-
|
|
396
|
+
let events = this.events;
|
|
397
|
+
let i = 0, n = events.length;
|
|
398
398
|
for (; i < n; i++) {
|
|
399
|
-
|
|
400
|
-
if (
|
|
399
|
+
let event = events[i];
|
|
400
|
+
if (event.time < trackLastWrapped)
|
|
401
401
|
break;
|
|
402
|
-
if (
|
|
402
|
+
if (event.time > animationEnd)
|
|
403
403
|
continue; // Discard events outside animation start/end.
|
|
404
|
-
this.queue.event(entry,
|
|
404
|
+
this.queue.event(entry, event);
|
|
405
405
|
}
|
|
406
406
|
// Queue complete if completed a loop iteration or the animation.
|
|
407
|
-
|
|
407
|
+
let complete = false;
|
|
408
408
|
if (entry.loop)
|
|
409
409
|
complete = duration == 0 || trackLastWrapped > entry.trackTime % duration;
|
|
410
410
|
else
|
|
@@ -413,40 +413,40 @@ var AnimationState = /** @class */ (function () {
|
|
|
413
413
|
this.queue.complete(entry);
|
|
414
414
|
// Queue events after complete.
|
|
415
415
|
for (; i < n; i++) {
|
|
416
|
-
|
|
417
|
-
if (
|
|
416
|
+
let event = events[i];
|
|
417
|
+
if (event.time < animationStart)
|
|
418
418
|
continue; // Discard events outside animation start/end.
|
|
419
|
-
this.queue.event(entry,
|
|
419
|
+
this.queue.event(entry, event);
|
|
420
420
|
}
|
|
421
|
-
}
|
|
421
|
+
}
|
|
422
422
|
/** Removes all animations from all tracks, leaving skeletons in their current pose.
|
|
423
423
|
*
|
|
424
424
|
* It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,
|
|
425
425
|
* rather than leaving them in their current pose. */
|
|
426
|
-
|
|
427
|
-
|
|
426
|
+
clearTracks() {
|
|
427
|
+
let oldDrainDisabled = this.queue.drainDisabled;
|
|
428
428
|
this.queue.drainDisabled = true;
|
|
429
|
-
for (
|
|
429
|
+
for (let i = 0, n = this.tracks.length; i < n; i++)
|
|
430
430
|
this.clearTrack(i);
|
|
431
431
|
this.tracks.length = 0;
|
|
432
432
|
this.queue.drainDisabled = oldDrainDisabled;
|
|
433
433
|
this.queue.drain();
|
|
434
|
-
}
|
|
434
|
+
}
|
|
435
435
|
/** Removes all animations from the track, leaving skeletons in their current pose.
|
|
436
436
|
*
|
|
437
437
|
* It may be desired to use {@link AnimationState#setEmptyAnimation()} to mix the skeletons back to the setup pose,
|
|
438
438
|
* rather than leaving them in their current pose. */
|
|
439
|
-
|
|
439
|
+
clearTrack(trackIndex) {
|
|
440
440
|
if (trackIndex >= this.tracks.length)
|
|
441
441
|
return;
|
|
442
|
-
|
|
442
|
+
let current = this.tracks[trackIndex];
|
|
443
443
|
if (!current)
|
|
444
444
|
return;
|
|
445
445
|
this.queue.end(current);
|
|
446
446
|
this.clearNext(current);
|
|
447
|
-
|
|
447
|
+
let entry = current;
|
|
448
448
|
while (true) {
|
|
449
|
-
|
|
449
|
+
let from = entry.mixingFrom;
|
|
450
450
|
if (!from)
|
|
451
451
|
break;
|
|
452
452
|
this.queue.end(from);
|
|
@@ -456,9 +456,9 @@ var AnimationState = /** @class */ (function () {
|
|
|
456
456
|
}
|
|
457
457
|
this.tracks[current.trackIndex] = null;
|
|
458
458
|
this.queue.drain();
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
|
|
459
|
+
}
|
|
460
|
+
setCurrent(index, current, interrupt) {
|
|
461
|
+
let from = this.expandToIndex(index);
|
|
462
462
|
this.tracks[index] = current;
|
|
463
463
|
current.previous = null;
|
|
464
464
|
if (from) {
|
|
@@ -473,29 +473,27 @@ var AnimationState = /** @class */ (function () {
|
|
|
473
473
|
from.timelinesRotation.length = 0; // Reset rotation for mixing out, in case entry was mixed in.
|
|
474
474
|
}
|
|
475
475
|
this.queue.start(current);
|
|
476
|
-
}
|
|
476
|
+
}
|
|
477
477
|
/** Sets an animation by name.
|
|
478
478
|
*
|
|
479
479
|
* See {@link #setAnimationWith()}. */
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
var animation = this.data.skeletonData.findAnimation(animationName);
|
|
480
|
+
setAnimation(trackIndex, animationName, loop = false) {
|
|
481
|
+
let animation = this.data.skeletonData.findAnimation(animationName);
|
|
483
482
|
if (!animation)
|
|
484
483
|
throw new Error("Animation not found: " + animationName);
|
|
485
484
|
return this.setAnimationWith(trackIndex, animation, loop);
|
|
486
|
-
}
|
|
485
|
+
}
|
|
487
486
|
/** Sets the current animation for a track, discarding any queued animations. If the formerly current track entry was never
|
|
488
487
|
* applied to a skeleton, it is replaced (not mixed from).
|
|
489
488
|
* @param loop If true, the animation will repeat. If false it will not, instead its last frame is applied if played beyond its
|
|
490
489
|
* duration. In either case {@link TrackEntry#trackEnd} determines when the track is cleared.
|
|
491
490
|
* @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept
|
|
492
491
|
* after the {@link AnimationStateListener#dispose()} event occurs. */
|
|
493
|
-
|
|
494
|
-
if (loop === void 0) { loop = false; }
|
|
492
|
+
setAnimationWith(trackIndex, animation, loop = false) {
|
|
495
493
|
if (!animation)
|
|
496
494
|
throw new Error("animation cannot be null.");
|
|
497
|
-
|
|
498
|
-
|
|
495
|
+
let interrupt = true;
|
|
496
|
+
let current = this.expandToIndex(trackIndex);
|
|
499
497
|
if (current) {
|
|
500
498
|
if (current.nextTrackLast == -1) {
|
|
501
499
|
// Don't mix from an entry that was never applied.
|
|
@@ -509,22 +507,20 @@ var AnimationState = /** @class */ (function () {
|
|
|
509
507
|
else
|
|
510
508
|
this.clearNext(current);
|
|
511
509
|
}
|
|
512
|
-
|
|
510
|
+
let entry = this.trackEntry(trackIndex, animation, loop, current);
|
|
513
511
|
this.setCurrent(trackIndex, entry, interrupt);
|
|
514
512
|
this.queue.drain();
|
|
515
513
|
return entry;
|
|
516
|
-
}
|
|
514
|
+
}
|
|
517
515
|
/** Queues an animation by name.
|
|
518
516
|
*
|
|
519
517
|
* See {@link #addAnimationWith()}. */
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
if (delay === void 0) { delay = 0; }
|
|
523
|
-
var animation = this.data.skeletonData.findAnimation(animationName);
|
|
518
|
+
addAnimation(trackIndex, animationName, loop = false, delay = 0) {
|
|
519
|
+
let animation = this.data.skeletonData.findAnimation(animationName);
|
|
524
520
|
if (!animation)
|
|
525
521
|
throw new Error("Animation not found: " + animationName);
|
|
526
522
|
return this.addAnimationWith(trackIndex, animation, loop, delay);
|
|
527
|
-
}
|
|
523
|
+
}
|
|
528
524
|
/** Adds an animation to be played after the current or last queued animation for a track. If the track is empty, it is
|
|
529
525
|
* equivalent to calling {@link #setAnimationWith()}.
|
|
530
526
|
* @param delay If > 0, sets {@link TrackEntry#delay}. If <= 0, the delay set is the duration of the previous track entry
|
|
@@ -533,17 +529,15 @@ var AnimationState = /** @class */ (function () {
|
|
|
533
529
|
* previous entry is looping, its next loop completion is used instead of its duration.
|
|
534
530
|
* @returns A track entry to allow further customization of animation playback. References to the track entry must not be kept
|
|
535
531
|
* after the {@link AnimationStateListener#dispose()} event occurs. */
|
|
536
|
-
|
|
537
|
-
if (loop === void 0) { loop = false; }
|
|
538
|
-
if (delay === void 0) { delay = 0; }
|
|
532
|
+
addAnimationWith(trackIndex, animation, loop = false, delay = 0) {
|
|
539
533
|
if (!animation)
|
|
540
534
|
throw new Error("animation cannot be null.");
|
|
541
|
-
|
|
535
|
+
let last = this.expandToIndex(trackIndex);
|
|
542
536
|
if (last) {
|
|
543
537
|
while (last.next)
|
|
544
538
|
last = last.next;
|
|
545
539
|
}
|
|
546
|
-
|
|
540
|
+
let entry = this.trackEntry(trackIndex, animation, loop, last);
|
|
547
541
|
if (!last) {
|
|
548
542
|
this.setCurrent(trackIndex, entry, true);
|
|
549
543
|
this.queue.drain();
|
|
@@ -556,7 +550,7 @@ var AnimationState = /** @class */ (function () {
|
|
|
556
550
|
}
|
|
557
551
|
entry.delay = delay;
|
|
558
552
|
return entry;
|
|
559
|
-
}
|
|
553
|
+
}
|
|
560
554
|
/** Sets an empty animation for a track, discarding any queued animations, and sets the track entry's
|
|
561
555
|
* {@link TrackEntry#mixduration}. An empty animation has no timelines and serves as a placeholder for mixing in or out.
|
|
562
556
|
*
|
|
@@ -571,13 +565,12 @@ var AnimationState = /** @class */ (function () {
|
|
|
571
565
|
* {@link TrackEntry#setMixDuration()}. Mixing from an empty animation causes the new animation to be applied more and
|
|
572
566
|
* more over the mix duration. Properties keyed in the new animation transition from the value from lower tracks or from the
|
|
573
567
|
* setup pose value if no lower tracks key the property to the value keyed in the new animation. */
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
var entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation(), false);
|
|
568
|
+
setEmptyAnimation(trackIndex, mixDuration = 0) {
|
|
569
|
+
let entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation(), false);
|
|
577
570
|
entry.mixDuration = mixDuration;
|
|
578
571
|
entry.trackEnd = mixDuration;
|
|
579
572
|
return entry;
|
|
580
|
-
}
|
|
573
|
+
}
|
|
581
574
|
/** Adds an empty animation to be played after the current or last queued animation for a track, and sets the track entry's
|
|
582
575
|
* {@link TrackEntry#mixDuration}. If the track is empty, it is equivalent to calling
|
|
583
576
|
* {@link #setEmptyAnimation()}.
|
|
@@ -589,40 +582,37 @@ var AnimationState = /** @class */ (function () {
|
|
|
589
582
|
* loop completion is used instead of its duration.
|
|
590
583
|
* @return A track entry to allow further customization of animation playback. References to the track entry must not be kept
|
|
591
584
|
* after the {@link AnimationStateListener#dispose()} event occurs. */
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
if (delay === void 0) { delay = 0; }
|
|
595
|
-
var entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation(), false, delay);
|
|
585
|
+
addEmptyAnimation(trackIndex, mixDuration = 0, delay = 0) {
|
|
586
|
+
let entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation(), false, delay);
|
|
596
587
|
if (delay <= 0)
|
|
597
588
|
entry.delay += entry.mixDuration - mixDuration;
|
|
598
589
|
entry.mixDuration = mixDuration;
|
|
599
590
|
entry.trackEnd = mixDuration;
|
|
600
591
|
return entry;
|
|
601
|
-
}
|
|
592
|
+
}
|
|
602
593
|
/** Sets an empty animation for every track, discarding any queued animations, and mixes to it over the specified mix
|
|
603
594
|
* duration. */
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
var oldDrainDisabled = this.queue.drainDisabled;
|
|
595
|
+
setEmptyAnimations(mixDuration = 0) {
|
|
596
|
+
let oldDrainDisabled = this.queue.drainDisabled;
|
|
607
597
|
this.queue.drainDisabled = true;
|
|
608
|
-
for (
|
|
609
|
-
|
|
598
|
+
for (let i = 0, n = this.tracks.length; i < n; i++) {
|
|
599
|
+
let current = this.tracks[i];
|
|
610
600
|
if (current)
|
|
611
601
|
this.setEmptyAnimation(current.trackIndex, mixDuration);
|
|
612
602
|
}
|
|
613
603
|
this.queue.drainDisabled = oldDrainDisabled;
|
|
614
604
|
this.queue.drain();
|
|
615
|
-
}
|
|
616
|
-
|
|
605
|
+
}
|
|
606
|
+
expandToIndex(index) {
|
|
617
607
|
if (index < this.tracks.length)
|
|
618
608
|
return this.tracks[index];
|
|
619
609
|
Utils.ensureArrayCapacity(this.tracks, index + 1, null);
|
|
620
610
|
this.tracks.length = index + 1;
|
|
621
611
|
return null;
|
|
622
|
-
}
|
|
612
|
+
}
|
|
623
613
|
/** @param last May be null. */
|
|
624
|
-
|
|
625
|
-
|
|
614
|
+
trackEntry(trackIndex, animation, loop, last) {
|
|
615
|
+
let entry = this.trackEntryPool.obtain();
|
|
626
616
|
entry.trackIndex = trackIndex;
|
|
627
617
|
entry.animation = animation;
|
|
628
618
|
entry.loop = loop;
|
|
@@ -646,22 +636,22 @@ var AnimationState = /** @class */ (function () {
|
|
|
646
636
|
entry.mixDuration = !last ? 0 : this.data.getMix(last.animation, animation);
|
|
647
637
|
entry.mixBlend = MixBlend.replace;
|
|
648
638
|
return entry;
|
|
649
|
-
}
|
|
639
|
+
}
|
|
650
640
|
/** Removes the {@link TrackEntry#getNext() next entry} and all entries after it for the specified entry. */
|
|
651
|
-
|
|
652
|
-
|
|
641
|
+
clearNext(entry) {
|
|
642
|
+
let next = entry.next;
|
|
653
643
|
while (next) {
|
|
654
644
|
this.queue.dispose(next);
|
|
655
645
|
next = next.next;
|
|
656
646
|
}
|
|
657
647
|
entry.next = null;
|
|
658
|
-
}
|
|
659
|
-
|
|
648
|
+
}
|
|
649
|
+
_animationsChanged() {
|
|
660
650
|
this.animationsChanged = false;
|
|
661
651
|
this.propertyIDs.clear();
|
|
662
|
-
|
|
663
|
-
for (
|
|
664
|
-
|
|
652
|
+
let tracks = this.tracks;
|
|
653
|
+
for (let i = 0, n = tracks.length; i < n; i++) {
|
|
654
|
+
let entry = tracks[i];
|
|
665
655
|
if (!entry)
|
|
666
656
|
continue;
|
|
667
657
|
while (entry.mixingFrom)
|
|
@@ -672,24 +662,24 @@ var AnimationState = /** @class */ (function () {
|
|
|
672
662
|
entry = entry.mixingTo;
|
|
673
663
|
} while (entry);
|
|
674
664
|
}
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
665
|
+
}
|
|
666
|
+
computeHold(entry) {
|
|
667
|
+
let to = entry.mixingTo;
|
|
668
|
+
let timelines = entry.animation.timelines;
|
|
669
|
+
let timelinesCount = entry.animation.timelines.length;
|
|
670
|
+
let timelineMode = entry.timelineMode;
|
|
681
671
|
timelineMode.length = timelinesCount;
|
|
682
|
-
|
|
672
|
+
let timelineHoldMix = entry.timelineHoldMix;
|
|
683
673
|
timelineHoldMix.length = 0;
|
|
684
|
-
|
|
674
|
+
let propertyIDs = this.propertyIDs;
|
|
685
675
|
if (to && to.holdPrevious) {
|
|
686
|
-
for (
|
|
676
|
+
for (let i = 0; i < timelinesCount; i++)
|
|
687
677
|
timelineMode[i] = propertyIDs.addAll(timelines[i].getPropertyIds()) ? HOLD_FIRST : HOLD_SUBSEQUENT;
|
|
688
678
|
return;
|
|
689
679
|
}
|
|
690
|
-
outer: for (
|
|
691
|
-
|
|
692
|
-
|
|
680
|
+
outer: for (let i = 0; i < timelinesCount; i++) {
|
|
681
|
+
let timeline = timelines[i];
|
|
682
|
+
let ids = timeline.getPropertyIds();
|
|
693
683
|
if (!propertyIDs.addAll(ids))
|
|
694
684
|
timelineMode[i] = SUBSEQUENT;
|
|
695
685
|
else if (!to || timeline instanceof AttachmentTimeline || timeline instanceof DrawOrderTimeline
|
|
@@ -697,7 +687,7 @@ var AnimationState = /** @class */ (function () {
|
|
|
697
687
|
timelineMode[i] = FIRST;
|
|
698
688
|
}
|
|
699
689
|
else {
|
|
700
|
-
for (
|
|
690
|
+
for (let next = to.mixingTo; next; next = next.mixingTo) {
|
|
701
691
|
if (next.animation.hasTimeline(ids))
|
|
702
692
|
continue;
|
|
703
693
|
if (entry.mixDuration > 0) {
|
|
@@ -710,43 +700,41 @@ var AnimationState = /** @class */ (function () {
|
|
|
710
700
|
timelineMode[i] = HOLD_FIRST;
|
|
711
701
|
}
|
|
712
702
|
}
|
|
713
|
-
}
|
|
703
|
+
}
|
|
714
704
|
/** Returns the track entry for the animation currently playing on the track, or null if no animation is currently playing. */
|
|
715
|
-
|
|
705
|
+
getCurrent(trackIndex) {
|
|
716
706
|
if (trackIndex >= this.tracks.length)
|
|
717
707
|
return null;
|
|
718
708
|
return this.tracks[trackIndex];
|
|
719
|
-
}
|
|
709
|
+
}
|
|
720
710
|
/** Adds a listener to receive events for all track entries. */
|
|
721
|
-
|
|
711
|
+
addListener(listener) {
|
|
722
712
|
if (!listener)
|
|
723
713
|
throw new Error("listener cannot be null.");
|
|
724
714
|
this.listeners.push(listener);
|
|
725
|
-
}
|
|
715
|
+
}
|
|
726
716
|
/** Removes the listener added with {@link #addListener()}. */
|
|
727
|
-
|
|
728
|
-
|
|
717
|
+
removeListener(listener) {
|
|
718
|
+
let index = this.listeners.indexOf(listener);
|
|
729
719
|
if (index >= 0)
|
|
730
720
|
this.listeners.splice(index, 1);
|
|
731
|
-
}
|
|
721
|
+
}
|
|
732
722
|
/** Removes all listeners added with {@link #addListener()}. */
|
|
733
|
-
|
|
723
|
+
clearListeners() {
|
|
734
724
|
this.listeners.length = 0;
|
|
735
|
-
}
|
|
725
|
+
}
|
|
736
726
|
/** Discards all listener notifications that have not yet been delivered. This can be useful to call from an
|
|
737
727
|
* {@link AnimationStateListener} when it is known that further notifications that may have been already queued for delivery
|
|
738
728
|
* are not wanted because new animations are being set. */
|
|
739
|
-
|
|
729
|
+
clearListenerNotifications() {
|
|
740
730
|
this.queue.clear();
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
}());
|
|
744
|
-
export { AnimationState };
|
|
731
|
+
}
|
|
732
|
+
}
|
|
745
733
|
/** Stores settings and other state for the playback of an animation on an {@link AnimationState} track.
|
|
746
734
|
*
|
|
747
735
|
* References to a track entry must not be kept after the {@link AnimationStateListener#dispose()} event occurs. */
|
|
748
|
-
|
|
749
|
-
|
|
736
|
+
export class TrackEntry {
|
|
737
|
+
constructor() {
|
|
750
738
|
/** Controls how properties keyed in the animation are mixed with lower tracks. Defaults to {@link MixBlend#replace}, which
|
|
751
739
|
* replaces the values from the lower tracks with the animation values. {@link MixBlend#add} adds the animation values to
|
|
752
740
|
* the values from the lower tracks.
|
|
@@ -758,7 +746,7 @@ var TrackEntry = /** @class */ (function () {
|
|
|
758
746
|
this.timelineHoldMix = new Array();
|
|
759
747
|
this.timelinesRotation = new Array();
|
|
760
748
|
}
|
|
761
|
-
|
|
749
|
+
reset() {
|
|
762
750
|
this.next = null;
|
|
763
751
|
this.previous = null;
|
|
764
752
|
this.mixingFrom = null;
|
|
@@ -768,29 +756,29 @@ var TrackEntry = /** @class */ (function () {
|
|
|
768
756
|
this.timelineMode.length = 0;
|
|
769
757
|
this.timelineHoldMix.length = 0;
|
|
770
758
|
this.timelinesRotation.length = 0;
|
|
771
|
-
}
|
|
759
|
+
}
|
|
772
760
|
/** Uses {@link #trackTime} to compute the `animationTime`, which is between {@link #animationStart}
|
|
773
761
|
* and {@link #animationEnd}. When the `trackTime` is 0, the `animationTime` is equal to the
|
|
774
762
|
* `animationStart` time. */
|
|
775
|
-
|
|
763
|
+
getAnimationTime() {
|
|
776
764
|
if (this.loop) {
|
|
777
|
-
|
|
765
|
+
let duration = this.animationEnd - this.animationStart;
|
|
778
766
|
if (duration == 0)
|
|
779
767
|
return this.animationStart;
|
|
780
768
|
return (this.trackTime % duration) + this.animationStart;
|
|
781
769
|
}
|
|
782
770
|
return Math.min(this.trackTime + this.animationStart, this.animationEnd);
|
|
783
|
-
}
|
|
784
|
-
|
|
771
|
+
}
|
|
772
|
+
setAnimationLast(animationLast) {
|
|
785
773
|
this.animationLast = animationLast;
|
|
786
774
|
this.nextAnimationLast = animationLast;
|
|
787
|
-
}
|
|
775
|
+
}
|
|
788
776
|
/** Returns true if at least one loop has been completed.
|
|
789
777
|
*
|
|
790
778
|
* See {@link AnimationStateListener#complete()}. */
|
|
791
|
-
|
|
779
|
+
isComplete() {
|
|
792
780
|
return this.trackTime >= this.animationEnd - this.animationStart;
|
|
793
|
-
}
|
|
781
|
+
}
|
|
794
782
|
/** Resets the rotation directions for mixing this entry's rotate timelines. This can be useful to avoid bones rotating the
|
|
795
783
|
* long way around when using {@link #alpha} and starting animations on other tracks.
|
|
796
784
|
*
|
|
@@ -798,11 +786,11 @@ var TrackEntry = /** @class */ (function () {
|
|
|
798
786
|
* the short way or the long way around. The two rotations likely change over time, so which direction is the short or long
|
|
799
787
|
* way also changes. If the short way was always chosen, bones would flip to the other side when that direction became the
|
|
800
788
|
* long way. TrackEntry chooses the short way the first time it is applied and remembers that direction. */
|
|
801
|
-
|
|
789
|
+
resetRotationDirections() {
|
|
802
790
|
this.timelinesRotation.length = 0;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
|
|
791
|
+
}
|
|
792
|
+
getTrackComplete() {
|
|
793
|
+
let duration = this.animationEnd - this.animationStart;
|
|
806
794
|
if (duration != 0) {
|
|
807
795
|
if (this.loop)
|
|
808
796
|
return duration * (1 + ((this.trackTime / duration) | 0)); // Completion of next loop.
|
|
@@ -810,78 +798,76 @@ var TrackEntry = /** @class */ (function () {
|
|
|
810
798
|
return duration; // Before duration.
|
|
811
799
|
}
|
|
812
800
|
return this.trackTime; // Next update.
|
|
813
|
-
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
var EventQueue = /** @class */ (function () {
|
|
818
|
-
function EventQueue(animState) {
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
export class EventQueue {
|
|
804
|
+
constructor(animState) {
|
|
819
805
|
this.objects = [];
|
|
820
806
|
this.drainDisabled = false;
|
|
821
807
|
this.animState = animState;
|
|
822
808
|
}
|
|
823
|
-
|
|
809
|
+
start(entry) {
|
|
824
810
|
this.objects.push(EventType.start);
|
|
825
811
|
this.objects.push(entry);
|
|
826
812
|
this.animState.animationsChanged = true;
|
|
827
|
-
}
|
|
828
|
-
|
|
813
|
+
}
|
|
814
|
+
interrupt(entry) {
|
|
829
815
|
this.objects.push(EventType.interrupt);
|
|
830
816
|
this.objects.push(entry);
|
|
831
|
-
}
|
|
832
|
-
|
|
817
|
+
}
|
|
818
|
+
end(entry) {
|
|
833
819
|
this.objects.push(EventType.end);
|
|
834
820
|
this.objects.push(entry);
|
|
835
821
|
this.animState.animationsChanged = true;
|
|
836
|
-
}
|
|
837
|
-
|
|
822
|
+
}
|
|
823
|
+
dispose(entry) {
|
|
838
824
|
this.objects.push(EventType.dispose);
|
|
839
825
|
this.objects.push(entry);
|
|
840
|
-
}
|
|
841
|
-
|
|
826
|
+
}
|
|
827
|
+
complete(entry) {
|
|
842
828
|
this.objects.push(EventType.complete);
|
|
843
829
|
this.objects.push(entry);
|
|
844
|
-
}
|
|
845
|
-
|
|
830
|
+
}
|
|
831
|
+
event(entry, event) {
|
|
846
832
|
this.objects.push(EventType.event);
|
|
847
833
|
this.objects.push(entry);
|
|
848
834
|
this.objects.push(event);
|
|
849
|
-
}
|
|
850
|
-
|
|
835
|
+
}
|
|
836
|
+
drain() {
|
|
851
837
|
if (this.drainDisabled)
|
|
852
838
|
return;
|
|
853
839
|
this.drainDisabled = true;
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
for (
|
|
857
|
-
|
|
858
|
-
|
|
840
|
+
let objects = this.objects;
|
|
841
|
+
let listeners = this.animState.listeners;
|
|
842
|
+
for (let i = 0; i < objects.length; i += 2) {
|
|
843
|
+
let type = objects[i];
|
|
844
|
+
let entry = objects[i + 1];
|
|
859
845
|
switch (type) {
|
|
860
846
|
case EventType.start:
|
|
861
847
|
if (entry.listener && entry.listener.start)
|
|
862
848
|
entry.listener.start(entry);
|
|
863
|
-
for (
|
|
849
|
+
for (let ii = 0; ii < listeners.length; ii++)
|
|
864
850
|
if (listeners[ii].start)
|
|
865
851
|
listeners[ii].start(entry);
|
|
866
852
|
break;
|
|
867
853
|
case EventType.interrupt:
|
|
868
854
|
if (entry.listener && entry.listener.interrupt)
|
|
869
855
|
entry.listener.interrupt(entry);
|
|
870
|
-
for (
|
|
856
|
+
for (let ii = 0; ii < listeners.length; ii++)
|
|
871
857
|
if (listeners[ii].interrupt)
|
|
872
858
|
listeners[ii].interrupt(entry);
|
|
873
859
|
break;
|
|
874
860
|
case EventType.end:
|
|
875
861
|
if (entry.listener && entry.listener.end)
|
|
876
862
|
entry.listener.end(entry);
|
|
877
|
-
for (
|
|
863
|
+
for (let ii = 0; ii < listeners.length; ii++)
|
|
878
864
|
if (listeners[ii].end)
|
|
879
865
|
listeners[ii].end(entry);
|
|
880
866
|
// Fall through.
|
|
881
867
|
case EventType.dispose:
|
|
882
868
|
if (entry.listener && entry.listener.dispose)
|
|
883
869
|
entry.listener.dispose(entry);
|
|
884
|
-
for (
|
|
870
|
+
for (let ii = 0; ii < listeners.length; ii++)
|
|
885
871
|
if (listeners[ii].dispose)
|
|
886
872
|
listeners[ii].dispose(entry);
|
|
887
873
|
this.animState.trackEntryPool.free(entry);
|
|
@@ -889,29 +875,27 @@ var EventQueue = /** @class */ (function () {
|
|
|
889
875
|
case EventType.complete:
|
|
890
876
|
if (entry.listener && entry.listener.complete)
|
|
891
877
|
entry.listener.complete(entry);
|
|
892
|
-
for (
|
|
878
|
+
for (let ii = 0; ii < listeners.length; ii++)
|
|
893
879
|
if (listeners[ii].complete)
|
|
894
880
|
listeners[ii].complete(entry);
|
|
895
881
|
break;
|
|
896
882
|
case EventType.event:
|
|
897
|
-
|
|
883
|
+
let event = objects[i++ + 2];
|
|
898
884
|
if (entry.listener && entry.listener.event)
|
|
899
|
-
entry.listener.event(entry,
|
|
900
|
-
for (
|
|
885
|
+
entry.listener.event(entry, event);
|
|
886
|
+
for (let ii = 0; ii < listeners.length; ii++)
|
|
901
887
|
if (listeners[ii].event)
|
|
902
|
-
listeners[ii].event(entry,
|
|
888
|
+
listeners[ii].event(entry, event);
|
|
903
889
|
break;
|
|
904
890
|
}
|
|
905
891
|
}
|
|
906
892
|
this.clear();
|
|
907
893
|
this.drainDisabled = false;
|
|
908
|
-
}
|
|
909
|
-
|
|
894
|
+
}
|
|
895
|
+
clear() {
|
|
910
896
|
this.objects.length = 0;
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
}());
|
|
914
|
-
export { EventQueue };
|
|
897
|
+
}
|
|
898
|
+
}
|
|
915
899
|
export var EventType;
|
|
916
900
|
(function (EventType) {
|
|
917
901
|
EventType[EventType["start"] = 0] = "start";
|
|
@@ -921,45 +905,41 @@ export var EventType;
|
|
|
921
905
|
EventType[EventType["complete"] = 4] = "complete";
|
|
922
906
|
EventType[EventType["event"] = 5] = "event";
|
|
923
907
|
})(EventType || (EventType = {}));
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
};
|
|
939
|
-
return AnimationStateAdapter;
|
|
940
|
-
}());
|
|
941
|
-
export { AnimationStateAdapter };
|
|
908
|
+
export class AnimationStateAdapter {
|
|
909
|
+
start(entry) {
|
|
910
|
+
}
|
|
911
|
+
interrupt(entry) {
|
|
912
|
+
}
|
|
913
|
+
end(entry) {
|
|
914
|
+
}
|
|
915
|
+
dispose(entry) {
|
|
916
|
+
}
|
|
917
|
+
complete(entry) {
|
|
918
|
+
}
|
|
919
|
+
event(entry, event) {
|
|
920
|
+
}
|
|
921
|
+
}
|
|
942
922
|
/** 1. A previously applied timeline has set this property.
|
|
943
923
|
*
|
|
944
924
|
* Result: Mix from the current pose to the timeline pose. */
|
|
945
|
-
export
|
|
925
|
+
export const SUBSEQUENT = 0;
|
|
946
926
|
/** 1. This is the first timeline to set this property.
|
|
947
927
|
* 2. The next track entry applied after this one does not have a timeline to set this property.
|
|
948
928
|
*
|
|
949
929
|
* Result: Mix from the setup pose to the timeline pose. */
|
|
950
|
-
export
|
|
930
|
+
export const FIRST = 1;
|
|
951
931
|
/** 1) A previously applied timeline has set this property.<br>
|
|
952
932
|
* 2) The next track entry to be applied does have a timeline to set this property.<br>
|
|
953
933
|
* 3) The next track entry after that one does not have a timeline to set this property.<br>
|
|
954
934
|
* Result: Mix from the current pose to the timeline pose, but do not mix out. This avoids "dipping" when crossfading
|
|
955
935
|
* animations that key the same property. A subsequent timeline will set this property using a mix. */
|
|
956
|
-
export
|
|
936
|
+
export const HOLD_SUBSEQUENT = 2;
|
|
957
937
|
/** 1) This is the first timeline to set this property.<br>
|
|
958
938
|
* 2) The next track entry to be applied does have a timeline to set this property.<br>
|
|
959
939
|
* 3) The next track entry after that one does not have a timeline to set this property.<br>
|
|
960
940
|
* Result: Mix from the setup pose to the timeline pose, but do not mix out. This avoids "dipping" when crossfading animations
|
|
961
941
|
* that key the same property. A subsequent timeline will set this property using a mix. */
|
|
962
|
-
export
|
|
942
|
+
export const HOLD_FIRST = 3;
|
|
963
943
|
/** 1. This is the first timeline to set this property.
|
|
964
944
|
* 2. The next track entry to be applied does have a timeline to set this property.
|
|
965
945
|
* 3. The next track entry after that one does have a timeline to set this property.
|
|
@@ -972,8 +952,8 @@ export var HOLD_FIRST = 3;
|
|
|
972
952
|
* "dipping" A is not mixed out, however D (the first entry that doesn't set the property) mixing in is used to mix out A
|
|
973
953
|
* (which affects B and C). Without using D to mix out, A would be applied fully until mixing completes, then snap into
|
|
974
954
|
* place. */
|
|
975
|
-
export
|
|
976
|
-
export
|
|
977
|
-
export
|
|
978
|
-
|
|
979
|
-
//# sourceMappingURL=AnimationState.js.map
|
|
955
|
+
export const HOLD_MIX = 4;
|
|
956
|
+
export const SETUP = 1;
|
|
957
|
+
export const CURRENT = 2;
|
|
958
|
+
let _emptyAnimation = null;
|
|
959
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uU3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQW5pbWF0aW9uU3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUloSixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSTVEOzs7b0hBR29IO0FBQ3BILE1BQU0sT0FBTyxjQUFjO0lBMkIxQixZQUFhLElBQXdCO1FBbEJyQyx5RkFBeUY7UUFDekYsV0FBTSxHQUFHLElBQUksS0FBSyxFQUFjLENBQUM7UUFFakM7OzsyRkFHbUY7UUFDbkYsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUNkLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRWpCLFdBQU0sR0FBRyxJQUFJLEtBQUssRUFBUyxDQUFDO1FBQzVCLGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBMEIsQ0FBQztRQUNoRCxVQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsZ0JBQVcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzlCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUUxQixtQkFBYyxHQUFHLElBQUksSUFBSSxDQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQztRQUc3RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0lBNUJPLE1BQU0sQ0FBQyxjQUFjO1FBQzVCLElBQUksQ0FBQyxlQUFlO1lBQUUsZUFBZSxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxF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
|