@esotericsoftware/spine-core 4.0.11 → 4.0.15

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.
Files changed (92) hide show
  1. package/dist/Animation.d.ts +363 -363
  2. package/dist/Animation.js +1949 -1949
  3. package/dist/AnimationState.d.ts +396 -396
  4. package/dist/AnimationState.js +958 -958
  5. package/dist/AnimationStateData.d.ts +51 -51
  6. package/dist/AnimationStateData.js +69 -69
  7. package/dist/AssetManagerBase.d.ts +72 -72
  8. package/dist/AssetManagerBase.js +303 -303
  9. package/dist/AtlasAttachmentLoader.d.ts +51 -51
  10. package/dist/AtlasAttachmentLoader.js +73 -73
  11. package/dist/Bone.d.ts +138 -138
  12. package/dist/Bone.js +333 -333
  13. package/dist/BoneData.d.ts +72 -72
  14. package/dist/BoneData.js +73 -73
  15. package/dist/ConstraintData.d.ts +35 -35
  16. package/dist/ConstraintData.js +36 -36
  17. package/dist/Event.d.ts +44 -44
  18. package/dist/Event.js +41 -41
  19. package/dist/EventData.d.ts +41 -41
  20. package/dist/EventData.js +36 -36
  21. package/dist/IkConstraint.d.ts +64 -64
  22. package/dist/IkConstraint.js +284 -284
  23. package/dist/IkConstraintData.d.ts +54 -54
  24. package/dist/IkConstraintData.js +53 -53
  25. package/dist/PathConstraint.d.ts +71 -71
  26. package/dist/PathConstraint.js +468 -468
  27. package/dist/PathConstraintData.d.ts +80 -80
  28. package/dist/PathConstraintData.js +69 -69
  29. package/dist/Skeleton.d.ts +158 -158
  30. package/dist/Skeleton.js +570 -570
  31. package/dist/SkeletonBinary.d.ts +67 -67
  32. package/dist/SkeletonBinary.js +1093 -1093
  33. package/dist/SkeletonBounds.d.ts +77 -77
  34. package/dist/SkeletonBounds.js +218 -218
  35. package/dist/SkeletonClipping.d.ts +50 -50
  36. package/dist/SkeletonClipping.js +323 -323
  37. package/dist/SkeletonData.d.ts +114 -114
  38. package/dist/SkeletonData.js +166 -166
  39. package/dist/SkeletonJson.d.ts +51 -51
  40. package/dist/SkeletonJson.js +915 -915
  41. package/dist/Skin.d.ts +71 -71
  42. package/dist/Skin.js +200 -200
  43. package/dist/Slot.d.ts +72 -72
  44. package/dist/Slot.js +93 -93
  45. package/dist/SlotData.d.ts +57 -57
  46. package/dist/SlotData.js +54 -54
  47. package/dist/Texture.d.ts +69 -69
  48. package/dist/Texture.js +72 -72
  49. package/dist/TextureAtlas.d.ts +65 -65
  50. package/dist/TextureAtlas.js +245 -245
  51. package/dist/TransformConstraint.d.ts +60 -60
  52. package/dist/TransformConstraint.js +239 -239
  53. package/dist/TransformConstraintData.d.ts +60 -60
  54. package/dist/TransformConstraintData.js +59 -59
  55. package/dist/Triangulator.d.ts +43 -43
  56. package/dist/Triangulator.js +243 -243
  57. package/dist/Updatable.d.ts +37 -37
  58. package/dist/Updatable.js +29 -29
  59. package/dist/Utils.d.ts +168 -168
  60. package/dist/Utils.js +403 -403
  61. package/dist/VertexEffect.d.ts +35 -35
  62. package/dist/VertexEffect.js +29 -29
  63. package/dist/attachments/Attachment.d.ts +71 -71
  64. package/dist/attachments/Attachment.js +139 -139
  65. package/dist/attachments/AttachmentLoader.d.ts +53 -53
  66. package/dist/attachments/AttachmentLoader.js +29 -29
  67. package/dist/attachments/BoundingBoxAttachment.d.ts +40 -40
  68. package/dist/attachments/BoundingBoxAttachment.js +47 -47
  69. package/dist/attachments/ClippingAttachment.d.ts +42 -42
  70. package/dist/attachments/ClippingAttachment.js +47 -47
  71. package/dist/attachments/MeshAttachment.d.ts +74 -74
  72. package/dist/attachments/MeshAttachment.js +159 -159
  73. package/dist/attachments/PathAttachment.d.ts +47 -47
  74. package/dist/attachments/PathAttachment.js +56 -56
  75. package/dist/attachments/PointAttachment.d.ts +48 -48
  76. package/dist/attachments/PointAttachment.js +62 -62
  77. package/dist/attachments/RegionAttachment.d.ts +108 -108
  78. package/dist/attachments/RegionAttachment.js +196 -196
  79. package/dist/attachments/index.d.ts +8 -8
  80. package/dist/attachments/index.js +8 -8
  81. package/dist/iife/spine-core.js +3 -3
  82. package/dist/iife/spine-core.js.map +2 -2
  83. package/dist/iife/spine-core.min.js +1 -1
  84. package/dist/index.d.ts +42 -42
  85. package/dist/index.js +42 -42
  86. package/dist/polyfills.d.ts +29 -29
  87. package/dist/polyfills.js +38 -38
  88. package/dist/vertexeffects/JitterEffect.d.ts +39 -39
  89. package/dist/vertexeffects/JitterEffect.js +45 -45
  90. package/dist/vertexeffects/SwirlEffect.d.ts +44 -44
  91. package/dist/vertexeffects/SwirlEffect.js +60 -60
  92. package/package.json +32 -32
package/dist/Animation.js CHANGED
@@ -1,1950 +1,1950 @@
1
- /******************************************************************************
2
- * Spine Runtimes License Agreement
3
- * Last updated January 1, 2020. Replaces all prior versions.
4
- *
5
- * Copyright (c) 2013-2020, Esoteric Software LLC
6
- *
7
- * Integration of the Spine Runtimes into software or otherwise creating
8
- * derivative works of the Spine Runtimes is permitted under the terms and
9
- * conditions of Section 2 of the Spine Editor License Agreement:
10
- * http://esotericsoftware.com/spine-editor-license
11
- *
12
- * Otherwise, it is permitted to integrate the Spine Runtimes into software
13
- * or otherwise create derivative works of the Spine Runtimes (collectively,
14
- * "Products"), provided that each user of the Products must obtain their own
15
- * Spine Editor license and redistribution of the Products in any form must
16
- * include this license and copyright notice.
17
- *
18
- * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
- * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
- * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
- * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
- *****************************************************************************/
29
- import { VertexAttachment } from "./attachments/Attachment";
30
- import { StringSet, Utils, MathUtils } from "./Utils";
31
- /** A simple container for a list of timelines and a name. */
32
- export class Animation {
33
- constructor(name, timelines, duration) {
34
- if (!name)
35
- throw new Error("name cannot be null.");
36
- this.name = name;
37
- this.setTimelines(timelines);
38
- this.duration = duration;
39
- }
40
- setTimelines(timelines) {
41
- if (!timelines)
42
- throw new Error("timelines cannot be null.");
43
- this.timelines = timelines;
44
- this.timelineIds = new StringSet();
45
- for (var i = 0; i < timelines.length; i++)
46
- this.timelineIds.addAll(timelines[i].getPropertyIds());
47
- }
48
- hasTimeline(ids) {
49
- for (let i = 0; i < ids.length; i++)
50
- if (this.timelineIds.contains(ids[i]))
51
- return true;
52
- return false;
53
- }
54
- /** Applies all the animation's timelines to the specified skeleton.
55
- *
56
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
57
- * @param loop If true, the animation repeats after {@link #getDuration()}.
58
- * @param events May be null to ignore fired events. */
59
- apply(skeleton, lastTime, time, loop, events, alpha, blend, direction) {
60
- if (!skeleton)
61
- throw new Error("skeleton cannot be null.");
62
- if (loop && this.duration != 0) {
63
- time %= this.duration;
64
- if (lastTime > 0)
65
- lastTime %= this.duration;
66
- }
67
- let timelines = this.timelines;
68
- for (let i = 0, n = timelines.length; i < n; i++)
69
- timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);
70
- }
71
- }
72
- /** Controls how a timeline value is mixed with the setup pose value or current pose value when a timeline's `alpha`
73
- * < 1.
74
- *
75
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
76
- export var MixBlend;
77
- (function (MixBlend) {
78
- /** Transitions from the setup value to the timeline value (the current value is not used). Before the first key, the setup
79
- * value is set. */
80
- MixBlend[MixBlend["setup"] = 0] = "setup";
81
- /** Transitions from the current value to the timeline value. Before the first key, transitions from the current value to
82
- * the setup value. Timelines which perform instant transitions, such as {@link DrawOrderTimeline} or
83
- * {@link AttachmentTimeline}, use the setup value before the first key.
84
- *
85
- * `first` is intended for the first animations applied, not for animations layered on top of those. */
86
- MixBlend[MixBlend["first"] = 1] = "first";
87
- /** Transitions from the current value to the timeline value. No change is made before the first key (the current value is
88
- * kept until the first key).
89
- *
90
- * `replace` is intended for animations layered on top of others, not for the first animations applied. */
91
- MixBlend[MixBlend["replace"] = 2] = "replace";
92
- /** Transitions from the current value to the current value plus the timeline value. No change is made before the first key
93
- * (the current value is kept until the first key).
94
- *
95
- * `add` is intended for animations layered on top of others, not for the first animations applied. Properties
96
- * keyed by additive animations must be set manually or by another animation before applying the additive animations, else
97
- * the property values will increase continually. */
98
- MixBlend[MixBlend["add"] = 3] = "add";
99
- })(MixBlend || (MixBlend = {}));
100
- /** Indicates whether a timeline's `alpha` is mixing out over time toward 0 (the setup or current pose value) or
101
- * mixing in toward 1 (the timeline's value).
102
- *
103
- * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
104
- export var MixDirection;
105
- (function (MixDirection) {
106
- MixDirection[MixDirection["mixIn"] = 0] = "mixIn";
107
- MixDirection[MixDirection["mixOut"] = 1] = "mixOut";
108
- })(MixDirection || (MixDirection = {}));
109
- const Property = {
110
- rotate: 0,
111
- x: 1,
112
- y: 2,
113
- scaleX: 3,
114
- scaleY: 4,
115
- shearX: 5,
116
- shearY: 6,
117
- rgb: 7,
118
- alpha: 8,
119
- rgb2: 9,
120
- attachment: 10,
121
- deform: 11,
122
- event: 12,
123
- drawOrder: 13,
124
- ikConstraint: 14,
125
- transformConstraint: 15,
126
- pathConstraintPosition: 16,
127
- pathConstraintSpacing: 17,
128
- pathConstraintMix: 18
129
- };
130
- /** The interface for all timelines. */
131
- export class Timeline {
132
- constructor(frameCount, propertyIds) {
133
- this.propertyIds = propertyIds;
134
- this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());
135
- }
136
- getPropertyIds() {
137
- return this.propertyIds;
138
- }
139
- getFrameEntries() {
140
- return 1;
141
- }
142
- getFrameCount() {
143
- return this.frames.length / this.getFrameEntries();
144
- }
145
- getDuration() {
146
- return this.frames[this.frames.length - this.getFrameEntries()];
147
- }
148
- static search1(frames, time) {
149
- let n = frames.length;
150
- for (let i = 1; i < n; i++)
151
- if (frames[i] > time)
152
- return i - 1;
153
- return n - 1;
154
- }
155
- static search(frames, time, step) {
156
- let n = frames.length;
157
- for (let i = step; i < n; i += step)
158
- if (frames[i] > time)
159
- return i - step;
160
- return n - step;
161
- }
162
- }
163
- /** The base class for timelines that use interpolation between key frame values. */
164
- export class CurveTimeline extends Timeline {
165
- constructor(frameCount, bezierCount, propertyIds) {
166
- super(frameCount, propertyIds);
167
- this.curves = Utils.newFloatArray(frameCount + bezierCount * 18 /*BEZIER_SIZE*/);
168
- this.curves[frameCount - 1] = 1 /*STEPPED*/;
169
- }
170
- /** Sets the specified key frame to linear interpolation. */
171
- setLinear(frame) {
172
- this.curves[frame] = 0 /*LINEAR*/;
173
- }
174
- /** Sets the specified key frame to stepped interpolation. */
175
- setStepped(frame) {
176
- this.curves[frame] = 1 /*STEPPED*/;
177
- }
178
- /** Shrinks the storage for Bezier curves, for use when <code>bezierCount</code> (specified in the constructor) was larger
179
- * than the actual number of Bezier curves. */
180
- shrink(bezierCount) {
181
- let size = this.getFrameCount() + bezierCount * 18 /*BEZIER_SIZE*/;
182
- if (this.curves.length > size) {
183
- let newCurves = Utils.newFloatArray(size);
184
- Utils.arrayCopy(this.curves, 0, newCurves, 0, size);
185
- this.curves = newCurves;
186
- }
187
- }
188
- /** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than
189
- * one curve per frame.
190
- * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and <code>bezierCount - 1</code> (specified
191
- * in the constructor), inclusive.
192
- * @param frame Between 0 and <code>frameCount - 1</code>, inclusive.
193
- * @param value The index of the value for this frame that this curve is used for.
194
- * @param time1 The time for the first key.
195
- * @param value1 The value for the first key.
196
- * @param cx1 The time for the first Bezier handle.
197
- * @param cy1 The value for the first Bezier handle.
198
- * @param cx2 The time of the second Bezier handle.
199
- * @param cy2 The value for the second Bezier handle.
200
- * @param time2 The time for the second key.
201
- * @param value2 The value for the second key. */
202
- setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
203
- let curves = this.curves;
204
- let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
205
- if (value == 0)
206
- curves[frame] = 2 /*BEZIER*/ + i;
207
- let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;
208
- let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;
209
- let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
210
- let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;
211
- let x = time1 + dx, y = value1 + dy;
212
- for (let n = i + 18 /*BEZIER_SIZE*/; i < n; i += 2) {
213
- curves[i] = x;
214
- curves[i + 1] = y;
215
- dx += ddx;
216
- dy += ddy;
217
- ddx += dddx;
218
- ddy += dddy;
219
- x += dx;
220
- y += dy;
221
- }
222
- }
223
- /** Returns the Bezier interpolated value for the specified time.
224
- * @param frameIndex The index into {@link #getFrames()} for the values of the frame before <code>time</code>.
225
- * @param valueOffset The offset from <code>frameIndex</code> to the value this curve is used for.
226
- * @param i The index of the Bezier segments. See {@link #getCurveType(int)}. */
227
- getBezierValue(time, frameIndex, valueOffset, i) {
228
- let curves = this.curves;
229
- if (curves[i] > time) {
230
- let x = this.frames[frameIndex], y = this.frames[frameIndex + valueOffset];
231
- return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
232
- }
233
- let n = i + 18 /*BEZIER_SIZE*/;
234
- for (i += 2; i < n; i += 2) {
235
- if (curves[i] >= time) {
236
- let x = curves[i - 2], y = curves[i - 1];
237
- return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
238
- }
239
- }
240
- frameIndex += this.getFrameEntries();
241
- let x = curves[n - 2], y = curves[n - 1];
242
- return y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y);
243
- }
244
- }
245
- export class CurveTimeline1 extends CurveTimeline {
246
- constructor(frameCount, bezierCount, propertyId) {
247
- super(frameCount, bezierCount, [propertyId]);
248
- }
249
- getFrameEntries() {
250
- return 2 /*ENTRIES*/;
251
- }
252
- /** Sets the time and value for the specified frame.
253
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
254
- * @param time The frame time in seconds. */
255
- setFrame(frame, time, value) {
256
- frame <<= 1;
257
- this.frames[frame] = time;
258
- this.frames[frame + 1 /*VALUE*/] = value;
259
- }
260
- /** Returns the interpolated value for the specified time. */
261
- getCurveValue(time) {
262
- let frames = this.frames;
263
- let i = frames.length - 2;
264
- for (let ii = 2; ii <= i; ii += 2) {
265
- if (frames[ii] > time) {
266
- i = ii - 2;
267
- break;
268
- }
269
- }
270
- let curveType = this.curves[i >> 1];
271
- switch (curveType) {
272
- case 0 /*LINEAR*/:
273
- let before = frames[i], value = frames[i + 1 /*VALUE*/];
274
- return value + (time - before) / (frames[i + 2 /*ENTRIES*/] - before) * (frames[i + 2 /*ENTRIES*/ + 1 /*VALUE*/] - value);
275
- case 1 /*STEPPED*/:
276
- return frames[i + 1 /*VALUE*/];
277
- }
278
- return this.getBezierValue(time, i, 1 /*VALUE*/, curveType - 2 /*BEZIER*/);
279
- }
280
- }
281
- /** The base class for a {@link CurveTimeline} which sets two properties. */
282
- export class CurveTimeline2 extends CurveTimeline {
283
- /** @param bezierCount The maximum number of Bezier curves. See {@link #shrink(int)}.
284
- * @param propertyIds Unique identifiers for the properties the timeline modifies. */
285
- constructor(frameCount, bezierCount, propertyId1, propertyId2) {
286
- super(frameCount, bezierCount, [propertyId1, propertyId2]);
287
- }
288
- getFrameEntries() {
289
- return 3 /*ENTRIES*/;
290
- }
291
- /** Sets the time and values for the specified frame.
292
- * @param frame Between 0 and <code>frameCount</code>, inclusive.
293
- * @param time The frame time in seconds. */
294
- setFrame(frame, time, value1, value2) {
295
- frame *= 3 /*ENTRIES*/;
296
- this.frames[frame] = time;
297
- this.frames[frame + 1 /*VALUE1*/] = value1;
298
- this.frames[frame + 2 /*VALUE2*/] = value2;
299
- }
300
- }
301
- /** Changes a bone's local {@link Bone#rotation}. */
302
- export class RotateTimeline extends CurveTimeline1 {
303
- constructor(frameCount, bezierCount, boneIndex) {
304
- super(frameCount, bezierCount, Property.rotate + "|" + boneIndex);
305
- this.boneIndex = 0;
306
- this.boneIndex = boneIndex;
307
- }
308
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
309
- let bone = skeleton.bones[this.boneIndex];
310
- if (!bone.active)
311
- return;
312
- let frames = this.frames;
313
- if (time < frames[0]) {
314
- switch (blend) {
315
- case MixBlend.setup:
316
- bone.rotation = bone.data.rotation;
317
- return;
318
- case MixBlend.first:
319
- bone.rotation += (bone.data.rotation - bone.rotation) * alpha;
320
- }
321
- return;
322
- }
323
- let r = this.getCurveValue(time);
324
- switch (blend) {
325
- case MixBlend.setup:
326
- bone.rotation = bone.data.rotation + r * alpha;
327
- break;
328
- case MixBlend.first:
329
- case MixBlend.replace:
330
- r += bone.data.rotation - bone.rotation;
331
- case MixBlend.add:
332
- bone.rotation += r * alpha;
333
- }
334
- }
335
- }
336
- /** Changes a bone's local {@link Bone#x} and {@link Bone#y}. */
337
- export class TranslateTimeline extends CurveTimeline2 {
338
- constructor(frameCount, bezierCount, boneIndex) {
339
- super(frameCount, bezierCount, Property.x + "|" + boneIndex, Property.y + "|" + boneIndex);
340
- this.boneIndex = 0;
341
- this.boneIndex = boneIndex;
342
- }
343
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
344
- let bone = skeleton.bones[this.boneIndex];
345
- if (!bone.active)
346
- return;
347
- let frames = this.frames;
348
- if (time < frames[0]) {
349
- switch (blend) {
350
- case MixBlend.setup:
351
- bone.x = bone.data.x;
352
- bone.y = bone.data.y;
353
- return;
354
- case MixBlend.first:
355
- bone.x += (bone.data.x - bone.x) * alpha;
356
- bone.y += (bone.data.y - bone.y) * alpha;
357
- }
358
- return;
359
- }
360
- let x = 0, y = 0;
361
- let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
362
- let curveType = this.curves[i / 3 /*ENTRIES*/];
363
- switch (curveType) {
364
- case 0 /*LINEAR*/:
365
- let before = frames[i];
366
- x = frames[i + 1 /*VALUE1*/];
367
- y = frames[i + 2 /*VALUE2*/];
368
- let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
369
- x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
370
- y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
371
- break;
372
- case 1 /*STEPPED*/:
373
- x = frames[i + 1 /*VALUE1*/];
374
- y = frames[i + 2 /*VALUE2*/];
375
- break;
376
- default:
377
- x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
378
- y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
379
- }
380
- switch (blend) {
381
- case MixBlend.setup:
382
- bone.x = bone.data.x + x * alpha;
383
- bone.y = bone.data.y + y * alpha;
384
- break;
385
- case MixBlend.first:
386
- case MixBlend.replace:
387
- bone.x += (bone.data.x + x - bone.x) * alpha;
388
- bone.y += (bone.data.y + y - bone.y) * alpha;
389
- break;
390
- case MixBlend.add:
391
- bone.x += x * alpha;
392
- bone.y += y * alpha;
393
- }
394
- }
395
- }
396
- /** Changes a bone's local {@link Bone#x}. */
397
- export class TranslateXTimeline extends CurveTimeline1 {
398
- constructor(frameCount, bezierCount, boneIndex) {
399
- super(frameCount, bezierCount, Property.x + "|" + boneIndex);
400
- this.boneIndex = 0;
401
- this.boneIndex = boneIndex;
402
- }
403
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
404
- let bone = skeleton.bones[this.boneIndex];
405
- if (!bone.active)
406
- return;
407
- let frames = this.frames;
408
- if (time < frames[0]) {
409
- switch (blend) {
410
- case MixBlend.setup:
411
- bone.x = bone.data.x;
412
- return;
413
- case MixBlend.first:
414
- bone.x += (bone.data.x - bone.x) * alpha;
415
- }
416
- return;
417
- }
418
- let x = this.getCurveValue(time);
419
- switch (blend) {
420
- case MixBlend.setup:
421
- bone.x = bone.data.x + x * alpha;
422
- break;
423
- case MixBlend.first:
424
- case MixBlend.replace:
425
- bone.x += (bone.data.x + x - bone.x) * alpha;
426
- break;
427
- case MixBlend.add:
428
- bone.x += x * alpha;
429
- }
430
- }
431
- }
432
- /** Changes a bone's local {@link Bone#x}. */
433
- export class TranslateYTimeline extends CurveTimeline1 {
434
- constructor(frameCount, bezierCount, boneIndex) {
435
- super(frameCount, bezierCount, Property.y + "|" + boneIndex);
436
- this.boneIndex = 0;
437
- this.boneIndex = boneIndex;
438
- }
439
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
440
- let bone = skeleton.bones[this.boneIndex];
441
- if (!bone.active)
442
- return;
443
- let frames = this.frames;
444
- if (time < frames[0]) {
445
- switch (blend) {
446
- case MixBlend.setup:
447
- bone.y = bone.data.y;
448
- return;
449
- case MixBlend.first:
450
- bone.y += (bone.data.y - bone.y) * alpha;
451
- }
452
- return;
453
- }
454
- let y = this.getCurveValue(time);
455
- switch (blend) {
456
- case MixBlend.setup:
457
- bone.y = bone.data.y + y * alpha;
458
- break;
459
- case MixBlend.first:
460
- case MixBlend.replace:
461
- bone.y += (bone.data.y + y - bone.y) * alpha;
462
- break;
463
- case MixBlend.add:
464
- bone.y += y * alpha;
465
- }
466
- }
467
- }
468
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
469
- export class ScaleTimeline extends CurveTimeline2 {
470
- constructor(frameCount, bezierCount, boneIndex) {
471
- super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex, Property.scaleY + "|" + boneIndex);
472
- this.boneIndex = 0;
473
- this.boneIndex = boneIndex;
474
- }
475
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
476
- let bone = skeleton.bones[this.boneIndex];
477
- if (!bone.active)
478
- return;
479
- let frames = this.frames;
480
- if (time < frames[0]) {
481
- switch (blend) {
482
- case MixBlend.setup:
483
- bone.scaleX = bone.data.scaleX;
484
- bone.scaleY = bone.data.scaleY;
485
- return;
486
- case MixBlend.first:
487
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
488
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
489
- }
490
- return;
491
- }
492
- let x, y;
493
- let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
494
- let curveType = this.curves[i / 3 /*ENTRIES*/];
495
- switch (curveType) {
496
- case 0 /*LINEAR*/:
497
- let before = frames[i];
498
- x = frames[i + 1 /*VALUE1*/];
499
- y = frames[i + 2 /*VALUE2*/];
500
- let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
501
- x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
502
- y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
503
- break;
504
- case 1 /*STEPPED*/:
505
- x = frames[i + 1 /*VALUE1*/];
506
- y = frames[i + 2 /*VALUE2*/];
507
- break;
508
- default:
509
- x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
510
- y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
511
- }
512
- x *= bone.data.scaleX;
513
- y *= bone.data.scaleY;
514
- if (alpha == 1) {
515
- if (blend == MixBlend.add) {
516
- bone.scaleX += x - bone.data.scaleX;
517
- bone.scaleY += y - bone.data.scaleY;
518
- }
519
- else {
520
- bone.scaleX = x;
521
- bone.scaleY = y;
522
- }
523
- }
524
- else {
525
- let bx = 0, by = 0;
526
- if (direction == MixDirection.mixOut) {
527
- switch (blend) {
528
- case MixBlend.setup:
529
- bx = bone.data.scaleX;
530
- by = bone.data.scaleY;
531
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
532
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
533
- break;
534
- case MixBlend.first:
535
- case MixBlend.replace:
536
- bx = bone.scaleX;
537
- by = bone.scaleY;
538
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
539
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
540
- break;
541
- case MixBlend.add:
542
- bone.scaleX = (x - bone.data.scaleX) * alpha;
543
- bone.scaleY = (y - bone.data.scaleY) * alpha;
544
- }
545
- }
546
- else {
547
- switch (blend) {
548
- case MixBlend.setup:
549
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
550
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
551
- bone.scaleX = bx + (x - bx) * alpha;
552
- bone.scaleY = by + (y - by) * alpha;
553
- break;
554
- case MixBlend.first:
555
- case MixBlend.replace:
556
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
557
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
558
- bone.scaleX = bx + (x - bx) * alpha;
559
- bone.scaleY = by + (y - by) * alpha;
560
- break;
561
- case MixBlend.add:
562
- bone.scaleX += (x - bone.data.scaleX) * alpha;
563
- bone.scaleY += (y - bone.data.scaleY) * alpha;
564
- }
565
- }
566
- }
567
- }
568
- }
569
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
570
- export class ScaleXTimeline extends CurveTimeline1 {
571
- constructor(frameCount, bezierCount, boneIndex) {
572
- super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex);
573
- this.boneIndex = 0;
574
- this.boneIndex = boneIndex;
575
- }
576
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
577
- let bone = skeleton.bones[this.boneIndex];
578
- if (!bone.active)
579
- return;
580
- let frames = this.frames;
581
- if (time < frames[0]) {
582
- switch (blend) {
583
- case MixBlend.setup:
584
- bone.scaleX = bone.data.scaleX;
585
- return;
586
- case MixBlend.first:
587
- bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
588
- }
589
- return;
590
- }
591
- let x = this.getCurveValue(time) * bone.data.scaleX;
592
- if (alpha == 1) {
593
- if (blend == MixBlend.add)
594
- bone.scaleX += x - bone.data.scaleX;
595
- else
596
- bone.scaleX = x;
597
- }
598
- else {
599
- // Mixing out uses sign of setup or current pose, else use sign of key.
600
- let bx = 0;
601
- if (direction == MixDirection.mixOut) {
602
- switch (blend) {
603
- case MixBlend.setup:
604
- bx = bone.data.scaleX;
605
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
606
- break;
607
- case MixBlend.first:
608
- case MixBlend.replace:
609
- bx = bone.scaleX;
610
- bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
611
- break;
612
- case MixBlend.add:
613
- bone.scaleX = (x - bone.data.scaleX) * alpha;
614
- }
615
- }
616
- else {
617
- switch (blend) {
618
- case MixBlend.setup:
619
- bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
620
- bone.scaleX = bx + (x - bx) * alpha;
621
- break;
622
- case MixBlend.first:
623
- case MixBlend.replace:
624
- bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
625
- bone.scaleX = bx + (x - bx) * alpha;
626
- break;
627
- case MixBlend.add:
628
- bone.scaleX += (x - bone.data.scaleX) * alpha;
629
- }
630
- }
631
- }
632
- }
633
- }
634
- /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
635
- export class ScaleYTimeline extends CurveTimeline1 {
636
- constructor(frameCount, bezierCount, boneIndex) {
637
- super(frameCount, bezierCount, Property.scaleY + "|" + boneIndex);
638
- this.boneIndex = 0;
639
- this.boneIndex = boneIndex;
640
- }
641
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
642
- let bone = skeleton.bones[this.boneIndex];
643
- if (!bone.active)
644
- return;
645
- let frames = this.frames;
646
- if (time < frames[0]) {
647
- switch (blend) {
648
- case MixBlend.setup:
649
- bone.scaleY = bone.data.scaleY;
650
- return;
651
- case MixBlend.first:
652
- bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
653
- }
654
- return;
655
- }
656
- let y = this.getCurveValue(time) * bone.data.scaleY;
657
- if (alpha == 1) {
658
- if (blend == MixBlend.add)
659
- bone.scaleY += y - bone.data.scaleY;
660
- else
661
- bone.scaleY = y;
662
- }
663
- else {
664
- // Mixing out uses sign of setup or current pose, else use sign of key.
665
- let by = 0;
666
- if (direction == MixDirection.mixOut) {
667
- switch (blend) {
668
- case MixBlend.setup:
669
- by = bone.data.scaleY;
670
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
671
- break;
672
- case MixBlend.first:
673
- case MixBlend.replace:
674
- by = bone.scaleY;
675
- bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
676
- break;
677
- case MixBlend.add:
678
- bone.scaleY = (y - bone.data.scaleY) * alpha;
679
- }
680
- }
681
- else {
682
- switch (blend) {
683
- case MixBlend.setup:
684
- by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
685
- bone.scaleY = by + (y - by) * alpha;
686
- break;
687
- case MixBlend.first:
688
- case MixBlend.replace:
689
- by = Math.abs(bone.scaleY) * MathUtils.signum(y);
690
- bone.scaleY = by + (y - by) * alpha;
691
- break;
692
- case MixBlend.add:
693
- bone.scaleY += (y - bone.data.scaleY) * alpha;
694
- }
695
- }
696
- }
697
- }
698
- }
699
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
700
- export class ShearTimeline extends CurveTimeline2 {
701
- constructor(frameCount, bezierCount, boneIndex) {
702
- super(frameCount, bezierCount, Property.shearX + "|" + boneIndex, Property.shearY + "|" + boneIndex);
703
- this.boneIndex = 0;
704
- this.boneIndex = boneIndex;
705
- }
706
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
707
- let bone = skeleton.bones[this.boneIndex];
708
- if (!bone.active)
709
- return;
710
- let frames = this.frames;
711
- if (time < frames[0]) {
712
- switch (blend) {
713
- case MixBlend.setup:
714
- bone.shearX = bone.data.shearX;
715
- bone.shearY = bone.data.shearY;
716
- return;
717
- case MixBlend.first:
718
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
719
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
720
- }
721
- return;
722
- }
723
- let x = 0, y = 0;
724
- let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
725
- let curveType = this.curves[i / 3 /*ENTRIES*/];
726
- switch (curveType) {
727
- case 0 /*LINEAR*/:
728
- let before = frames[i];
729
- x = frames[i + 1 /*VALUE1*/];
730
- y = frames[i + 2 /*VALUE2*/];
731
- let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
732
- x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
733
- y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
734
- break;
735
- case 1 /*STEPPED*/:
736
- x = frames[i + 1 /*VALUE1*/];
737
- y = frames[i + 2 /*VALUE2*/];
738
- break;
739
- default:
740
- x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
741
- y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
742
- }
743
- switch (blend) {
744
- case MixBlend.setup:
745
- bone.shearX = bone.data.shearX + x * alpha;
746
- bone.shearY = bone.data.shearY + y * alpha;
747
- break;
748
- case MixBlend.first:
749
- case MixBlend.replace:
750
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
751
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
752
- break;
753
- case MixBlend.add:
754
- bone.shearX += x * alpha;
755
- bone.shearY += y * alpha;
756
- }
757
- }
758
- }
759
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
760
- export class ShearXTimeline extends CurveTimeline1 {
761
- constructor(frameCount, bezierCount, boneIndex) {
762
- super(frameCount, bezierCount, Property.shearX + "|" + boneIndex);
763
- this.boneIndex = 0;
764
- this.boneIndex = boneIndex;
765
- }
766
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
767
- let bone = skeleton.bones[this.boneIndex];
768
- if (!bone.active)
769
- return;
770
- let frames = this.frames;
771
- if (time < frames[0]) {
772
- switch (blend) {
773
- case MixBlend.setup:
774
- bone.shearX = bone.data.shearX;
775
- return;
776
- case MixBlend.first:
777
- bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
778
- }
779
- return;
780
- }
781
- let x = this.getCurveValue(time);
782
- switch (blend) {
783
- case MixBlend.setup:
784
- bone.shearX = bone.data.shearX + x * alpha;
785
- break;
786
- case MixBlend.first:
787
- case MixBlend.replace:
788
- bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
789
- break;
790
- case MixBlend.add:
791
- bone.shearX += x * alpha;
792
- }
793
- }
794
- }
795
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
796
- export class ShearYTimeline extends CurveTimeline1 {
797
- constructor(frameCount, bezierCount, boneIndex) {
798
- super(frameCount, bezierCount, Property.shearY + "|" + boneIndex);
799
- this.boneIndex = 0;
800
- this.boneIndex = boneIndex;
801
- }
802
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
803
- let bone = skeleton.bones[this.boneIndex];
804
- if (!bone.active)
805
- return;
806
- let frames = this.frames;
807
- if (time < frames[0]) {
808
- switch (blend) {
809
- case MixBlend.setup:
810
- bone.shearY = bone.data.shearY;
811
- return;
812
- case MixBlend.first:
813
- bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
814
- }
815
- return;
816
- }
817
- let y = this.getCurveValue(time);
818
- switch (blend) {
819
- case MixBlend.setup:
820
- bone.shearY = bone.data.shearY + y * alpha;
821
- break;
822
- case MixBlend.first:
823
- case MixBlend.replace:
824
- bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
825
- break;
826
- case MixBlend.add:
827
- bone.shearY += y * alpha;
828
- }
829
- }
830
- }
831
- /** Changes a slot's {@link Slot#color}. */
832
- export class RGBATimeline extends CurveTimeline {
833
- constructor(frameCount, bezierCount, slotIndex) {
834
- super(frameCount, bezierCount, [
835
- Property.rgb + "|" + slotIndex,
836
- Property.alpha + "|" + slotIndex
837
- ]);
838
- this.slotIndex = 0;
839
- this.slotIndex = slotIndex;
840
- }
841
- getFrameEntries() {
842
- return 5 /*ENTRIES*/;
843
- }
844
- /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
845
- setFrame(frame, time, r, g, b, a) {
846
- frame *= 5 /*ENTRIES*/;
847
- this.frames[frame] = time;
848
- this.frames[frame + 1 /*R*/] = r;
849
- this.frames[frame + 2 /*G*/] = g;
850
- this.frames[frame + 3 /*B*/] = b;
851
- this.frames[frame + 4 /*A*/] = a;
852
- }
853
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
854
- let slot = skeleton.slots[this.slotIndex];
855
- if (!slot.bone.active)
856
- return;
857
- let frames = this.frames;
858
- let color = slot.color;
859
- if (time < frames[0]) {
860
- let setup = slot.data.color;
861
- switch (blend) {
862
- case MixBlend.setup:
863
- color.setFromColor(setup);
864
- return;
865
- case MixBlend.first:
866
- color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha);
867
- }
868
- return;
869
- }
870
- let r = 0, g = 0, b = 0, a = 0;
871
- let i = Timeline.search(frames, time, 5 /*ENTRIES*/);
872
- let curveType = this.curves[i / 5 /*ENTRIES*/];
873
- switch (curveType) {
874
- case 0 /*LINEAR*/:
875
- let before = frames[i];
876
- r = frames[i + 1 /*R*/];
877
- g = frames[i + 2 /*G*/];
878
- b = frames[i + 3 /*B*/];
879
- a = frames[i + 4 /*A*/];
880
- let t = (time - before) / (frames[i + 5 /*ENTRIES*/] - before);
881
- r += (frames[i + 5 /*ENTRIES*/ + 1 /*R*/] - r) * t;
882
- g += (frames[i + 5 /*ENTRIES*/ + 2 /*G*/] - g) * t;
883
- b += (frames[i + 5 /*ENTRIES*/ + 3 /*B*/] - b) * t;
884
- a += (frames[i + 5 /*ENTRIES*/ + 4 /*A*/] - a) * t;
885
- break;
886
- case 1 /*STEPPED*/:
887
- r = frames[i + 1 /*R*/];
888
- g = frames[i + 2 /*G*/];
889
- b = frames[i + 3 /*B*/];
890
- a = frames[i + 4 /*A*/];
891
- break;
892
- default:
893
- r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
894
- g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
895
- b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
896
- a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
897
- }
898
- if (alpha == 1)
899
- color.set(r, g, b, a);
900
- else {
901
- if (blend == MixBlend.setup)
902
- color.setFromColor(slot.data.color);
903
- color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
904
- }
905
- }
906
- }
907
- /** Changes a slot's {@link Slot#color}. */
908
- export class RGBTimeline extends CurveTimeline {
909
- constructor(frameCount, bezierCount, slotIndex) {
910
- super(frameCount, bezierCount, [
911
- Property.rgb + "|" + slotIndex
912
- ]);
913
- this.slotIndex = 0;
914
- this.slotIndex = slotIndex;
915
- }
916
- getFrameEntries() {
917
- return 4 /*ENTRIES*/;
918
- }
919
- /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
920
- setFrame(frame, time, r, g, b) {
921
- frame <<= 2;
922
- this.frames[frame] = time;
923
- this.frames[frame + 1 /*R*/] = r;
924
- this.frames[frame + 2 /*G*/] = g;
925
- this.frames[frame + 3 /*B*/] = b;
926
- }
927
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
928
- let slot = skeleton.slots[this.slotIndex];
929
- if (!slot.bone.active)
930
- return;
931
- let frames = this.frames;
932
- let color = slot.color;
933
- if (time < frames[0]) {
934
- let setup = slot.data.color;
935
- switch (blend) {
936
- case MixBlend.setup:
937
- color.r = setup.r;
938
- color.g = setup.g;
939
- color.b = setup.b;
940
- return;
941
- case MixBlend.first:
942
- color.r += (setup.r - color.r) * alpha;
943
- color.g += (setup.g - color.g) * alpha;
944
- color.b += (setup.b - color.b) * alpha;
945
- }
946
- return;
947
- }
948
- let r = 0, g = 0, b = 0;
949
- let i = Timeline.search(frames, time, 4 /*ENTRIES*/);
950
- let curveType = this.curves[i >> 2];
951
- switch (curveType) {
952
- case 0 /*LINEAR*/:
953
- let before = frames[i];
954
- r = frames[i + 1 /*R*/];
955
- g = frames[i + 2 /*G*/];
956
- b = frames[i + 3 /*B*/];
957
- let t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
958
- r += (frames[i + 4 /*ENTRIES*/ + 1 /*R*/] - r) * t;
959
- g += (frames[i + 4 /*ENTRIES*/ + 2 /*G*/] - g) * t;
960
- b += (frames[i + 4 /*ENTRIES*/ + 3 /*B*/] - b) * t;
961
- break;
962
- case 1 /*STEPPED*/:
963
- r = frames[i + 1 /*R*/];
964
- g = frames[i + 2 /*G*/];
965
- b = frames[i + 3 /*B*/];
966
- break;
967
- default:
968
- r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
969
- g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
970
- b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
971
- }
972
- if (alpha == 1) {
973
- color.r = r;
974
- color.g = g;
975
- color.b = b;
976
- }
977
- else {
978
- if (blend == MixBlend.setup) {
979
- let setup = slot.data.color;
980
- color.r = setup.r;
981
- color.g = setup.g;
982
- color.b = setup.b;
983
- }
984
- color.r += (r - color.r) * alpha;
985
- color.g += (g - color.g) * alpha;
986
- color.b += (b - color.b) * alpha;
987
- }
988
- }
989
- }
990
- /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
991
- export class AlphaTimeline extends CurveTimeline1 {
992
- constructor(frameCount, bezierCount, slotIndex) {
993
- super(frameCount, bezierCount, Property.alpha + "|" + slotIndex);
994
- this.slotIndex = 0;
995
- this.slotIndex = slotIndex;
996
- }
997
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
998
- let slot = skeleton.slots[this.slotIndex];
999
- if (!slot.bone.active)
1000
- return;
1001
- let color = slot.color;
1002
- if (time < this.frames[0]) { // Time is before first frame.
1003
- let setup = slot.data.color;
1004
- switch (blend) {
1005
- case MixBlend.setup:
1006
- color.a = setup.a;
1007
- return;
1008
- case MixBlend.first:
1009
- color.a += (setup.a - color.a) * alpha;
1010
- }
1011
- return;
1012
- }
1013
- let a = this.getCurveValue(time);
1014
- if (alpha == 1)
1015
- color.a = a;
1016
- else {
1017
- if (blend == MixBlend.setup)
1018
- color.a = slot.data.color.a;
1019
- color.a += (a - color.a) * alpha;
1020
- }
1021
- }
1022
- }
1023
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
1024
- export class RGBA2Timeline extends CurveTimeline {
1025
- constructor(frameCount, bezierCount, slotIndex) {
1026
- super(frameCount, bezierCount, [
1027
- Property.rgb + "|" + slotIndex,
1028
- Property.alpha + "|" + slotIndex,
1029
- Property.rgb2 + "|" + slotIndex
1030
- ]);
1031
- this.slotIndex = 0;
1032
- this.slotIndex = slotIndex;
1033
- }
1034
- getFrameEntries() {
1035
- return 8 /*ENTRIES*/;
1036
- }
1037
- /** Sets the time in seconds, light, and dark colors for the specified key frame. */
1038
- setFrame(frame, time, r, g, b, a, r2, g2, b2) {
1039
- frame <<= 3;
1040
- this.frames[frame] = time;
1041
- this.frames[frame + 1 /*R*/] = r;
1042
- this.frames[frame + 2 /*G*/] = g;
1043
- this.frames[frame + 3 /*B*/] = b;
1044
- this.frames[frame + 4 /*A*/] = a;
1045
- this.frames[frame + 5 /*R2*/] = r2;
1046
- this.frames[frame + 6 /*G2*/] = g2;
1047
- this.frames[frame + 7 /*B2*/] = b2;
1048
- }
1049
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1050
- let slot = skeleton.slots[this.slotIndex];
1051
- if (!slot.bone.active)
1052
- return;
1053
- let frames = this.frames;
1054
- let light = slot.color, dark = slot.darkColor;
1055
- if (time < frames[0]) {
1056
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1057
- switch (blend) {
1058
- case MixBlend.setup:
1059
- light.setFromColor(setupLight);
1060
- dark.r = setupDark.r;
1061
- dark.g = setupDark.g;
1062
- dark.b = setupDark.b;
1063
- return;
1064
- case MixBlend.first:
1065
- light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha);
1066
- dark.r += (setupDark.r - dark.r) * alpha;
1067
- dark.g += (setupDark.g - dark.g) * alpha;
1068
- dark.b += (setupDark.b - dark.b) * alpha;
1069
- }
1070
- return;
1071
- }
1072
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
1073
- let i = Timeline.search(frames, time, 8 /*ENTRIES*/);
1074
- let curveType = this.curves[i >> 3];
1075
- switch (curveType) {
1076
- case 0 /*LINEAR*/:
1077
- let before = frames[i];
1078
- r = frames[i + 1 /*R*/];
1079
- g = frames[i + 2 /*G*/];
1080
- b = frames[i + 3 /*B*/];
1081
- a = frames[i + 4 /*A*/];
1082
- r2 = frames[i + 5 /*R2*/];
1083
- g2 = frames[i + 6 /*G2*/];
1084
- b2 = frames[i + 7 /*B2*/];
1085
- let t = (time - before) / (frames[i + 8 /*ENTRIES*/] - before);
1086
- r += (frames[i + 8 /*ENTRIES*/ + 1 /*R*/] - r) * t;
1087
- g += (frames[i + 8 /*ENTRIES*/ + 2 /*G*/] - g) * t;
1088
- b += (frames[i + 8 /*ENTRIES*/ + 3 /*B*/] - b) * t;
1089
- a += (frames[i + 8 /*ENTRIES*/ + 4 /*A*/] - a) * t;
1090
- r2 += (frames[i + 8 /*ENTRIES*/ + 5 /*R2*/] - r2) * t;
1091
- g2 += (frames[i + 8 /*ENTRIES*/ + 6 /*G2*/] - g2) * t;
1092
- b2 += (frames[i + 8 /*ENTRIES*/ + 7 /*B2*/] - b2) * t;
1093
- break;
1094
- case 1 /*STEPPED*/:
1095
- r = frames[i + 1 /*R*/];
1096
- g = frames[i + 2 /*G*/];
1097
- b = frames[i + 3 /*B*/];
1098
- a = frames[i + 4 /*A*/];
1099
- r2 = frames[i + 5 /*R2*/];
1100
- g2 = frames[i + 6 /*G2*/];
1101
- b2 = frames[i + 7 /*B2*/];
1102
- break;
1103
- default:
1104
- r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
1105
- g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1106
- b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1107
- a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
1108
- r2 = this.getBezierValue(time, i, 5 /*R2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1109
- g2 = this.getBezierValue(time, i, 6 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1110
- b2 = this.getBezierValue(time, i, 7 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 6 - 2 /*BEZIER*/);
1111
- }
1112
- if (alpha == 1) {
1113
- light.set(r, g, b, a);
1114
- dark.r = r2;
1115
- dark.g = g2;
1116
- dark.b = b2;
1117
- }
1118
- else {
1119
- if (blend == MixBlend.setup) {
1120
- light.setFromColor(slot.data.color);
1121
- let setupDark = slot.data.darkColor;
1122
- dark.r = setupDark.r;
1123
- dark.g = setupDark.g;
1124
- dark.b = setupDark.b;
1125
- }
1126
- light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
1127
- dark.r += (r2 - dark.r) * alpha;
1128
- dark.g += (g2 - dark.g) * alpha;
1129
- dark.b += (b2 - dark.b) * alpha;
1130
- }
1131
- }
1132
- }
1133
- /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
1134
- export class RGB2Timeline extends CurveTimeline {
1135
- constructor(frameCount, bezierCount, slotIndex) {
1136
- super(frameCount, bezierCount, [
1137
- Property.rgb + "|" + slotIndex,
1138
- Property.rgb2 + "|" + slotIndex
1139
- ]);
1140
- this.slotIndex = 0;
1141
- this.slotIndex = slotIndex;
1142
- }
1143
- getFrameEntries() {
1144
- return 7 /*ENTRIES*/;
1145
- }
1146
- /** Sets the time in seconds, light, and dark colors for the specified key frame. */
1147
- setFrame(frame, time, r, g, b, r2, g2, b2) {
1148
- frame *= 7 /*ENTRIES*/;
1149
- this.frames[frame] = time;
1150
- this.frames[frame + 1 /*R*/] = r;
1151
- this.frames[frame + 2 /*G*/] = g;
1152
- this.frames[frame + 3 /*B*/] = b;
1153
- this.frames[frame + 4 /*R2*/] = r2;
1154
- this.frames[frame + 5 /*G2*/] = g2;
1155
- this.frames[frame + 6 /*B2*/] = b2;
1156
- }
1157
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1158
- let slot = skeleton.slots[this.slotIndex];
1159
- if (!slot.bone.active)
1160
- return;
1161
- let frames = this.frames;
1162
- let light = slot.color, dark = slot.darkColor;
1163
- if (time < frames[0]) {
1164
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1165
- switch (blend) {
1166
- case MixBlend.setup:
1167
- light.r = setupLight.r;
1168
- light.g = setupLight.g;
1169
- light.b = setupLight.b;
1170
- dark.r = setupDark.r;
1171
- dark.g = setupDark.g;
1172
- dark.b = setupDark.b;
1173
- return;
1174
- case MixBlend.first:
1175
- light.r += (setupLight.r - light.r) * alpha;
1176
- light.g += (setupLight.g - light.g) * alpha;
1177
- light.b += (setupLight.b - light.b) * alpha;
1178
- dark.r += (setupDark.r - dark.r) * alpha;
1179
- dark.g += (setupDark.g - dark.g) * alpha;
1180
- dark.b += (setupDark.b - dark.b) * alpha;
1181
- }
1182
- return;
1183
- }
1184
- let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
1185
- let i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1186
- let curveType = this.curves[i / 7 /*ENTRIES*/];
1187
- switch (curveType) {
1188
- case 0 /*LINEAR*/:
1189
- let before = frames[i];
1190
- r = frames[i + 1 /*R*/];
1191
- g = frames[i + 2 /*G*/];
1192
- b = frames[i + 3 /*B*/];
1193
- r2 = frames[i + 4 /*R2*/];
1194
- g2 = frames[i + 5 /*G2*/];
1195
- b2 = frames[i + 6 /*B2*/];
1196
- let t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1197
- r += (frames[i + 7 /*ENTRIES*/ + 1 /*R*/] - r) * t;
1198
- g += (frames[i + 7 /*ENTRIES*/ + 2 /*G*/] - g) * t;
1199
- b += (frames[i + 7 /*ENTRIES*/ + 3 /*B*/] - b) * t;
1200
- r2 += (frames[i + 7 /*ENTRIES*/ + 4 /*R2*/] - r2) * t;
1201
- g2 += (frames[i + 7 /*ENTRIES*/ + 5 /*G2*/] - g2) * t;
1202
- b2 += (frames[i + 7 /*ENTRIES*/ + 6 /*B2*/] - b2) * t;
1203
- break;
1204
- case 1 /*STEPPED*/:
1205
- r = frames[i + 1 /*R*/];
1206
- g = frames[i + 2 /*G*/];
1207
- b = frames[i + 3 /*B*/];
1208
- r2 = frames[i + 4 /*R2*/];
1209
- g2 = frames[i + 5 /*G2*/];
1210
- b2 = frames[i + 6 /*B2*/];
1211
- break;
1212
- default:
1213
- r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
1214
- g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1215
- b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1216
- r2 = this.getBezierValue(time, i, 4 /*R2*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
1217
- g2 = this.getBezierValue(time, i, 5 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1218
- b2 = this.getBezierValue(time, i, 6 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1219
- }
1220
- if (alpha == 1) {
1221
- light.r = r;
1222
- light.g = g;
1223
- light.b = b;
1224
- dark.r = r2;
1225
- dark.g = g2;
1226
- dark.b = b2;
1227
- }
1228
- else {
1229
- if (blend == MixBlend.setup) {
1230
- let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1231
- light.r = setupLight.r;
1232
- light.g = setupLight.g;
1233
- light.b = setupLight.b;
1234
- dark.r = setupDark.r;
1235
- dark.g = setupDark.g;
1236
- dark.b = setupDark.b;
1237
- }
1238
- light.r += (r - light.r) * alpha;
1239
- light.g += (g - light.g) * alpha;
1240
- light.b += (b - light.b) * alpha;
1241
- dark.r += (r2 - dark.r) * alpha;
1242
- dark.g += (g2 - dark.g) * alpha;
1243
- dark.b += (b2 - dark.b) * alpha;
1244
- }
1245
- }
1246
- }
1247
- /** Changes a slot's {@link Slot#attachment}. */
1248
- export class AttachmentTimeline extends Timeline {
1249
- constructor(frameCount, slotIndex) {
1250
- super(frameCount, [
1251
- Property.attachment + "|" + slotIndex
1252
- ]);
1253
- this.slotIndex = 0;
1254
- this.slotIndex = slotIndex;
1255
- this.attachmentNames = new Array(frameCount);
1256
- }
1257
- getFrameCount() {
1258
- return this.frames.length;
1259
- }
1260
- /** Sets the time in seconds and the attachment name for the specified key frame. */
1261
- setFrame(frame, time, attachmentName) {
1262
- this.frames[frame] = time;
1263
- this.attachmentNames[frame] = attachmentName;
1264
- }
1265
- apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1266
- let slot = skeleton.slots[this.slotIndex];
1267
- if (!slot.bone.active)
1268
- return;
1269
- if (direction == MixDirection.mixOut) {
1270
- if (blend == MixBlend.setup)
1271
- this.setAttachment(skeleton, slot, slot.data.attachmentName);
1272
- return;
1273
- }
1274
- if (time < this.frames[0]) {
1275
- if (blend == MixBlend.setup || blend == MixBlend.first)
1276
- this.setAttachment(skeleton, slot, slot.data.attachmentName);
1277
- return;
1278
- }
1279
- this.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]);
1280
- }
1281
- setAttachment(skeleton, slot, attachmentName) {
1282
- slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
1283
- }
1284
- }
1285
- /** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}. */
1286
- export class DeformTimeline extends CurveTimeline {
1287
- constructor(frameCount, bezierCount, slotIndex, attachment) {
1288
- super(frameCount, bezierCount, [
1289
- Property.deform + "|" + slotIndex + "|" + attachment.id
1290
- ]);
1291
- this.slotIndex = 0;
1292
- this.slotIndex = slotIndex;
1293
- this.attachment = attachment;
1294
- this.vertices = new Array(frameCount);
1295
- }
1296
- getFrameCount() {
1297
- return this.frames.length;
1298
- }
1299
- /** Sets the time in seconds and the vertices for the specified key frame.
1300
- * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */
1301
- setFrame(frame, time, vertices) {
1302
- this.frames[frame] = time;
1303
- this.vertices[frame] = vertices;
1304
- }
1305
- /** @param value1 Ignored (0 is used for a deform timeline).
1306
- * @param value2 Ignored (1 is used for a deform timeline). */
1307
- setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
1308
- let curves = this.curves;
1309
- let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
1310
- if (value == 0)
1311
- curves[frame] = 2 /*BEZIER*/ + i;
1312
- let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;
1313
- let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;
1314
- let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
1315
- let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;
1316
- let x = time1 + dx, y = dy;
1317
- for (let n = i + 18 /*BEZIER_SIZE*/; i < n; i += 2) {
1318
- curves[i] = x;
1319
- curves[i + 1] = y;
1320
- dx += ddx;
1321
- dy += ddy;
1322
- ddx += dddx;
1323
- ddy += dddy;
1324
- x += dx;
1325
- y += dy;
1326
- }
1327
- }
1328
- getCurvePercent(time, frame) {
1329
- let curves = this.curves;
1330
- let i = curves[frame];
1331
- switch (i) {
1332
- case 0 /*LINEAR*/:
1333
- let x = this.frames[frame];
1334
- return (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
1335
- case 1 /*STEPPED*/:
1336
- return 0;
1337
- }
1338
- i -= 2 /*BEZIER*/;
1339
- if (curves[i] > time) {
1340
- let x = this.frames[frame];
1341
- return curves[i + 1] * (time - x) / (curves[i] - x);
1342
- }
1343
- let n = i + 18 /*BEZIER_SIZE*/;
1344
- for (i += 2; i < n; i += 2) {
1345
- if (curves[i] >= time) {
1346
- let x = curves[i - 2], y = curves[i - 1];
1347
- return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
1348
- }
1349
- }
1350
- let x = curves[n - 2], y = curves[n - 1];
1351
- return y + (1 - y) * (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
1352
- }
1353
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1354
- let slot = skeleton.slots[this.slotIndex];
1355
- if (!slot.bone.active)
1356
- return;
1357
- let slotAttachment = slot.getAttachment();
1358
- if (!(slotAttachment instanceof VertexAttachment) || slotAttachment.deformAttachment != this.attachment)
1359
- return;
1360
- let deform = slot.deform;
1361
- if (deform.length == 0)
1362
- blend = MixBlend.setup;
1363
- let vertices = this.vertices;
1364
- let vertexCount = vertices[0].length;
1365
- let frames = this.frames;
1366
- if (time < frames[0]) {
1367
- let vertexAttachment = slotAttachment;
1368
- switch (blend) {
1369
- case MixBlend.setup:
1370
- deform.length = 0;
1371
- return;
1372
- case MixBlend.first:
1373
- if (alpha == 1) {
1374
- deform.length = 0;
1375
- return;
1376
- }
1377
- deform.length = vertexCount;
1378
- if (!vertexAttachment.bones) {
1379
- // Unweighted vertex positions.
1380
- let setupVertices = vertexAttachment.vertices;
1381
- for (var i = 0; i < vertexCount; i++)
1382
- deform[i] += (setupVertices[i] - deform[i]) * alpha;
1383
- }
1384
- else {
1385
- // Weighted deform offsets.
1386
- alpha = 1 - alpha;
1387
- for (var i = 0; i < vertexCount; i++)
1388
- deform[i] *= alpha;
1389
- }
1390
- }
1391
- return;
1392
- }
1393
- deform.length = vertexCount;
1394
- if (time >= frames[frames.length - 1]) { // Time is after last frame.
1395
- let lastVertices = vertices[frames.length - 1];
1396
- if (alpha == 1) {
1397
- if (blend == MixBlend.add) {
1398
- let vertexAttachment = slotAttachment;
1399
- if (!vertexAttachment.bones) {
1400
- // Unweighted vertex positions, with alpha.
1401
- let setupVertices = vertexAttachment.vertices;
1402
- for (let i = 0; i < vertexCount; i++)
1403
- deform[i] += lastVertices[i] - setupVertices[i];
1404
- }
1405
- else {
1406
- // Weighted deform offsets, with alpha.
1407
- for (let i = 0; i < vertexCount; i++)
1408
- deform[i] += lastVertices[i];
1409
- }
1410
- }
1411
- else
1412
- Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);
1413
- }
1414
- else {
1415
- switch (blend) {
1416
- case MixBlend.setup: {
1417
- let vertexAttachment = slotAttachment;
1418
- if (!vertexAttachment.bones) {
1419
- // Unweighted vertex positions, with alpha.
1420
- let setupVertices = vertexAttachment.vertices;
1421
- for (let i = 0; i < vertexCount; i++) {
1422
- let setup = setupVertices[i];
1423
- deform[i] = setup + (lastVertices[i] - setup) * alpha;
1424
- }
1425
- }
1426
- else {
1427
- // Weighted deform offsets, with alpha.
1428
- for (let i = 0; i < vertexCount; i++)
1429
- deform[i] = lastVertices[i] * alpha;
1430
- }
1431
- break;
1432
- }
1433
- case MixBlend.first:
1434
- case MixBlend.replace:
1435
- for (let i = 0; i < vertexCount; i++)
1436
- deform[i] += (lastVertices[i] - deform[i]) * alpha;
1437
- break;
1438
- case MixBlend.add:
1439
- let vertexAttachment = slotAttachment;
1440
- if (!vertexAttachment.bones) {
1441
- // Unweighted vertex positions, with alpha.
1442
- let setupVertices = vertexAttachment.vertices;
1443
- for (let i = 0; i < vertexCount; i++)
1444
- deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;
1445
- }
1446
- else {
1447
- // Weighted deform offsets, with alpha.
1448
- for (let i = 0; i < vertexCount; i++)
1449
- deform[i] += lastVertices[i] * alpha;
1450
- }
1451
- }
1452
- }
1453
- return;
1454
- }
1455
- // Interpolate between the previous frame and the current frame.
1456
- let frame = Timeline.search1(frames, time);
1457
- let percent = this.getCurvePercent(time, frame);
1458
- let prevVertices = vertices[frame];
1459
- let nextVertices = vertices[frame + 1];
1460
- if (alpha == 1) {
1461
- if (blend == MixBlend.add) {
1462
- let vertexAttachment = slotAttachment;
1463
- if (!vertexAttachment.bones) {
1464
- // Unweighted vertex positions, with alpha.
1465
- let setupVertices = vertexAttachment.vertices;
1466
- for (let i = 0; i < vertexCount; i++) {
1467
- let prev = prevVertices[i];
1468
- deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
1469
- }
1470
- }
1471
- else {
1472
- // Weighted deform offsets, with alpha.
1473
- for (let i = 0; i < vertexCount; i++) {
1474
- let prev = prevVertices[i];
1475
- deform[i] += prev + (nextVertices[i] - prev) * percent;
1476
- }
1477
- }
1478
- }
1479
- else {
1480
- for (let i = 0; i < vertexCount; i++) {
1481
- let prev = prevVertices[i];
1482
- deform[i] = prev + (nextVertices[i] - prev) * percent;
1483
- }
1484
- }
1485
- }
1486
- else {
1487
- switch (blend) {
1488
- case MixBlend.setup: {
1489
- let vertexAttachment = slotAttachment;
1490
- if (!vertexAttachment.bones) {
1491
- // Unweighted vertex positions, with alpha.
1492
- let setupVertices = vertexAttachment.vertices;
1493
- for (let i = 0; i < vertexCount; i++) {
1494
- let prev = prevVertices[i], setup = setupVertices[i];
1495
- deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
1496
- }
1497
- }
1498
- else {
1499
- // Weighted deform offsets, with alpha.
1500
- for (let i = 0; i < vertexCount; i++) {
1501
- let prev = prevVertices[i];
1502
- deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
1503
- }
1504
- }
1505
- break;
1506
- }
1507
- case MixBlend.first:
1508
- case MixBlend.replace:
1509
- for (let i = 0; i < vertexCount; i++) {
1510
- let prev = prevVertices[i];
1511
- deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;
1512
- }
1513
- break;
1514
- case MixBlend.add:
1515
- let vertexAttachment = slotAttachment;
1516
- if (!vertexAttachment.bones) {
1517
- // Unweighted vertex positions, with alpha.
1518
- let setupVertices = vertexAttachment.vertices;
1519
- for (let i = 0; i < vertexCount; i++) {
1520
- let prev = prevVertices[i];
1521
- deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
1522
- }
1523
- }
1524
- else {
1525
- // Weighted deform offsets, with alpha.
1526
- for (let i = 0; i < vertexCount; i++) {
1527
- let prev = prevVertices[i];
1528
- deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
1529
- }
1530
- }
1531
- }
1532
- }
1533
- }
1534
- }
1535
- /** Fires an {@link Event} when specific animation times are reached. */
1536
- export class EventTimeline extends Timeline {
1537
- constructor(frameCount) {
1538
- super(frameCount, EventTimeline.propertyIds);
1539
- this.events = new Array(frameCount);
1540
- }
1541
- getFrameCount() {
1542
- return this.frames.length;
1543
- }
1544
- /** Sets the time in seconds and the event for the specified key frame. */
1545
- setFrame(frame, event) {
1546
- this.frames[frame] = event.time;
1547
- this.events[frame] = event;
1548
- }
1549
- /** Fires events for frames > `lastTime` and <= `time`. */
1550
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1551
- if (!firedEvents)
1552
- return;
1553
- let frames = this.frames;
1554
- let frameCount = this.frames.length;
1555
- if (lastTime > time) { // Fire events after last time for looped animations.
1556
- this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);
1557
- lastTime = -1;
1558
- }
1559
- else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
1560
- return;
1561
- if (time < frames[0])
1562
- return; // Time is before first frame.
1563
- let i = 0;
1564
- if (lastTime < frames[0])
1565
- i = 0;
1566
- else {
1567
- i = Timeline.search1(frames, lastTime) + 1;
1568
- let frameTime = frames[i];
1569
- while (i > 0) { // Fire multiple events with the same frame.
1570
- if (frames[i - 1] != frameTime)
1571
- break;
1572
- i--;
1573
- }
1574
- }
1575
- for (; i < frameCount && time >= frames[i]; i++)
1576
- firedEvents.push(this.events[i]);
1577
- }
1578
- }
1579
- EventTimeline.propertyIds = ["" + Property.event];
1580
- /** Changes a skeleton's {@link Skeleton#drawOrder}. */
1581
- export class DrawOrderTimeline extends Timeline {
1582
- constructor(frameCount) {
1583
- super(frameCount, DrawOrderTimeline.propertyIds);
1584
- this.drawOrders = new Array(frameCount);
1585
- }
1586
- getFrameCount() {
1587
- return this.frames.length;
1588
- }
1589
- /** Sets the time in seconds and the draw order for the specified key frame.
1590
- * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose
1591
- * draw order. */
1592
- setFrame(frame, time, drawOrder) {
1593
- this.frames[frame] = time;
1594
- this.drawOrders[frame] = drawOrder;
1595
- }
1596
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1597
- if (direction == MixDirection.mixOut) {
1598
- if (blend == MixBlend.setup)
1599
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1600
- return;
1601
- }
1602
- if (time < this.frames[0]) {
1603
- if (blend == MixBlend.setup || blend == MixBlend.first)
1604
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1605
- return;
1606
- }
1607
- let drawOrderToSetupIndex = this.drawOrders[Timeline.search1(this.frames, time)];
1608
- if (!drawOrderToSetupIndex)
1609
- Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1610
- else {
1611
- let drawOrder = skeleton.drawOrder;
1612
- let slots = skeleton.slots;
1613
- for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
1614
- drawOrder[i] = slots[drawOrderToSetupIndex[i]];
1615
- }
1616
- }
1617
- }
1618
- DrawOrderTimeline.propertyIds = ["" + Property.drawOrder];
1619
- /** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},
1620
- * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}. */
1621
- export class IkConstraintTimeline extends CurveTimeline {
1622
- constructor(frameCount, bezierCount, ikConstraintIndex) {
1623
- super(frameCount, bezierCount, [
1624
- Property.ikConstraint + "|" + ikConstraintIndex
1625
- ]);
1626
- this.ikConstraintIndex = ikConstraintIndex;
1627
- }
1628
- getFrameEntries() {
1629
- return 6 /*ENTRIES*/;
1630
- }
1631
- /** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */
1632
- setFrame(frame, time, mix, softness, bendDirection, compress, stretch) {
1633
- frame *= 6 /*ENTRIES*/;
1634
- this.frames[frame] = time;
1635
- this.frames[frame + 1 /*MIX*/] = mix;
1636
- this.frames[frame + 2 /*SOFTNESS*/] = softness;
1637
- this.frames[frame + 3 /*BEND_DIRECTION*/] = bendDirection;
1638
- this.frames[frame + 4 /*COMPRESS*/] = compress ? 1 : 0;
1639
- this.frames[frame + 5 /*STRETCH*/] = stretch ? 1 : 0;
1640
- }
1641
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1642
- let constraint = skeleton.ikConstraints[this.ikConstraintIndex];
1643
- if (!constraint.active)
1644
- return;
1645
- let frames = this.frames;
1646
- if (time < frames[0]) {
1647
- switch (blend) {
1648
- case MixBlend.setup:
1649
- constraint.mix = constraint.data.mix;
1650
- constraint.softness = constraint.data.softness;
1651
- constraint.bendDirection = constraint.data.bendDirection;
1652
- constraint.compress = constraint.data.compress;
1653
- constraint.stretch = constraint.data.stretch;
1654
- return;
1655
- case MixBlend.first:
1656
- constraint.mix += (constraint.data.mix - constraint.mix) * alpha;
1657
- constraint.softness += (constraint.data.softness - constraint.softness) * alpha;
1658
- constraint.bendDirection = constraint.data.bendDirection;
1659
- constraint.compress = constraint.data.compress;
1660
- constraint.stretch = constraint.data.stretch;
1661
- }
1662
- return;
1663
- }
1664
- let mix = 0, softness = 0;
1665
- let i = Timeline.search(frames, time, 6 /*ENTRIES*/);
1666
- let curveType = this.curves[i / 6 /*ENTRIES*/];
1667
- switch (curveType) {
1668
- case 0 /*LINEAR*/:
1669
- let before = frames[i];
1670
- mix = frames[i + 1 /*MIX*/];
1671
- softness = frames[i + 2 /*SOFTNESS*/];
1672
- let t = (time - before) / (frames[i + 6 /*ENTRIES*/] - before);
1673
- mix += (frames[i + 6 /*ENTRIES*/ + 1 /*MIX*/] - mix) * t;
1674
- softness += (frames[i + 6 /*ENTRIES*/ + 2 /*SOFTNESS*/] - softness) * t;
1675
- break;
1676
- case 1 /*STEPPED*/:
1677
- mix = frames[i + 1 /*MIX*/];
1678
- softness = frames[i + 2 /*SOFTNESS*/];
1679
- break;
1680
- default:
1681
- mix = this.getBezierValue(time, i, 1 /*MIX*/, curveType - 2 /*BEZIER*/);
1682
- softness = this.getBezierValue(time, i, 2 /*SOFTNESS*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1683
- }
1684
- if (blend == MixBlend.setup) {
1685
- constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha;
1686
- constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha;
1687
- if (direction == MixDirection.mixOut) {
1688
- constraint.bendDirection = constraint.data.bendDirection;
1689
- constraint.compress = constraint.data.compress;
1690
- constraint.stretch = constraint.data.stretch;
1691
- }
1692
- else {
1693
- constraint.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1694
- constraint.compress = frames[i + 4 /*COMPRESS*/] != 0;
1695
- constraint.stretch = frames[i + 5 /*STRETCH*/] != 0;
1696
- }
1697
- }
1698
- else {
1699
- constraint.mix += (mix - constraint.mix) * alpha;
1700
- constraint.softness += (softness - constraint.softness) * alpha;
1701
- if (direction == MixDirection.mixIn) {
1702
- constraint.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1703
- constraint.compress = frames[i + 4 /*COMPRESS*/] != 0;
1704
- constraint.stretch = frames[i + 5 /*STRETCH*/] != 0;
1705
- }
1706
- }
1707
- }
1708
- }
1709
- /** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},
1710
- * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}. */
1711
- export class TransformConstraintTimeline extends CurveTimeline {
1712
- constructor(frameCount, bezierCount, transformConstraintIndex) {
1713
- super(frameCount, bezierCount, [
1714
- Property.transformConstraint + "|" + transformConstraintIndex
1715
- ]);
1716
- this.transformConstraintIndex = transformConstraintIndex;
1717
- }
1718
- getFrameEntries() {
1719
- return 7 /*ENTRIES*/;
1720
- }
1721
- /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */
1722
- setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY) {
1723
- let frames = this.frames;
1724
- frame *= 7 /*ENTRIES*/;
1725
- frames[frame] = time;
1726
- frames[frame + 1 /*ROTATE*/] = mixRotate;
1727
- frames[frame + 2 /*X*/] = mixX;
1728
- frames[frame + 3 /*Y*/] = mixY;
1729
- frames[frame + 4 /*SCALEX*/] = mixScaleX;
1730
- frames[frame + 5 /*SCALEY*/] = mixScaleY;
1731
- frames[frame + 6 /*SHEARY*/] = mixShearY;
1732
- }
1733
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1734
- let constraint = skeleton.transformConstraints[this.transformConstraintIndex];
1735
- if (!constraint.active)
1736
- return;
1737
- let frames = this.frames;
1738
- if (time < frames[0]) {
1739
- let data = constraint.data;
1740
- switch (blend) {
1741
- case MixBlend.setup:
1742
- constraint.mixRotate = data.mixRotate;
1743
- constraint.mixX = data.mixX;
1744
- constraint.mixY = data.mixY;
1745
- constraint.mixScaleX = data.mixScaleX;
1746
- constraint.mixScaleY = data.mixScaleY;
1747
- constraint.mixShearY = data.mixShearY;
1748
- return;
1749
- case MixBlend.first:
1750
- constraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha;
1751
- constraint.mixX += (data.mixX - constraint.mixX) * alpha;
1752
- constraint.mixY += (data.mixY - constraint.mixY) * alpha;
1753
- constraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha;
1754
- constraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha;
1755
- constraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha;
1756
- }
1757
- return;
1758
- }
1759
- let rotate, x, y, scaleX, scaleY, shearY;
1760
- let i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1761
- let curveType = this.curves[i / 7 /*ENTRIES*/];
1762
- switch (curveType) {
1763
- case 0 /*LINEAR*/:
1764
- let before = frames[i];
1765
- rotate = frames[i + 1 /*ROTATE*/];
1766
- x = frames[i + 2 /*X*/];
1767
- y = frames[i + 3 /*Y*/];
1768
- scaleX = frames[i + 4 /*SCALEX*/];
1769
- scaleY = frames[i + 5 /*SCALEY*/];
1770
- shearY = frames[i + 6 /*SHEARY*/];
1771
- let t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1772
- rotate += (frames[i + 7 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
1773
- x += (frames[i + 7 /*ENTRIES*/ + 2 /*X*/] - x) * t;
1774
- y += (frames[i + 7 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
1775
- scaleX += (frames[i + 7 /*ENTRIES*/ + 4 /*SCALEX*/] - scaleX) * t;
1776
- scaleY += (frames[i + 7 /*ENTRIES*/ + 5 /*SCALEY*/] - scaleY) * t;
1777
- shearY += (frames[i + 7 /*ENTRIES*/ + 6 /*SHEARY*/] - shearY) * t;
1778
- break;
1779
- case 1 /*STEPPED*/:
1780
- rotate = frames[i + 1 /*ROTATE*/];
1781
- x = frames[i + 2 /*X*/];
1782
- y = frames[i + 3 /*Y*/];
1783
- scaleX = frames[i + 4 /*SCALEX*/];
1784
- scaleY = frames[i + 5 /*SCALEY*/];
1785
- shearY = frames[i + 6 /*SHEARY*/];
1786
- break;
1787
- default:
1788
- rotate = this.getBezierValue(time, i, 1 /*ROTATE*/, curveType - 2 /*BEZIER*/);
1789
- x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1790
- y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1791
- scaleX = this.getBezierValue(time, i, 4 /*SCALEX*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
1792
- scaleY = this.getBezierValue(time, i, 5 /*SCALEY*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1793
- shearY = this.getBezierValue(time, i, 6 /*SHEARY*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1794
- }
1795
- if (blend == MixBlend.setup) {
1796
- let data = constraint.data;
1797
- constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
1798
- constraint.mixX = data.mixX + (x - data.mixX) * alpha;
1799
- constraint.mixY = data.mixY + (y - data.mixY) * alpha;
1800
- constraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha;
1801
- constraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha;
1802
- constraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha;
1803
- }
1804
- else {
1805
- constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
1806
- constraint.mixX += (x - constraint.mixX) * alpha;
1807
- constraint.mixY += (y - constraint.mixY) * alpha;
1808
- constraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha;
1809
- constraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha;
1810
- constraint.mixShearY += (shearY - constraint.mixShearY) * alpha;
1811
- }
1812
- }
1813
- }
1814
- /** Changes a path constraint's {@link PathConstraint#position}. */
1815
- export class PathConstraintPositionTimeline extends CurveTimeline1 {
1816
- constructor(frameCount, bezierCount, pathConstraintIndex) {
1817
- super(frameCount, bezierCount, Property.pathConstraintPosition + "|" + pathConstraintIndex);
1818
- this.pathConstraintIndex = pathConstraintIndex;
1819
- }
1820
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1821
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
1822
- if (!constraint.active)
1823
- return;
1824
- let frames = this.frames;
1825
- if (time < frames[0]) {
1826
- switch (blend) {
1827
- case MixBlend.setup:
1828
- constraint.position = constraint.data.position;
1829
- return;
1830
- case MixBlend.first:
1831
- constraint.position += (constraint.data.position - constraint.position) * alpha;
1832
- }
1833
- return;
1834
- }
1835
- let position = this.getCurveValue(time);
1836
- if (blend == MixBlend.setup)
1837
- constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;
1838
- else
1839
- constraint.position += (position - constraint.position) * alpha;
1840
- }
1841
- }
1842
- /** Changes a path constraint's {@link PathConstraint#spacing}. */
1843
- export class PathConstraintSpacingTimeline extends CurveTimeline1 {
1844
- constructor(frameCount, bezierCount, pathConstraintIndex) {
1845
- super(frameCount, bezierCount, Property.pathConstraintSpacing + "|" + pathConstraintIndex);
1846
- /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
1847
- this.pathConstraintIndex = 0;
1848
- this.pathConstraintIndex = pathConstraintIndex;
1849
- }
1850
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1851
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
1852
- if (!constraint.active)
1853
- return;
1854
- let frames = this.frames;
1855
- if (time < frames[0]) {
1856
- switch (blend) {
1857
- case MixBlend.setup:
1858
- constraint.spacing = constraint.data.spacing;
1859
- return;
1860
- case MixBlend.first:
1861
- constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;
1862
- }
1863
- return;
1864
- }
1865
- let spacing = this.getCurveValue(time);
1866
- if (blend == MixBlend.setup)
1867
- constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;
1868
- else
1869
- constraint.spacing += (spacing - constraint.spacing) * alpha;
1870
- }
1871
- }
1872
- /** Changes a transform constraint's {@link PathConstraint#getMixRotate()}, {@link PathConstraint#getMixX()}, and
1873
- * {@link PathConstraint#getMixY()}. */
1874
- export class PathConstraintMixTimeline extends CurveTimeline {
1875
- constructor(frameCount, bezierCount, pathConstraintIndex) {
1876
- super(frameCount, bezierCount, [
1877
- Property.pathConstraintMix + "|" + pathConstraintIndex
1878
- ]);
1879
- /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
1880
- this.pathConstraintIndex = 0;
1881
- this.pathConstraintIndex = pathConstraintIndex;
1882
- }
1883
- getFrameEntries() {
1884
- return 4 /*ENTRIES*/;
1885
- }
1886
- setFrame(frame, time, mixRotate, mixX, mixY) {
1887
- let frames = this.frames;
1888
- frame <<= 2;
1889
- frames[frame] = time;
1890
- frames[frame + 1 /*ROTATE*/] = mixRotate;
1891
- frames[frame + 2 /*X*/] = mixX;
1892
- frames[frame + 3 /*Y*/] = mixY;
1893
- }
1894
- apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1895
- let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
1896
- if (!constraint.active)
1897
- return;
1898
- let frames = this.frames;
1899
- if (time < frames[0]) {
1900
- switch (blend) {
1901
- case MixBlend.setup:
1902
- constraint.mixRotate = constraint.data.mixRotate;
1903
- constraint.mixX = constraint.data.mixX;
1904
- constraint.mixY = constraint.data.mixY;
1905
- return;
1906
- case MixBlend.first:
1907
- constraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha;
1908
- constraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha;
1909
- constraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha;
1910
- }
1911
- return;
1912
- }
1913
- let rotate, x, y;
1914
- let i = Timeline.search(frames, time, 4 /*ENTRIES*/);
1915
- let curveType = this.curves[i >> 2];
1916
- switch (curveType) {
1917
- case 0 /*LINEAR*/:
1918
- let before = frames[i];
1919
- rotate = frames[i + 1 /*ROTATE*/];
1920
- x = frames[i + 2 /*X*/];
1921
- y = frames[i + 3 /*Y*/];
1922
- let t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
1923
- rotate += (frames[i + 4 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
1924
- x += (frames[i + 4 /*ENTRIES*/ + 2 /*X*/] - x) * t;
1925
- y += (frames[i + 4 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
1926
- break;
1927
- case 1 /*STEPPED*/:
1928
- rotate = frames[i + 1 /*ROTATE*/];
1929
- x = frames[i + 2 /*X*/];
1930
- y = frames[i + 3 /*Y*/];
1931
- break;
1932
- default:
1933
- rotate = this.getBezierValue(time, i, 1 /*ROTATE*/, curveType - 2 /*BEZIER*/);
1934
- x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1935
- y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1936
- }
1937
- if (blend == MixBlend.setup) {
1938
- let data = constraint.data;
1939
- constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
1940
- constraint.mixX = data.mixX + (x - data.mixX) * alpha;
1941
- constraint.mixY = data.mixY + (y - data.mixY) * alpha;
1942
- }
1943
- else {
1944
- constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
1945
- constraint.mixX += (x - constraint.mixX) * alpha;
1946
- constraint.mixY += (y - constraint.mixY) * alpha;
1947
- }
1948
- }
1949
- }
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated January 1, 2020. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2020, Esoteric Software LLC
6
+ *
7
+ * Integration of the Spine Runtimes into software or otherwise creating
8
+ * derivative works of the Spine Runtimes is permitted under the terms and
9
+ * conditions of Section 2 of the Spine Editor License Agreement:
10
+ * http://esotericsoftware.com/spine-editor-license
11
+ *
12
+ * Otherwise, it is permitted to integrate the Spine Runtimes into software
13
+ * or otherwise create derivative works of the Spine Runtimes (collectively,
14
+ * "Products"), provided that each user of the Products must obtain their own
15
+ * Spine Editor license and redistribution of the Products in any form must
16
+ * include this license and copyright notice.
17
+ *
18
+ * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
19
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
24
+ * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
+ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ *****************************************************************************/
29
+ import { VertexAttachment } from "./attachments/Attachment";
30
+ import { StringSet, Utils, MathUtils } from "./Utils";
31
+ /** A simple container for a list of timelines and a name. */
32
+ export class Animation {
33
+ constructor(name, timelines, duration) {
34
+ if (!name)
35
+ throw new Error("name cannot be null.");
36
+ this.name = name;
37
+ this.setTimelines(timelines);
38
+ this.duration = duration;
39
+ }
40
+ setTimelines(timelines) {
41
+ if (!timelines)
42
+ throw new Error("timelines cannot be null.");
43
+ this.timelines = timelines;
44
+ this.timelineIds = new StringSet();
45
+ for (var i = 0; i < timelines.length; i++)
46
+ this.timelineIds.addAll(timelines[i].getPropertyIds());
47
+ }
48
+ hasTimeline(ids) {
49
+ for (let i = 0; i < ids.length; i++)
50
+ if (this.timelineIds.contains(ids[i]))
51
+ return true;
52
+ return false;
53
+ }
54
+ /** Applies all the animation's timelines to the specified skeleton.
55
+ *
56
+ * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}.
57
+ * @param loop If true, the animation repeats after {@link #getDuration()}.
58
+ * @param events May be null to ignore fired events. */
59
+ apply(skeleton, lastTime, time, loop, events, alpha, blend, direction) {
60
+ if (!skeleton)
61
+ throw new Error("skeleton cannot be null.");
62
+ if (loop && this.duration != 0) {
63
+ time %= this.duration;
64
+ if (lastTime > 0)
65
+ lastTime %= this.duration;
66
+ }
67
+ let timelines = this.timelines;
68
+ for (let i = 0, n = timelines.length; i < n; i++)
69
+ timelines[i].apply(skeleton, lastTime, time, events, alpha, blend, direction);
70
+ }
71
+ }
72
+ /** Controls how a timeline value is mixed with the setup pose value or current pose value when a timeline's `alpha`
73
+ * < 1.
74
+ *
75
+ * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
76
+ export var MixBlend;
77
+ (function (MixBlend) {
78
+ /** Transitions from the setup value to the timeline value (the current value is not used). Before the first key, the setup
79
+ * value is set. */
80
+ MixBlend[MixBlend["setup"] = 0] = "setup";
81
+ /** Transitions from the current value to the timeline value. Before the first key, transitions from the current value to
82
+ * the setup value. Timelines which perform instant transitions, such as {@link DrawOrderTimeline} or
83
+ * {@link AttachmentTimeline}, use the setup value before the first key.
84
+ *
85
+ * `first` is intended for the first animations applied, not for animations layered on top of those. */
86
+ MixBlend[MixBlend["first"] = 1] = "first";
87
+ /** Transitions from the current value to the timeline value. No change is made before the first key (the current value is
88
+ * kept until the first key).
89
+ *
90
+ * `replace` is intended for animations layered on top of others, not for the first animations applied. */
91
+ MixBlend[MixBlend["replace"] = 2] = "replace";
92
+ /** Transitions from the current value to the current value plus the timeline value. No change is made before the first key
93
+ * (the current value is kept until the first key).
94
+ *
95
+ * `add` is intended for animations layered on top of others, not for the first animations applied. Properties
96
+ * keyed by additive animations must be set manually or by another animation before applying the additive animations, else
97
+ * the property values will increase continually. */
98
+ MixBlend[MixBlend["add"] = 3] = "add";
99
+ })(MixBlend || (MixBlend = {}));
100
+ /** Indicates whether a timeline's `alpha` is mixing out over time toward 0 (the setup or current pose value) or
101
+ * mixing in toward 1 (the timeline's value).
102
+ *
103
+ * See Timeline {@link Timeline#apply(Skeleton, float, float, Array, float, MixBlend, MixDirection)}. */
104
+ export var MixDirection;
105
+ (function (MixDirection) {
106
+ MixDirection[MixDirection["mixIn"] = 0] = "mixIn";
107
+ MixDirection[MixDirection["mixOut"] = 1] = "mixOut";
108
+ })(MixDirection || (MixDirection = {}));
109
+ const Property = {
110
+ rotate: 0,
111
+ x: 1,
112
+ y: 2,
113
+ scaleX: 3,
114
+ scaleY: 4,
115
+ shearX: 5,
116
+ shearY: 6,
117
+ rgb: 7,
118
+ alpha: 8,
119
+ rgb2: 9,
120
+ attachment: 10,
121
+ deform: 11,
122
+ event: 12,
123
+ drawOrder: 13,
124
+ ikConstraint: 14,
125
+ transformConstraint: 15,
126
+ pathConstraintPosition: 16,
127
+ pathConstraintSpacing: 17,
128
+ pathConstraintMix: 18
129
+ };
130
+ /** The interface for all timelines. */
131
+ export class Timeline {
132
+ constructor(frameCount, propertyIds) {
133
+ this.propertyIds = propertyIds;
134
+ this.frames = Utils.newFloatArray(frameCount * this.getFrameEntries());
135
+ }
136
+ getPropertyIds() {
137
+ return this.propertyIds;
138
+ }
139
+ getFrameEntries() {
140
+ return 1;
141
+ }
142
+ getFrameCount() {
143
+ return this.frames.length / this.getFrameEntries();
144
+ }
145
+ getDuration() {
146
+ return this.frames[this.frames.length - this.getFrameEntries()];
147
+ }
148
+ static search1(frames, time) {
149
+ let n = frames.length;
150
+ for (let i = 1; i < n; i++)
151
+ if (frames[i] > time)
152
+ return i - 1;
153
+ return n - 1;
154
+ }
155
+ static search(frames, time, step) {
156
+ let n = frames.length;
157
+ for (let i = step; i < n; i += step)
158
+ if (frames[i] > time)
159
+ return i - step;
160
+ return n - step;
161
+ }
162
+ }
163
+ /** The base class for timelines that use interpolation between key frame values. */
164
+ export class CurveTimeline extends Timeline {
165
+ constructor(frameCount, bezierCount, propertyIds) {
166
+ super(frameCount, propertyIds);
167
+ this.curves = Utils.newFloatArray(frameCount + bezierCount * 18 /*BEZIER_SIZE*/);
168
+ this.curves[frameCount - 1] = 1 /*STEPPED*/;
169
+ }
170
+ /** Sets the specified key frame to linear interpolation. */
171
+ setLinear(frame) {
172
+ this.curves[frame] = 0 /*LINEAR*/;
173
+ }
174
+ /** Sets the specified key frame to stepped interpolation. */
175
+ setStepped(frame) {
176
+ this.curves[frame] = 1 /*STEPPED*/;
177
+ }
178
+ /** Shrinks the storage for Bezier curves, for use when <code>bezierCount</code> (specified in the constructor) was larger
179
+ * than the actual number of Bezier curves. */
180
+ shrink(bezierCount) {
181
+ let size = this.getFrameCount() + bezierCount * 18 /*BEZIER_SIZE*/;
182
+ if (this.curves.length > size) {
183
+ let newCurves = Utils.newFloatArray(size);
184
+ Utils.arrayCopy(this.curves, 0, newCurves, 0, size);
185
+ this.curves = newCurves;
186
+ }
187
+ }
188
+ /** Stores the segments for the specified Bezier curve. For timelines that modify multiple values, there may be more than
189
+ * one curve per frame.
190
+ * @param bezier The ordinal of this Bezier curve for this timeline, between 0 and <code>bezierCount - 1</code> (specified
191
+ * in the constructor), inclusive.
192
+ * @param frame Between 0 and <code>frameCount - 1</code>, inclusive.
193
+ * @param value The index of the value for this frame that this curve is used for.
194
+ * @param time1 The time for the first key.
195
+ * @param value1 The value for the first key.
196
+ * @param cx1 The time for the first Bezier handle.
197
+ * @param cy1 The value for the first Bezier handle.
198
+ * @param cx2 The time of the second Bezier handle.
199
+ * @param cy2 The value for the second Bezier handle.
200
+ * @param time2 The time for the second key.
201
+ * @param value2 The value for the second key. */
202
+ setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
203
+ let curves = this.curves;
204
+ let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
205
+ if (value == 0)
206
+ curves[frame] = 2 /*BEZIER*/ + i;
207
+ let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = (value1 - cy1 * 2 + cy2) * 0.03;
208
+ let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = ((cy1 - cy2) * 3 - value1 + value2) * 0.006;
209
+ let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
210
+ let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = (cy1 - value1) * 0.3 + tmpy + dddy * 0.16666667;
211
+ let x = time1 + dx, y = value1 + dy;
212
+ for (let n = i + 18 /*BEZIER_SIZE*/; i < n; i += 2) {
213
+ curves[i] = x;
214
+ curves[i + 1] = y;
215
+ dx += ddx;
216
+ dy += ddy;
217
+ ddx += dddx;
218
+ ddy += dddy;
219
+ x += dx;
220
+ y += dy;
221
+ }
222
+ }
223
+ /** Returns the Bezier interpolated value for the specified time.
224
+ * @param frameIndex The index into {@link #getFrames()} for the values of the frame before <code>time</code>.
225
+ * @param valueOffset The offset from <code>frameIndex</code> to the value this curve is used for.
226
+ * @param i The index of the Bezier segments. See {@link #getCurveType(int)}. */
227
+ getBezierValue(time, frameIndex, valueOffset, i) {
228
+ let curves = this.curves;
229
+ if (curves[i] > time) {
230
+ let x = this.frames[frameIndex], y = this.frames[frameIndex + valueOffset];
231
+ return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
232
+ }
233
+ let n = i + 18 /*BEZIER_SIZE*/;
234
+ for (i += 2; i < n; i += 2) {
235
+ if (curves[i] >= time) {
236
+ let x = curves[i - 2], y = curves[i - 1];
237
+ return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
238
+ }
239
+ }
240
+ frameIndex += this.getFrameEntries();
241
+ let x = curves[n - 2], y = curves[n - 1];
242
+ return y + (time - x) / (this.frames[frameIndex] - x) * (this.frames[frameIndex + valueOffset] - y);
243
+ }
244
+ }
245
+ export class CurveTimeline1 extends CurveTimeline {
246
+ constructor(frameCount, bezierCount, propertyId) {
247
+ super(frameCount, bezierCount, [propertyId]);
248
+ }
249
+ getFrameEntries() {
250
+ return 2 /*ENTRIES*/;
251
+ }
252
+ /** Sets the time and value for the specified frame.
253
+ * @param frame Between 0 and <code>frameCount</code>, inclusive.
254
+ * @param time The frame time in seconds. */
255
+ setFrame(frame, time, value) {
256
+ frame <<= 1;
257
+ this.frames[frame] = time;
258
+ this.frames[frame + 1 /*VALUE*/] = value;
259
+ }
260
+ /** Returns the interpolated value for the specified time. */
261
+ getCurveValue(time) {
262
+ let frames = this.frames;
263
+ let i = frames.length - 2;
264
+ for (let ii = 2; ii <= i; ii += 2) {
265
+ if (frames[ii] > time) {
266
+ i = ii - 2;
267
+ break;
268
+ }
269
+ }
270
+ let curveType = this.curves[i >> 1];
271
+ switch (curveType) {
272
+ case 0 /*LINEAR*/:
273
+ let before = frames[i], value = frames[i + 1 /*VALUE*/];
274
+ return value + (time - before) / (frames[i + 2 /*ENTRIES*/] - before) * (frames[i + 2 /*ENTRIES*/ + 1 /*VALUE*/] - value);
275
+ case 1 /*STEPPED*/:
276
+ return frames[i + 1 /*VALUE*/];
277
+ }
278
+ return this.getBezierValue(time, i, 1 /*VALUE*/, curveType - 2 /*BEZIER*/);
279
+ }
280
+ }
281
+ /** The base class for a {@link CurveTimeline} which sets two properties. */
282
+ export class CurveTimeline2 extends CurveTimeline {
283
+ /** @param bezierCount The maximum number of Bezier curves. See {@link #shrink(int)}.
284
+ * @param propertyIds Unique identifiers for the properties the timeline modifies. */
285
+ constructor(frameCount, bezierCount, propertyId1, propertyId2) {
286
+ super(frameCount, bezierCount, [propertyId1, propertyId2]);
287
+ }
288
+ getFrameEntries() {
289
+ return 3 /*ENTRIES*/;
290
+ }
291
+ /** Sets the time and values for the specified frame.
292
+ * @param frame Between 0 and <code>frameCount</code>, inclusive.
293
+ * @param time The frame time in seconds. */
294
+ setFrame(frame, time, value1, value2) {
295
+ frame *= 3 /*ENTRIES*/;
296
+ this.frames[frame] = time;
297
+ this.frames[frame + 1 /*VALUE1*/] = value1;
298
+ this.frames[frame + 2 /*VALUE2*/] = value2;
299
+ }
300
+ }
301
+ /** Changes a bone's local {@link Bone#rotation}. */
302
+ export class RotateTimeline extends CurveTimeline1 {
303
+ constructor(frameCount, bezierCount, boneIndex) {
304
+ super(frameCount, bezierCount, Property.rotate + "|" + boneIndex);
305
+ this.boneIndex = 0;
306
+ this.boneIndex = boneIndex;
307
+ }
308
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
309
+ let bone = skeleton.bones[this.boneIndex];
310
+ if (!bone.active)
311
+ return;
312
+ let frames = this.frames;
313
+ if (time < frames[0]) {
314
+ switch (blend) {
315
+ case MixBlend.setup:
316
+ bone.rotation = bone.data.rotation;
317
+ return;
318
+ case MixBlend.first:
319
+ bone.rotation += (bone.data.rotation - bone.rotation) * alpha;
320
+ }
321
+ return;
322
+ }
323
+ let r = this.getCurveValue(time);
324
+ switch (blend) {
325
+ case MixBlend.setup:
326
+ bone.rotation = bone.data.rotation + r * alpha;
327
+ break;
328
+ case MixBlend.first:
329
+ case MixBlend.replace:
330
+ r += bone.data.rotation - bone.rotation;
331
+ case MixBlend.add:
332
+ bone.rotation += r * alpha;
333
+ }
334
+ }
335
+ }
336
+ /** Changes a bone's local {@link Bone#x} and {@link Bone#y}. */
337
+ export class TranslateTimeline extends CurveTimeline2 {
338
+ constructor(frameCount, bezierCount, boneIndex) {
339
+ super(frameCount, bezierCount, Property.x + "|" + boneIndex, Property.y + "|" + boneIndex);
340
+ this.boneIndex = 0;
341
+ this.boneIndex = boneIndex;
342
+ }
343
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
344
+ let bone = skeleton.bones[this.boneIndex];
345
+ if (!bone.active)
346
+ return;
347
+ let frames = this.frames;
348
+ if (time < frames[0]) {
349
+ switch (blend) {
350
+ case MixBlend.setup:
351
+ bone.x = bone.data.x;
352
+ bone.y = bone.data.y;
353
+ return;
354
+ case MixBlend.first:
355
+ bone.x += (bone.data.x - bone.x) * alpha;
356
+ bone.y += (bone.data.y - bone.y) * alpha;
357
+ }
358
+ return;
359
+ }
360
+ let x = 0, y = 0;
361
+ let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
362
+ let curveType = this.curves[i / 3 /*ENTRIES*/];
363
+ switch (curveType) {
364
+ case 0 /*LINEAR*/:
365
+ let before = frames[i];
366
+ x = frames[i + 1 /*VALUE1*/];
367
+ y = frames[i + 2 /*VALUE2*/];
368
+ let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
369
+ x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
370
+ y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
371
+ break;
372
+ case 1 /*STEPPED*/:
373
+ x = frames[i + 1 /*VALUE1*/];
374
+ y = frames[i + 2 /*VALUE2*/];
375
+ break;
376
+ default:
377
+ x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
378
+ y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
379
+ }
380
+ switch (blend) {
381
+ case MixBlend.setup:
382
+ bone.x = bone.data.x + x * alpha;
383
+ bone.y = bone.data.y + y * alpha;
384
+ break;
385
+ case MixBlend.first:
386
+ case MixBlend.replace:
387
+ bone.x += (bone.data.x + x - bone.x) * alpha;
388
+ bone.y += (bone.data.y + y - bone.y) * alpha;
389
+ break;
390
+ case MixBlend.add:
391
+ bone.x += x * alpha;
392
+ bone.y += y * alpha;
393
+ }
394
+ }
395
+ }
396
+ /** Changes a bone's local {@link Bone#x}. */
397
+ export class TranslateXTimeline extends CurveTimeline1 {
398
+ constructor(frameCount, bezierCount, boneIndex) {
399
+ super(frameCount, bezierCount, Property.x + "|" + boneIndex);
400
+ this.boneIndex = 0;
401
+ this.boneIndex = boneIndex;
402
+ }
403
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
404
+ let bone = skeleton.bones[this.boneIndex];
405
+ if (!bone.active)
406
+ return;
407
+ let frames = this.frames;
408
+ if (time < frames[0]) {
409
+ switch (blend) {
410
+ case MixBlend.setup:
411
+ bone.x = bone.data.x;
412
+ return;
413
+ case MixBlend.first:
414
+ bone.x += (bone.data.x - bone.x) * alpha;
415
+ }
416
+ return;
417
+ }
418
+ let x = this.getCurveValue(time);
419
+ switch (blend) {
420
+ case MixBlend.setup:
421
+ bone.x = bone.data.x + x * alpha;
422
+ break;
423
+ case MixBlend.first:
424
+ case MixBlend.replace:
425
+ bone.x += (bone.data.x + x - bone.x) * alpha;
426
+ break;
427
+ case MixBlend.add:
428
+ bone.x += x * alpha;
429
+ }
430
+ }
431
+ }
432
+ /** Changes a bone's local {@link Bone#x}. */
433
+ export class TranslateYTimeline extends CurveTimeline1 {
434
+ constructor(frameCount, bezierCount, boneIndex) {
435
+ super(frameCount, bezierCount, Property.y + "|" + boneIndex);
436
+ this.boneIndex = 0;
437
+ this.boneIndex = boneIndex;
438
+ }
439
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
440
+ let bone = skeleton.bones[this.boneIndex];
441
+ if (!bone.active)
442
+ return;
443
+ let frames = this.frames;
444
+ if (time < frames[0]) {
445
+ switch (blend) {
446
+ case MixBlend.setup:
447
+ bone.y = bone.data.y;
448
+ return;
449
+ case MixBlend.first:
450
+ bone.y += (bone.data.y - bone.y) * alpha;
451
+ }
452
+ return;
453
+ }
454
+ let y = this.getCurveValue(time);
455
+ switch (blend) {
456
+ case MixBlend.setup:
457
+ bone.y = bone.data.y + y * alpha;
458
+ break;
459
+ case MixBlend.first:
460
+ case MixBlend.replace:
461
+ bone.y += (bone.data.y + y - bone.y) * alpha;
462
+ break;
463
+ case MixBlend.add:
464
+ bone.y += y * alpha;
465
+ }
466
+ }
467
+ }
468
+ /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
469
+ export class ScaleTimeline extends CurveTimeline2 {
470
+ constructor(frameCount, bezierCount, boneIndex) {
471
+ super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex, Property.scaleY + "|" + boneIndex);
472
+ this.boneIndex = 0;
473
+ this.boneIndex = boneIndex;
474
+ }
475
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
476
+ let bone = skeleton.bones[this.boneIndex];
477
+ if (!bone.active)
478
+ return;
479
+ let frames = this.frames;
480
+ if (time < frames[0]) {
481
+ switch (blend) {
482
+ case MixBlend.setup:
483
+ bone.scaleX = bone.data.scaleX;
484
+ bone.scaleY = bone.data.scaleY;
485
+ return;
486
+ case MixBlend.first:
487
+ bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
488
+ bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
489
+ }
490
+ return;
491
+ }
492
+ let x, y;
493
+ let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
494
+ let curveType = this.curves[i / 3 /*ENTRIES*/];
495
+ switch (curveType) {
496
+ case 0 /*LINEAR*/:
497
+ let before = frames[i];
498
+ x = frames[i + 1 /*VALUE1*/];
499
+ y = frames[i + 2 /*VALUE2*/];
500
+ let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
501
+ x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
502
+ y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
503
+ break;
504
+ case 1 /*STEPPED*/:
505
+ x = frames[i + 1 /*VALUE1*/];
506
+ y = frames[i + 2 /*VALUE2*/];
507
+ break;
508
+ default:
509
+ x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
510
+ y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
511
+ }
512
+ x *= bone.data.scaleX;
513
+ y *= bone.data.scaleY;
514
+ if (alpha == 1) {
515
+ if (blend == MixBlend.add) {
516
+ bone.scaleX += x - bone.data.scaleX;
517
+ bone.scaleY += y - bone.data.scaleY;
518
+ }
519
+ else {
520
+ bone.scaleX = x;
521
+ bone.scaleY = y;
522
+ }
523
+ }
524
+ else {
525
+ let bx = 0, by = 0;
526
+ if (direction == MixDirection.mixOut) {
527
+ switch (blend) {
528
+ case MixBlend.setup:
529
+ bx = bone.data.scaleX;
530
+ by = bone.data.scaleY;
531
+ bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
532
+ bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
533
+ break;
534
+ case MixBlend.first:
535
+ case MixBlend.replace:
536
+ bx = bone.scaleX;
537
+ by = bone.scaleY;
538
+ bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
539
+ bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
540
+ break;
541
+ case MixBlend.add:
542
+ bone.scaleX = (x - bone.data.scaleX) * alpha;
543
+ bone.scaleY = (y - bone.data.scaleY) * alpha;
544
+ }
545
+ }
546
+ else {
547
+ switch (blend) {
548
+ case MixBlend.setup:
549
+ bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
550
+ by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
551
+ bone.scaleX = bx + (x - bx) * alpha;
552
+ bone.scaleY = by + (y - by) * alpha;
553
+ break;
554
+ case MixBlend.first:
555
+ case MixBlend.replace:
556
+ bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
557
+ by = Math.abs(bone.scaleY) * MathUtils.signum(y);
558
+ bone.scaleX = bx + (x - bx) * alpha;
559
+ bone.scaleY = by + (y - by) * alpha;
560
+ break;
561
+ case MixBlend.add:
562
+ bone.scaleX += (x - bone.data.scaleX) * alpha;
563
+ bone.scaleY += (y - bone.data.scaleY) * alpha;
564
+ }
565
+ }
566
+ }
567
+ }
568
+ }
569
+ /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
570
+ export class ScaleXTimeline extends CurveTimeline1 {
571
+ constructor(frameCount, bezierCount, boneIndex) {
572
+ super(frameCount, bezierCount, Property.scaleX + "|" + boneIndex);
573
+ this.boneIndex = 0;
574
+ this.boneIndex = boneIndex;
575
+ }
576
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
577
+ let bone = skeleton.bones[this.boneIndex];
578
+ if (!bone.active)
579
+ return;
580
+ let frames = this.frames;
581
+ if (time < frames[0]) {
582
+ switch (blend) {
583
+ case MixBlend.setup:
584
+ bone.scaleX = bone.data.scaleX;
585
+ return;
586
+ case MixBlend.first:
587
+ bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha;
588
+ }
589
+ return;
590
+ }
591
+ let x = this.getCurveValue(time) * bone.data.scaleX;
592
+ if (alpha == 1) {
593
+ if (blend == MixBlend.add)
594
+ bone.scaleX += x - bone.data.scaleX;
595
+ else
596
+ bone.scaleX = x;
597
+ }
598
+ else {
599
+ // Mixing out uses sign of setup or current pose, else use sign of key.
600
+ let bx = 0;
601
+ if (direction == MixDirection.mixOut) {
602
+ switch (blend) {
603
+ case MixBlend.setup:
604
+ bx = bone.data.scaleX;
605
+ bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
606
+ break;
607
+ case MixBlend.first:
608
+ case MixBlend.replace:
609
+ bx = bone.scaleX;
610
+ bone.scaleX = bx + (Math.abs(x) * MathUtils.signum(bx) - bx) * alpha;
611
+ break;
612
+ case MixBlend.add:
613
+ bone.scaleX = (x - bone.data.scaleX) * alpha;
614
+ }
615
+ }
616
+ else {
617
+ switch (blend) {
618
+ case MixBlend.setup:
619
+ bx = Math.abs(bone.data.scaleX) * MathUtils.signum(x);
620
+ bone.scaleX = bx + (x - bx) * alpha;
621
+ break;
622
+ case MixBlend.first:
623
+ case MixBlend.replace:
624
+ bx = Math.abs(bone.scaleX) * MathUtils.signum(x);
625
+ bone.scaleX = bx + (x - bx) * alpha;
626
+ break;
627
+ case MixBlend.add:
628
+ bone.scaleX += (x - bone.data.scaleX) * alpha;
629
+ }
630
+ }
631
+ }
632
+ }
633
+ }
634
+ /** Changes a bone's local {@link Bone#scaleX)} and {@link Bone#scaleY}. */
635
+ export class ScaleYTimeline extends CurveTimeline1 {
636
+ constructor(frameCount, bezierCount, boneIndex) {
637
+ super(frameCount, bezierCount, Property.scaleY + "|" + boneIndex);
638
+ this.boneIndex = 0;
639
+ this.boneIndex = boneIndex;
640
+ }
641
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
642
+ let bone = skeleton.bones[this.boneIndex];
643
+ if (!bone.active)
644
+ return;
645
+ let frames = this.frames;
646
+ if (time < frames[0]) {
647
+ switch (blend) {
648
+ case MixBlend.setup:
649
+ bone.scaleY = bone.data.scaleY;
650
+ return;
651
+ case MixBlend.first:
652
+ bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha;
653
+ }
654
+ return;
655
+ }
656
+ let y = this.getCurveValue(time) * bone.data.scaleY;
657
+ if (alpha == 1) {
658
+ if (blend == MixBlend.add)
659
+ bone.scaleY += y - bone.data.scaleY;
660
+ else
661
+ bone.scaleY = y;
662
+ }
663
+ else {
664
+ // Mixing out uses sign of setup or current pose, else use sign of key.
665
+ let by = 0;
666
+ if (direction == MixDirection.mixOut) {
667
+ switch (blend) {
668
+ case MixBlend.setup:
669
+ by = bone.data.scaleY;
670
+ bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
671
+ break;
672
+ case MixBlend.first:
673
+ case MixBlend.replace:
674
+ by = bone.scaleY;
675
+ bone.scaleY = by + (Math.abs(y) * MathUtils.signum(by) - by) * alpha;
676
+ break;
677
+ case MixBlend.add:
678
+ bone.scaleY = (y - bone.data.scaleY) * alpha;
679
+ }
680
+ }
681
+ else {
682
+ switch (blend) {
683
+ case MixBlend.setup:
684
+ by = Math.abs(bone.data.scaleY) * MathUtils.signum(y);
685
+ bone.scaleY = by + (y - by) * alpha;
686
+ break;
687
+ case MixBlend.first:
688
+ case MixBlend.replace:
689
+ by = Math.abs(bone.scaleY) * MathUtils.signum(y);
690
+ bone.scaleY = by + (y - by) * alpha;
691
+ break;
692
+ case MixBlend.add:
693
+ bone.scaleY += (y - bone.data.scaleY) * alpha;
694
+ }
695
+ }
696
+ }
697
+ }
698
+ }
699
+ /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
700
+ export class ShearTimeline extends CurveTimeline2 {
701
+ constructor(frameCount, bezierCount, boneIndex) {
702
+ super(frameCount, bezierCount, Property.shearX + "|" + boneIndex, Property.shearY + "|" + boneIndex);
703
+ this.boneIndex = 0;
704
+ this.boneIndex = boneIndex;
705
+ }
706
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
707
+ let bone = skeleton.bones[this.boneIndex];
708
+ if (!bone.active)
709
+ return;
710
+ let frames = this.frames;
711
+ if (time < frames[0]) {
712
+ switch (blend) {
713
+ case MixBlend.setup:
714
+ bone.shearX = bone.data.shearX;
715
+ bone.shearY = bone.data.shearY;
716
+ return;
717
+ case MixBlend.first:
718
+ bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
719
+ bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
720
+ }
721
+ return;
722
+ }
723
+ let x = 0, y = 0;
724
+ let i = Timeline.search(frames, time, 3 /*ENTRIES*/);
725
+ let curveType = this.curves[i / 3 /*ENTRIES*/];
726
+ switch (curveType) {
727
+ case 0 /*LINEAR*/:
728
+ let before = frames[i];
729
+ x = frames[i + 1 /*VALUE1*/];
730
+ y = frames[i + 2 /*VALUE2*/];
731
+ let t = (time - before) / (frames[i + 3 /*ENTRIES*/] - before);
732
+ x += (frames[i + 3 /*ENTRIES*/ + 1 /*VALUE1*/] - x) * t;
733
+ y += (frames[i + 3 /*ENTRIES*/ + 2 /*VALUE2*/] - y) * t;
734
+ break;
735
+ case 1 /*STEPPED*/:
736
+ x = frames[i + 1 /*VALUE1*/];
737
+ y = frames[i + 2 /*VALUE2*/];
738
+ break;
739
+ default:
740
+ x = this.getBezierValue(time, i, 1 /*VALUE1*/, curveType - 2 /*BEZIER*/);
741
+ y = this.getBezierValue(time, i, 2 /*VALUE2*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
742
+ }
743
+ switch (blend) {
744
+ case MixBlend.setup:
745
+ bone.shearX = bone.data.shearX + x * alpha;
746
+ bone.shearY = bone.data.shearY + y * alpha;
747
+ break;
748
+ case MixBlend.first:
749
+ case MixBlend.replace:
750
+ bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
751
+ bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
752
+ break;
753
+ case MixBlend.add:
754
+ bone.shearX += x * alpha;
755
+ bone.shearY += y * alpha;
756
+ }
757
+ }
758
+ }
759
+ /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
760
+ export class ShearXTimeline extends CurveTimeline1 {
761
+ constructor(frameCount, bezierCount, boneIndex) {
762
+ super(frameCount, bezierCount, Property.shearX + "|" + boneIndex);
763
+ this.boneIndex = 0;
764
+ this.boneIndex = boneIndex;
765
+ }
766
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
767
+ let bone = skeleton.bones[this.boneIndex];
768
+ if (!bone.active)
769
+ return;
770
+ let frames = this.frames;
771
+ if (time < frames[0]) {
772
+ switch (blend) {
773
+ case MixBlend.setup:
774
+ bone.shearX = bone.data.shearX;
775
+ return;
776
+ case MixBlend.first:
777
+ bone.shearX += (bone.data.shearX - bone.shearX) * alpha;
778
+ }
779
+ return;
780
+ }
781
+ let x = this.getCurveValue(time);
782
+ switch (blend) {
783
+ case MixBlend.setup:
784
+ bone.shearX = bone.data.shearX + x * alpha;
785
+ break;
786
+ case MixBlend.first:
787
+ case MixBlend.replace:
788
+ bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha;
789
+ break;
790
+ case MixBlend.add:
791
+ bone.shearX += x * alpha;
792
+ }
793
+ }
794
+ }
795
+ /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
796
+ export class ShearYTimeline extends CurveTimeline1 {
797
+ constructor(frameCount, bezierCount, boneIndex) {
798
+ super(frameCount, bezierCount, Property.shearY + "|" + boneIndex);
799
+ this.boneIndex = 0;
800
+ this.boneIndex = boneIndex;
801
+ }
802
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
803
+ let bone = skeleton.bones[this.boneIndex];
804
+ if (!bone.active)
805
+ return;
806
+ let frames = this.frames;
807
+ if (time < frames[0]) {
808
+ switch (blend) {
809
+ case MixBlend.setup:
810
+ bone.shearY = bone.data.shearY;
811
+ return;
812
+ case MixBlend.first:
813
+ bone.shearY += (bone.data.shearY - bone.shearY) * alpha;
814
+ }
815
+ return;
816
+ }
817
+ let y = this.getCurveValue(time);
818
+ switch (blend) {
819
+ case MixBlend.setup:
820
+ bone.shearY = bone.data.shearY + y * alpha;
821
+ break;
822
+ case MixBlend.first:
823
+ case MixBlend.replace:
824
+ bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha;
825
+ break;
826
+ case MixBlend.add:
827
+ bone.shearY += y * alpha;
828
+ }
829
+ }
830
+ }
831
+ /** Changes a slot's {@link Slot#color}. */
832
+ export class RGBATimeline extends CurveTimeline {
833
+ constructor(frameCount, bezierCount, slotIndex) {
834
+ super(frameCount, bezierCount, [
835
+ Property.rgb + "|" + slotIndex,
836
+ Property.alpha + "|" + slotIndex
837
+ ]);
838
+ this.slotIndex = 0;
839
+ this.slotIndex = slotIndex;
840
+ }
841
+ getFrameEntries() {
842
+ return 5 /*ENTRIES*/;
843
+ }
844
+ /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
845
+ setFrame(frame, time, r, g, b, a) {
846
+ frame *= 5 /*ENTRIES*/;
847
+ this.frames[frame] = time;
848
+ this.frames[frame + 1 /*R*/] = r;
849
+ this.frames[frame + 2 /*G*/] = g;
850
+ this.frames[frame + 3 /*B*/] = b;
851
+ this.frames[frame + 4 /*A*/] = a;
852
+ }
853
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
854
+ let slot = skeleton.slots[this.slotIndex];
855
+ if (!slot.bone.active)
856
+ return;
857
+ let frames = this.frames;
858
+ let color = slot.color;
859
+ if (time < frames[0]) {
860
+ let setup = slot.data.color;
861
+ switch (blend) {
862
+ case MixBlend.setup:
863
+ color.setFromColor(setup);
864
+ return;
865
+ case MixBlend.first:
866
+ color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha);
867
+ }
868
+ return;
869
+ }
870
+ let r = 0, g = 0, b = 0, a = 0;
871
+ let i = Timeline.search(frames, time, 5 /*ENTRIES*/);
872
+ let curveType = this.curves[i / 5 /*ENTRIES*/];
873
+ switch (curveType) {
874
+ case 0 /*LINEAR*/:
875
+ let before = frames[i];
876
+ r = frames[i + 1 /*R*/];
877
+ g = frames[i + 2 /*G*/];
878
+ b = frames[i + 3 /*B*/];
879
+ a = frames[i + 4 /*A*/];
880
+ let t = (time - before) / (frames[i + 5 /*ENTRIES*/] - before);
881
+ r += (frames[i + 5 /*ENTRIES*/ + 1 /*R*/] - r) * t;
882
+ g += (frames[i + 5 /*ENTRIES*/ + 2 /*G*/] - g) * t;
883
+ b += (frames[i + 5 /*ENTRIES*/ + 3 /*B*/] - b) * t;
884
+ a += (frames[i + 5 /*ENTRIES*/ + 4 /*A*/] - a) * t;
885
+ break;
886
+ case 1 /*STEPPED*/:
887
+ r = frames[i + 1 /*R*/];
888
+ g = frames[i + 2 /*G*/];
889
+ b = frames[i + 3 /*B*/];
890
+ a = frames[i + 4 /*A*/];
891
+ break;
892
+ default:
893
+ r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
894
+ g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
895
+ b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
896
+ a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
897
+ }
898
+ if (alpha == 1)
899
+ color.set(r, g, b, a);
900
+ else {
901
+ if (blend == MixBlend.setup)
902
+ color.setFromColor(slot.data.color);
903
+ color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha);
904
+ }
905
+ }
906
+ }
907
+ /** Changes a slot's {@link Slot#color}. */
908
+ export class RGBTimeline extends CurveTimeline {
909
+ constructor(frameCount, bezierCount, slotIndex) {
910
+ super(frameCount, bezierCount, [
911
+ Property.rgb + "|" + slotIndex
912
+ ]);
913
+ this.slotIndex = 0;
914
+ this.slotIndex = slotIndex;
915
+ }
916
+ getFrameEntries() {
917
+ return 4 /*ENTRIES*/;
918
+ }
919
+ /** Sets the time in seconds, red, green, blue, and alpha for the specified key frame. */
920
+ setFrame(frame, time, r, g, b) {
921
+ frame <<= 2;
922
+ this.frames[frame] = time;
923
+ this.frames[frame + 1 /*R*/] = r;
924
+ this.frames[frame + 2 /*G*/] = g;
925
+ this.frames[frame + 3 /*B*/] = b;
926
+ }
927
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
928
+ let slot = skeleton.slots[this.slotIndex];
929
+ if (!slot.bone.active)
930
+ return;
931
+ let frames = this.frames;
932
+ let color = slot.color;
933
+ if (time < frames[0]) {
934
+ let setup = slot.data.color;
935
+ switch (blend) {
936
+ case MixBlend.setup:
937
+ color.r = setup.r;
938
+ color.g = setup.g;
939
+ color.b = setup.b;
940
+ return;
941
+ case MixBlend.first:
942
+ color.r += (setup.r - color.r) * alpha;
943
+ color.g += (setup.g - color.g) * alpha;
944
+ color.b += (setup.b - color.b) * alpha;
945
+ }
946
+ return;
947
+ }
948
+ let r = 0, g = 0, b = 0;
949
+ let i = Timeline.search(frames, time, 4 /*ENTRIES*/);
950
+ let curveType = this.curves[i >> 2];
951
+ switch (curveType) {
952
+ case 0 /*LINEAR*/:
953
+ let before = frames[i];
954
+ r = frames[i + 1 /*R*/];
955
+ g = frames[i + 2 /*G*/];
956
+ b = frames[i + 3 /*B*/];
957
+ let t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
958
+ r += (frames[i + 4 /*ENTRIES*/ + 1 /*R*/] - r) * t;
959
+ g += (frames[i + 4 /*ENTRIES*/ + 2 /*G*/] - g) * t;
960
+ b += (frames[i + 4 /*ENTRIES*/ + 3 /*B*/] - b) * t;
961
+ break;
962
+ case 1 /*STEPPED*/:
963
+ r = frames[i + 1 /*R*/];
964
+ g = frames[i + 2 /*G*/];
965
+ b = frames[i + 3 /*B*/];
966
+ break;
967
+ default:
968
+ r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
969
+ g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
970
+ b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
971
+ }
972
+ if (alpha == 1) {
973
+ color.r = r;
974
+ color.g = g;
975
+ color.b = b;
976
+ }
977
+ else {
978
+ if (blend == MixBlend.setup) {
979
+ let setup = slot.data.color;
980
+ color.r = setup.r;
981
+ color.g = setup.g;
982
+ color.b = setup.b;
983
+ }
984
+ color.r += (r - color.r) * alpha;
985
+ color.g += (g - color.g) * alpha;
986
+ color.b += (b - color.b) * alpha;
987
+ }
988
+ }
989
+ }
990
+ /** Changes a bone's local {@link Bone#shearX} and {@link Bone#shearY}. */
991
+ export class AlphaTimeline extends CurveTimeline1 {
992
+ constructor(frameCount, bezierCount, slotIndex) {
993
+ super(frameCount, bezierCount, Property.alpha + "|" + slotIndex);
994
+ this.slotIndex = 0;
995
+ this.slotIndex = slotIndex;
996
+ }
997
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
998
+ let slot = skeleton.slots[this.slotIndex];
999
+ if (!slot.bone.active)
1000
+ return;
1001
+ let color = slot.color;
1002
+ if (time < this.frames[0]) { // Time is before first frame.
1003
+ let setup = slot.data.color;
1004
+ switch (blend) {
1005
+ case MixBlend.setup:
1006
+ color.a = setup.a;
1007
+ return;
1008
+ case MixBlend.first:
1009
+ color.a += (setup.a - color.a) * alpha;
1010
+ }
1011
+ return;
1012
+ }
1013
+ let a = this.getCurveValue(time);
1014
+ if (alpha == 1)
1015
+ color.a = a;
1016
+ else {
1017
+ if (blend == MixBlend.setup)
1018
+ color.a = slot.data.color.a;
1019
+ color.a += (a - color.a) * alpha;
1020
+ }
1021
+ }
1022
+ }
1023
+ /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
1024
+ export class RGBA2Timeline extends CurveTimeline {
1025
+ constructor(frameCount, bezierCount, slotIndex) {
1026
+ super(frameCount, bezierCount, [
1027
+ Property.rgb + "|" + slotIndex,
1028
+ Property.alpha + "|" + slotIndex,
1029
+ Property.rgb2 + "|" + slotIndex
1030
+ ]);
1031
+ this.slotIndex = 0;
1032
+ this.slotIndex = slotIndex;
1033
+ }
1034
+ getFrameEntries() {
1035
+ return 8 /*ENTRIES*/;
1036
+ }
1037
+ /** Sets the time in seconds, light, and dark colors for the specified key frame. */
1038
+ setFrame(frame, time, r, g, b, a, r2, g2, b2) {
1039
+ frame <<= 3;
1040
+ this.frames[frame] = time;
1041
+ this.frames[frame + 1 /*R*/] = r;
1042
+ this.frames[frame + 2 /*G*/] = g;
1043
+ this.frames[frame + 3 /*B*/] = b;
1044
+ this.frames[frame + 4 /*A*/] = a;
1045
+ this.frames[frame + 5 /*R2*/] = r2;
1046
+ this.frames[frame + 6 /*G2*/] = g2;
1047
+ this.frames[frame + 7 /*B2*/] = b2;
1048
+ }
1049
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1050
+ let slot = skeleton.slots[this.slotIndex];
1051
+ if (!slot.bone.active)
1052
+ return;
1053
+ let frames = this.frames;
1054
+ let light = slot.color, dark = slot.darkColor;
1055
+ if (time < frames[0]) {
1056
+ let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1057
+ switch (blend) {
1058
+ case MixBlend.setup:
1059
+ light.setFromColor(setupLight);
1060
+ dark.r = setupDark.r;
1061
+ dark.g = setupDark.g;
1062
+ dark.b = setupDark.b;
1063
+ return;
1064
+ case MixBlend.first:
1065
+ light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha);
1066
+ dark.r += (setupDark.r - dark.r) * alpha;
1067
+ dark.g += (setupDark.g - dark.g) * alpha;
1068
+ dark.b += (setupDark.b - dark.b) * alpha;
1069
+ }
1070
+ return;
1071
+ }
1072
+ let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
1073
+ let i = Timeline.search(frames, time, 8 /*ENTRIES*/);
1074
+ let curveType = this.curves[i >> 3];
1075
+ switch (curveType) {
1076
+ case 0 /*LINEAR*/:
1077
+ let before = frames[i];
1078
+ r = frames[i + 1 /*R*/];
1079
+ g = frames[i + 2 /*G*/];
1080
+ b = frames[i + 3 /*B*/];
1081
+ a = frames[i + 4 /*A*/];
1082
+ r2 = frames[i + 5 /*R2*/];
1083
+ g2 = frames[i + 6 /*G2*/];
1084
+ b2 = frames[i + 7 /*B2*/];
1085
+ let t = (time - before) / (frames[i + 8 /*ENTRIES*/] - before);
1086
+ r += (frames[i + 8 /*ENTRIES*/ + 1 /*R*/] - r) * t;
1087
+ g += (frames[i + 8 /*ENTRIES*/ + 2 /*G*/] - g) * t;
1088
+ b += (frames[i + 8 /*ENTRIES*/ + 3 /*B*/] - b) * t;
1089
+ a += (frames[i + 8 /*ENTRIES*/ + 4 /*A*/] - a) * t;
1090
+ r2 += (frames[i + 8 /*ENTRIES*/ + 5 /*R2*/] - r2) * t;
1091
+ g2 += (frames[i + 8 /*ENTRIES*/ + 6 /*G2*/] - g2) * t;
1092
+ b2 += (frames[i + 8 /*ENTRIES*/ + 7 /*B2*/] - b2) * t;
1093
+ break;
1094
+ case 1 /*STEPPED*/:
1095
+ r = frames[i + 1 /*R*/];
1096
+ g = frames[i + 2 /*G*/];
1097
+ b = frames[i + 3 /*B*/];
1098
+ a = frames[i + 4 /*A*/];
1099
+ r2 = frames[i + 5 /*R2*/];
1100
+ g2 = frames[i + 6 /*G2*/];
1101
+ b2 = frames[i + 7 /*B2*/];
1102
+ break;
1103
+ default:
1104
+ r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
1105
+ g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1106
+ b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1107
+ a = this.getBezierValue(time, i, 4 /*A*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
1108
+ r2 = this.getBezierValue(time, i, 5 /*R2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1109
+ g2 = this.getBezierValue(time, i, 6 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1110
+ b2 = this.getBezierValue(time, i, 7 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 6 - 2 /*BEZIER*/);
1111
+ }
1112
+ if (alpha == 1) {
1113
+ light.set(r, g, b, a);
1114
+ dark.r = r2;
1115
+ dark.g = g2;
1116
+ dark.b = b2;
1117
+ }
1118
+ else {
1119
+ if (blend == MixBlend.setup) {
1120
+ light.setFromColor(slot.data.color);
1121
+ let setupDark = slot.data.darkColor;
1122
+ dark.r = setupDark.r;
1123
+ dark.g = setupDark.g;
1124
+ dark.b = setupDark.b;
1125
+ }
1126
+ light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha);
1127
+ dark.r += (r2 - dark.r) * alpha;
1128
+ dark.g += (g2 - dark.g) * alpha;
1129
+ dark.b += (b2 - dark.b) * alpha;
1130
+ }
1131
+ }
1132
+ }
1133
+ /** Changes a slot's {@link Slot#color} and {@link Slot#darkColor} for two color tinting. */
1134
+ export class RGB2Timeline extends CurveTimeline {
1135
+ constructor(frameCount, bezierCount, slotIndex) {
1136
+ super(frameCount, bezierCount, [
1137
+ Property.rgb + "|" + slotIndex,
1138
+ Property.rgb2 + "|" + slotIndex
1139
+ ]);
1140
+ this.slotIndex = 0;
1141
+ this.slotIndex = slotIndex;
1142
+ }
1143
+ getFrameEntries() {
1144
+ return 7 /*ENTRIES*/;
1145
+ }
1146
+ /** Sets the time in seconds, light, and dark colors for the specified key frame. */
1147
+ setFrame(frame, time, r, g, b, r2, g2, b2) {
1148
+ frame *= 7 /*ENTRIES*/;
1149
+ this.frames[frame] = time;
1150
+ this.frames[frame + 1 /*R*/] = r;
1151
+ this.frames[frame + 2 /*G*/] = g;
1152
+ this.frames[frame + 3 /*B*/] = b;
1153
+ this.frames[frame + 4 /*R2*/] = r2;
1154
+ this.frames[frame + 5 /*G2*/] = g2;
1155
+ this.frames[frame + 6 /*B2*/] = b2;
1156
+ }
1157
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1158
+ let slot = skeleton.slots[this.slotIndex];
1159
+ if (!slot.bone.active)
1160
+ return;
1161
+ let frames = this.frames;
1162
+ let light = slot.color, dark = slot.darkColor;
1163
+ if (time < frames[0]) {
1164
+ let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1165
+ switch (blend) {
1166
+ case MixBlend.setup:
1167
+ light.r = setupLight.r;
1168
+ light.g = setupLight.g;
1169
+ light.b = setupLight.b;
1170
+ dark.r = setupDark.r;
1171
+ dark.g = setupDark.g;
1172
+ dark.b = setupDark.b;
1173
+ return;
1174
+ case MixBlend.first:
1175
+ light.r += (setupLight.r - light.r) * alpha;
1176
+ light.g += (setupLight.g - light.g) * alpha;
1177
+ light.b += (setupLight.b - light.b) * alpha;
1178
+ dark.r += (setupDark.r - dark.r) * alpha;
1179
+ dark.g += (setupDark.g - dark.g) * alpha;
1180
+ dark.b += (setupDark.b - dark.b) * alpha;
1181
+ }
1182
+ return;
1183
+ }
1184
+ let r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0;
1185
+ let i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1186
+ let curveType = this.curves[i / 7 /*ENTRIES*/];
1187
+ switch (curveType) {
1188
+ case 0 /*LINEAR*/:
1189
+ let before = frames[i];
1190
+ r = frames[i + 1 /*R*/];
1191
+ g = frames[i + 2 /*G*/];
1192
+ b = frames[i + 3 /*B*/];
1193
+ r2 = frames[i + 4 /*R2*/];
1194
+ g2 = frames[i + 5 /*G2*/];
1195
+ b2 = frames[i + 6 /*B2*/];
1196
+ let t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1197
+ r += (frames[i + 7 /*ENTRIES*/ + 1 /*R*/] - r) * t;
1198
+ g += (frames[i + 7 /*ENTRIES*/ + 2 /*G*/] - g) * t;
1199
+ b += (frames[i + 7 /*ENTRIES*/ + 3 /*B*/] - b) * t;
1200
+ r2 += (frames[i + 7 /*ENTRIES*/ + 4 /*R2*/] - r2) * t;
1201
+ g2 += (frames[i + 7 /*ENTRIES*/ + 5 /*G2*/] - g2) * t;
1202
+ b2 += (frames[i + 7 /*ENTRIES*/ + 6 /*B2*/] - b2) * t;
1203
+ break;
1204
+ case 1 /*STEPPED*/:
1205
+ r = frames[i + 1 /*R*/];
1206
+ g = frames[i + 2 /*G*/];
1207
+ b = frames[i + 3 /*B*/];
1208
+ r2 = frames[i + 4 /*R2*/];
1209
+ g2 = frames[i + 5 /*G2*/];
1210
+ b2 = frames[i + 6 /*B2*/];
1211
+ break;
1212
+ default:
1213
+ r = this.getBezierValue(time, i, 1 /*R*/, curveType - 2 /*BEZIER*/);
1214
+ g = this.getBezierValue(time, i, 2 /*G*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1215
+ b = this.getBezierValue(time, i, 3 /*B*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1216
+ r2 = this.getBezierValue(time, i, 4 /*R2*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
1217
+ g2 = this.getBezierValue(time, i, 5 /*G2*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1218
+ b2 = this.getBezierValue(time, i, 6 /*B2*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1219
+ }
1220
+ if (alpha == 1) {
1221
+ light.r = r;
1222
+ light.g = g;
1223
+ light.b = b;
1224
+ dark.r = r2;
1225
+ dark.g = g2;
1226
+ dark.b = b2;
1227
+ }
1228
+ else {
1229
+ if (blend == MixBlend.setup) {
1230
+ let setupLight = slot.data.color, setupDark = slot.data.darkColor;
1231
+ light.r = setupLight.r;
1232
+ light.g = setupLight.g;
1233
+ light.b = setupLight.b;
1234
+ dark.r = setupDark.r;
1235
+ dark.g = setupDark.g;
1236
+ dark.b = setupDark.b;
1237
+ }
1238
+ light.r += (r - light.r) * alpha;
1239
+ light.g += (g - light.g) * alpha;
1240
+ light.b += (b - light.b) * alpha;
1241
+ dark.r += (r2 - dark.r) * alpha;
1242
+ dark.g += (g2 - dark.g) * alpha;
1243
+ dark.b += (b2 - dark.b) * alpha;
1244
+ }
1245
+ }
1246
+ }
1247
+ /** Changes a slot's {@link Slot#attachment}. */
1248
+ export class AttachmentTimeline extends Timeline {
1249
+ constructor(frameCount, slotIndex) {
1250
+ super(frameCount, [
1251
+ Property.attachment + "|" + slotIndex
1252
+ ]);
1253
+ this.slotIndex = 0;
1254
+ this.slotIndex = slotIndex;
1255
+ this.attachmentNames = new Array(frameCount);
1256
+ }
1257
+ getFrameCount() {
1258
+ return this.frames.length;
1259
+ }
1260
+ /** Sets the time in seconds and the attachment name for the specified key frame. */
1261
+ setFrame(frame, time, attachmentName) {
1262
+ this.frames[frame] = time;
1263
+ this.attachmentNames[frame] = attachmentName;
1264
+ }
1265
+ apply(skeleton, lastTime, time, events, alpha, blend, direction) {
1266
+ let slot = skeleton.slots[this.slotIndex];
1267
+ if (!slot.bone.active)
1268
+ return;
1269
+ if (direction == MixDirection.mixOut) {
1270
+ if (blend == MixBlend.setup)
1271
+ this.setAttachment(skeleton, slot, slot.data.attachmentName);
1272
+ return;
1273
+ }
1274
+ if (time < this.frames[0]) {
1275
+ if (blend == MixBlend.setup || blend == MixBlend.first)
1276
+ this.setAttachment(skeleton, slot, slot.data.attachmentName);
1277
+ return;
1278
+ }
1279
+ this.setAttachment(skeleton, slot, this.attachmentNames[Timeline.search1(this.frames, time)]);
1280
+ }
1281
+ setAttachment(skeleton, slot, attachmentName) {
1282
+ slot.setAttachment(!attachmentName ? null : skeleton.getAttachment(this.slotIndex, attachmentName));
1283
+ }
1284
+ }
1285
+ /** Changes a slot's {@link Slot#deform} to deform a {@link VertexAttachment}. */
1286
+ export class DeformTimeline extends CurveTimeline {
1287
+ constructor(frameCount, bezierCount, slotIndex, attachment) {
1288
+ super(frameCount, bezierCount, [
1289
+ Property.deform + "|" + slotIndex + "|" + attachment.id
1290
+ ]);
1291
+ this.slotIndex = 0;
1292
+ this.slotIndex = slotIndex;
1293
+ this.attachment = attachment;
1294
+ this.vertices = new Array(frameCount);
1295
+ }
1296
+ getFrameCount() {
1297
+ return this.frames.length;
1298
+ }
1299
+ /** Sets the time in seconds and the vertices for the specified key frame.
1300
+ * @param vertices Vertex positions for an unweighted VertexAttachment, or deform offsets if it has weights. */
1301
+ setFrame(frame, time, vertices) {
1302
+ this.frames[frame] = time;
1303
+ this.vertices[frame] = vertices;
1304
+ }
1305
+ /** @param value1 Ignored (0 is used for a deform timeline).
1306
+ * @param value2 Ignored (1 is used for a deform timeline). */
1307
+ setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2) {
1308
+ let curves = this.curves;
1309
+ let i = this.getFrameCount() + bezier * 18 /*BEZIER_SIZE*/;
1310
+ if (value == 0)
1311
+ curves[frame] = 2 /*BEZIER*/ + i;
1312
+ let tmpx = (time1 - cx1 * 2 + cx2) * 0.03, tmpy = cy2 * 0.03 - cy1 * 0.06;
1313
+ let dddx = ((cx1 - cx2) * 3 - time1 + time2) * 0.006, dddy = (cy1 - cy2 + 0.33333333) * 0.018;
1314
+ let ddx = tmpx * 2 + dddx, ddy = tmpy * 2 + dddy;
1315
+ let dx = (cx1 - time1) * 0.3 + tmpx + dddx * 0.16666667, dy = cy1 * 0.3 + tmpy + dddy * 0.16666667;
1316
+ let x = time1 + dx, y = dy;
1317
+ for (let n = i + 18 /*BEZIER_SIZE*/; i < n; i += 2) {
1318
+ curves[i] = x;
1319
+ curves[i + 1] = y;
1320
+ dx += ddx;
1321
+ dy += ddy;
1322
+ ddx += dddx;
1323
+ ddy += dddy;
1324
+ x += dx;
1325
+ y += dy;
1326
+ }
1327
+ }
1328
+ getCurvePercent(time, frame) {
1329
+ let curves = this.curves;
1330
+ let i = curves[frame];
1331
+ switch (i) {
1332
+ case 0 /*LINEAR*/:
1333
+ let x = this.frames[frame];
1334
+ return (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
1335
+ case 1 /*STEPPED*/:
1336
+ return 0;
1337
+ }
1338
+ i -= 2 /*BEZIER*/;
1339
+ if (curves[i] > time) {
1340
+ let x = this.frames[frame];
1341
+ return curves[i + 1] * (time - x) / (curves[i] - x);
1342
+ }
1343
+ let n = i + 18 /*BEZIER_SIZE*/;
1344
+ for (i += 2; i < n; i += 2) {
1345
+ if (curves[i] >= time) {
1346
+ let x = curves[i - 2], y = curves[i - 1];
1347
+ return y + (time - x) / (curves[i] - x) * (curves[i + 1] - y);
1348
+ }
1349
+ }
1350
+ let x = curves[n - 2], y = curves[n - 1];
1351
+ return y + (1 - y) * (time - x) / (this.frames[frame + this.getFrameEntries()] - x);
1352
+ }
1353
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1354
+ let slot = skeleton.slots[this.slotIndex];
1355
+ if (!slot.bone.active)
1356
+ return;
1357
+ let slotAttachment = slot.getAttachment();
1358
+ if (!(slotAttachment instanceof VertexAttachment) || slotAttachment.deformAttachment != this.attachment)
1359
+ return;
1360
+ let deform = slot.deform;
1361
+ if (deform.length == 0)
1362
+ blend = MixBlend.setup;
1363
+ let vertices = this.vertices;
1364
+ let vertexCount = vertices[0].length;
1365
+ let frames = this.frames;
1366
+ if (time < frames[0]) {
1367
+ let vertexAttachment = slotAttachment;
1368
+ switch (blend) {
1369
+ case MixBlend.setup:
1370
+ deform.length = 0;
1371
+ return;
1372
+ case MixBlend.first:
1373
+ if (alpha == 1) {
1374
+ deform.length = 0;
1375
+ return;
1376
+ }
1377
+ deform.length = vertexCount;
1378
+ if (!vertexAttachment.bones) {
1379
+ // Unweighted vertex positions.
1380
+ let setupVertices = vertexAttachment.vertices;
1381
+ for (var i = 0; i < vertexCount; i++)
1382
+ deform[i] += (setupVertices[i] - deform[i]) * alpha;
1383
+ }
1384
+ else {
1385
+ // Weighted deform offsets.
1386
+ alpha = 1 - alpha;
1387
+ for (var i = 0; i < vertexCount; i++)
1388
+ deform[i] *= alpha;
1389
+ }
1390
+ }
1391
+ return;
1392
+ }
1393
+ deform.length = vertexCount;
1394
+ if (time >= frames[frames.length - 1]) { // Time is after last frame.
1395
+ let lastVertices = vertices[frames.length - 1];
1396
+ if (alpha == 1) {
1397
+ if (blend == MixBlend.add) {
1398
+ let vertexAttachment = slotAttachment;
1399
+ if (!vertexAttachment.bones) {
1400
+ // Unweighted vertex positions, with alpha.
1401
+ let setupVertices = vertexAttachment.vertices;
1402
+ for (let i = 0; i < vertexCount; i++)
1403
+ deform[i] += lastVertices[i] - setupVertices[i];
1404
+ }
1405
+ else {
1406
+ // Weighted deform offsets, with alpha.
1407
+ for (let i = 0; i < vertexCount; i++)
1408
+ deform[i] += lastVertices[i];
1409
+ }
1410
+ }
1411
+ else
1412
+ Utils.arrayCopy(lastVertices, 0, deform, 0, vertexCount);
1413
+ }
1414
+ else {
1415
+ switch (blend) {
1416
+ case MixBlend.setup: {
1417
+ let vertexAttachment = slotAttachment;
1418
+ if (!vertexAttachment.bones) {
1419
+ // Unweighted vertex positions, with alpha.
1420
+ let setupVertices = vertexAttachment.vertices;
1421
+ for (let i = 0; i < vertexCount; i++) {
1422
+ let setup = setupVertices[i];
1423
+ deform[i] = setup + (lastVertices[i] - setup) * alpha;
1424
+ }
1425
+ }
1426
+ else {
1427
+ // Weighted deform offsets, with alpha.
1428
+ for (let i = 0; i < vertexCount; i++)
1429
+ deform[i] = lastVertices[i] * alpha;
1430
+ }
1431
+ break;
1432
+ }
1433
+ case MixBlend.first:
1434
+ case MixBlend.replace:
1435
+ for (let i = 0; i < vertexCount; i++)
1436
+ deform[i] += (lastVertices[i] - deform[i]) * alpha;
1437
+ break;
1438
+ case MixBlend.add:
1439
+ let vertexAttachment = slotAttachment;
1440
+ if (!vertexAttachment.bones) {
1441
+ // Unweighted vertex positions, with alpha.
1442
+ let setupVertices = vertexAttachment.vertices;
1443
+ for (let i = 0; i < vertexCount; i++)
1444
+ deform[i] += (lastVertices[i] - setupVertices[i]) * alpha;
1445
+ }
1446
+ else {
1447
+ // Weighted deform offsets, with alpha.
1448
+ for (let i = 0; i < vertexCount; i++)
1449
+ deform[i] += lastVertices[i] * alpha;
1450
+ }
1451
+ }
1452
+ }
1453
+ return;
1454
+ }
1455
+ // Interpolate between the previous frame and the current frame.
1456
+ let frame = Timeline.search1(frames, time);
1457
+ let percent = this.getCurvePercent(time, frame);
1458
+ let prevVertices = vertices[frame];
1459
+ let nextVertices = vertices[frame + 1];
1460
+ if (alpha == 1) {
1461
+ if (blend == MixBlend.add) {
1462
+ let vertexAttachment = slotAttachment;
1463
+ if (!vertexAttachment.bones) {
1464
+ // Unweighted vertex positions, with alpha.
1465
+ let setupVertices = vertexAttachment.vertices;
1466
+ for (let i = 0; i < vertexCount; i++) {
1467
+ let prev = prevVertices[i];
1468
+ deform[i] += prev + (nextVertices[i] - prev) * percent - setupVertices[i];
1469
+ }
1470
+ }
1471
+ else {
1472
+ // Weighted deform offsets, with alpha.
1473
+ for (let i = 0; i < vertexCount; i++) {
1474
+ let prev = prevVertices[i];
1475
+ deform[i] += prev + (nextVertices[i] - prev) * percent;
1476
+ }
1477
+ }
1478
+ }
1479
+ else {
1480
+ for (let i = 0; i < vertexCount; i++) {
1481
+ let prev = prevVertices[i];
1482
+ deform[i] = prev + (nextVertices[i] - prev) * percent;
1483
+ }
1484
+ }
1485
+ }
1486
+ else {
1487
+ switch (blend) {
1488
+ case MixBlend.setup: {
1489
+ let vertexAttachment = slotAttachment;
1490
+ if (!vertexAttachment.bones) {
1491
+ // Unweighted vertex positions, with alpha.
1492
+ let setupVertices = vertexAttachment.vertices;
1493
+ for (let i = 0; i < vertexCount; i++) {
1494
+ let prev = prevVertices[i], setup = setupVertices[i];
1495
+ deform[i] = setup + (prev + (nextVertices[i] - prev) * percent - setup) * alpha;
1496
+ }
1497
+ }
1498
+ else {
1499
+ // Weighted deform offsets, with alpha.
1500
+ for (let i = 0; i < vertexCount; i++) {
1501
+ let prev = prevVertices[i];
1502
+ deform[i] = (prev + (nextVertices[i] - prev) * percent) * alpha;
1503
+ }
1504
+ }
1505
+ break;
1506
+ }
1507
+ case MixBlend.first:
1508
+ case MixBlend.replace:
1509
+ for (let i = 0; i < vertexCount; i++) {
1510
+ let prev = prevVertices[i];
1511
+ deform[i] += (prev + (nextVertices[i] - prev) * percent - deform[i]) * alpha;
1512
+ }
1513
+ break;
1514
+ case MixBlend.add:
1515
+ let vertexAttachment = slotAttachment;
1516
+ if (!vertexAttachment.bones) {
1517
+ // Unweighted vertex positions, with alpha.
1518
+ let setupVertices = vertexAttachment.vertices;
1519
+ for (let i = 0; i < vertexCount; i++) {
1520
+ let prev = prevVertices[i];
1521
+ deform[i] += (prev + (nextVertices[i] - prev) * percent - setupVertices[i]) * alpha;
1522
+ }
1523
+ }
1524
+ else {
1525
+ // Weighted deform offsets, with alpha.
1526
+ for (let i = 0; i < vertexCount; i++) {
1527
+ let prev = prevVertices[i];
1528
+ deform[i] += (prev + (nextVertices[i] - prev) * percent) * alpha;
1529
+ }
1530
+ }
1531
+ }
1532
+ }
1533
+ }
1534
+ }
1535
+ /** Fires an {@link Event} when specific animation times are reached. */
1536
+ export class EventTimeline extends Timeline {
1537
+ constructor(frameCount) {
1538
+ super(frameCount, EventTimeline.propertyIds);
1539
+ this.events = new Array(frameCount);
1540
+ }
1541
+ getFrameCount() {
1542
+ return this.frames.length;
1543
+ }
1544
+ /** Sets the time in seconds and the event for the specified key frame. */
1545
+ setFrame(frame, event) {
1546
+ this.frames[frame] = event.time;
1547
+ this.events[frame] = event;
1548
+ }
1549
+ /** Fires events for frames > `lastTime` and <= `time`. */
1550
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1551
+ if (!firedEvents)
1552
+ return;
1553
+ let frames = this.frames;
1554
+ let frameCount = this.frames.length;
1555
+ if (lastTime > time) { // Fire events after last time for looped animations.
1556
+ this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, blend, direction);
1557
+ lastTime = -1;
1558
+ }
1559
+ else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame.
1560
+ return;
1561
+ if (time < frames[0])
1562
+ return; // Time is before first frame.
1563
+ let i = 0;
1564
+ if (lastTime < frames[0])
1565
+ i = 0;
1566
+ else {
1567
+ i = Timeline.search1(frames, lastTime) + 1;
1568
+ let frameTime = frames[i];
1569
+ while (i > 0) { // Fire multiple events with the same frame.
1570
+ if (frames[i - 1] != frameTime)
1571
+ break;
1572
+ i--;
1573
+ }
1574
+ }
1575
+ for (; i < frameCount && time >= frames[i]; i++)
1576
+ firedEvents.push(this.events[i]);
1577
+ }
1578
+ }
1579
+ EventTimeline.propertyIds = ["" + Property.event];
1580
+ /** Changes a skeleton's {@link Skeleton#drawOrder}. */
1581
+ export class DrawOrderTimeline extends Timeline {
1582
+ constructor(frameCount) {
1583
+ super(frameCount, DrawOrderTimeline.propertyIds);
1584
+ this.drawOrders = new Array(frameCount);
1585
+ }
1586
+ getFrameCount() {
1587
+ return this.frames.length;
1588
+ }
1589
+ /** Sets the time in seconds and the draw order for the specified key frame.
1590
+ * @param drawOrder For each slot in {@link Skeleton#slots}, the index of the new draw order. May be null to use setup pose
1591
+ * draw order. */
1592
+ setFrame(frame, time, drawOrder) {
1593
+ this.frames[frame] = time;
1594
+ this.drawOrders[frame] = drawOrder;
1595
+ }
1596
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1597
+ if (direction == MixDirection.mixOut) {
1598
+ if (blend == MixBlend.setup)
1599
+ Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1600
+ return;
1601
+ }
1602
+ if (time < this.frames[0]) {
1603
+ if (blend == MixBlend.setup || blend == MixBlend.first)
1604
+ Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1605
+ return;
1606
+ }
1607
+ let drawOrderToSetupIndex = this.drawOrders[Timeline.search1(this.frames, time)];
1608
+ if (!drawOrderToSetupIndex)
1609
+ Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length);
1610
+ else {
1611
+ let drawOrder = skeleton.drawOrder;
1612
+ let slots = skeleton.slots;
1613
+ for (let i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
1614
+ drawOrder[i] = slots[drawOrderToSetupIndex[i]];
1615
+ }
1616
+ }
1617
+ }
1618
+ DrawOrderTimeline.propertyIds = ["" + Property.drawOrder];
1619
+ /** Changes an IK constraint's {@link IkConstraint#mix}, {@link IkConstraint#softness},
1620
+ * {@link IkConstraint#bendDirection}, {@link IkConstraint#stretch}, and {@link IkConstraint#compress}. */
1621
+ export class IkConstraintTimeline extends CurveTimeline {
1622
+ constructor(frameCount, bezierCount, ikConstraintIndex) {
1623
+ super(frameCount, bezierCount, [
1624
+ Property.ikConstraint + "|" + ikConstraintIndex
1625
+ ]);
1626
+ this.ikConstraintIndex = ikConstraintIndex;
1627
+ }
1628
+ getFrameEntries() {
1629
+ return 6 /*ENTRIES*/;
1630
+ }
1631
+ /** Sets the time in seconds, mix, softness, bend direction, compress, and stretch for the specified key frame. */
1632
+ setFrame(frame, time, mix, softness, bendDirection, compress, stretch) {
1633
+ frame *= 6 /*ENTRIES*/;
1634
+ this.frames[frame] = time;
1635
+ this.frames[frame + 1 /*MIX*/] = mix;
1636
+ this.frames[frame + 2 /*SOFTNESS*/] = softness;
1637
+ this.frames[frame + 3 /*BEND_DIRECTION*/] = bendDirection;
1638
+ this.frames[frame + 4 /*COMPRESS*/] = compress ? 1 : 0;
1639
+ this.frames[frame + 5 /*STRETCH*/] = stretch ? 1 : 0;
1640
+ }
1641
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1642
+ let constraint = skeleton.ikConstraints[this.ikConstraintIndex];
1643
+ if (!constraint.active)
1644
+ return;
1645
+ let frames = this.frames;
1646
+ if (time < frames[0]) {
1647
+ switch (blend) {
1648
+ case MixBlend.setup:
1649
+ constraint.mix = constraint.data.mix;
1650
+ constraint.softness = constraint.data.softness;
1651
+ constraint.bendDirection = constraint.data.bendDirection;
1652
+ constraint.compress = constraint.data.compress;
1653
+ constraint.stretch = constraint.data.stretch;
1654
+ return;
1655
+ case MixBlend.first:
1656
+ constraint.mix += (constraint.data.mix - constraint.mix) * alpha;
1657
+ constraint.softness += (constraint.data.softness - constraint.softness) * alpha;
1658
+ constraint.bendDirection = constraint.data.bendDirection;
1659
+ constraint.compress = constraint.data.compress;
1660
+ constraint.stretch = constraint.data.stretch;
1661
+ }
1662
+ return;
1663
+ }
1664
+ let mix = 0, softness = 0;
1665
+ let i = Timeline.search(frames, time, 6 /*ENTRIES*/);
1666
+ let curveType = this.curves[i / 6 /*ENTRIES*/];
1667
+ switch (curveType) {
1668
+ case 0 /*LINEAR*/:
1669
+ let before = frames[i];
1670
+ mix = frames[i + 1 /*MIX*/];
1671
+ softness = frames[i + 2 /*SOFTNESS*/];
1672
+ let t = (time - before) / (frames[i + 6 /*ENTRIES*/] - before);
1673
+ mix += (frames[i + 6 /*ENTRIES*/ + 1 /*MIX*/] - mix) * t;
1674
+ softness += (frames[i + 6 /*ENTRIES*/ + 2 /*SOFTNESS*/] - softness) * t;
1675
+ break;
1676
+ case 1 /*STEPPED*/:
1677
+ mix = frames[i + 1 /*MIX*/];
1678
+ softness = frames[i + 2 /*SOFTNESS*/];
1679
+ break;
1680
+ default:
1681
+ mix = this.getBezierValue(time, i, 1 /*MIX*/, curveType - 2 /*BEZIER*/);
1682
+ softness = this.getBezierValue(time, i, 2 /*SOFTNESS*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1683
+ }
1684
+ if (blend == MixBlend.setup) {
1685
+ constraint.mix = constraint.data.mix + (mix - constraint.data.mix) * alpha;
1686
+ constraint.softness = constraint.data.softness + (softness - constraint.data.softness) * alpha;
1687
+ if (direction == MixDirection.mixOut) {
1688
+ constraint.bendDirection = constraint.data.bendDirection;
1689
+ constraint.compress = constraint.data.compress;
1690
+ constraint.stretch = constraint.data.stretch;
1691
+ }
1692
+ else {
1693
+ constraint.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1694
+ constraint.compress = frames[i + 4 /*COMPRESS*/] != 0;
1695
+ constraint.stretch = frames[i + 5 /*STRETCH*/] != 0;
1696
+ }
1697
+ }
1698
+ else {
1699
+ constraint.mix += (mix - constraint.mix) * alpha;
1700
+ constraint.softness += (softness - constraint.softness) * alpha;
1701
+ if (direction == MixDirection.mixIn) {
1702
+ constraint.bendDirection = frames[i + 3 /*BEND_DIRECTION*/];
1703
+ constraint.compress = frames[i + 4 /*COMPRESS*/] != 0;
1704
+ constraint.stretch = frames[i + 5 /*STRETCH*/] != 0;
1705
+ }
1706
+ }
1707
+ }
1708
+ }
1709
+ /** Changes a transform constraint's {@link TransformConstraint#rotateMix}, {@link TransformConstraint#translateMix},
1710
+ * {@link TransformConstraint#scaleMix}, and {@link TransformConstraint#shearMix}. */
1711
+ export class TransformConstraintTimeline extends CurveTimeline {
1712
+ constructor(frameCount, bezierCount, transformConstraintIndex) {
1713
+ super(frameCount, bezierCount, [
1714
+ Property.transformConstraint + "|" + transformConstraintIndex
1715
+ ]);
1716
+ this.transformConstraintIndex = transformConstraintIndex;
1717
+ }
1718
+ getFrameEntries() {
1719
+ return 7 /*ENTRIES*/;
1720
+ }
1721
+ /** The time in seconds, rotate mix, translate mix, scale mix, and shear mix for the specified key frame. */
1722
+ setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY) {
1723
+ let frames = this.frames;
1724
+ frame *= 7 /*ENTRIES*/;
1725
+ frames[frame] = time;
1726
+ frames[frame + 1 /*ROTATE*/] = mixRotate;
1727
+ frames[frame + 2 /*X*/] = mixX;
1728
+ frames[frame + 3 /*Y*/] = mixY;
1729
+ frames[frame + 4 /*SCALEX*/] = mixScaleX;
1730
+ frames[frame + 5 /*SCALEY*/] = mixScaleY;
1731
+ frames[frame + 6 /*SHEARY*/] = mixShearY;
1732
+ }
1733
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1734
+ let constraint = skeleton.transformConstraints[this.transformConstraintIndex];
1735
+ if (!constraint.active)
1736
+ return;
1737
+ let frames = this.frames;
1738
+ if (time < frames[0]) {
1739
+ let data = constraint.data;
1740
+ switch (blend) {
1741
+ case MixBlend.setup:
1742
+ constraint.mixRotate = data.mixRotate;
1743
+ constraint.mixX = data.mixX;
1744
+ constraint.mixY = data.mixY;
1745
+ constraint.mixScaleX = data.mixScaleX;
1746
+ constraint.mixScaleY = data.mixScaleY;
1747
+ constraint.mixShearY = data.mixShearY;
1748
+ return;
1749
+ case MixBlend.first:
1750
+ constraint.mixRotate += (data.mixRotate - constraint.mixRotate) * alpha;
1751
+ constraint.mixX += (data.mixX - constraint.mixX) * alpha;
1752
+ constraint.mixY += (data.mixY - constraint.mixY) * alpha;
1753
+ constraint.mixScaleX += (data.mixScaleX - constraint.mixScaleX) * alpha;
1754
+ constraint.mixScaleY += (data.mixScaleY - constraint.mixScaleY) * alpha;
1755
+ constraint.mixShearY += (data.mixShearY - constraint.mixShearY) * alpha;
1756
+ }
1757
+ return;
1758
+ }
1759
+ let rotate, x, y, scaleX, scaleY, shearY;
1760
+ let i = Timeline.search(frames, time, 7 /*ENTRIES*/);
1761
+ let curveType = this.curves[i / 7 /*ENTRIES*/];
1762
+ switch (curveType) {
1763
+ case 0 /*LINEAR*/:
1764
+ let before = frames[i];
1765
+ rotate = frames[i + 1 /*ROTATE*/];
1766
+ x = frames[i + 2 /*X*/];
1767
+ y = frames[i + 3 /*Y*/];
1768
+ scaleX = frames[i + 4 /*SCALEX*/];
1769
+ scaleY = frames[i + 5 /*SCALEY*/];
1770
+ shearY = frames[i + 6 /*SHEARY*/];
1771
+ let t = (time - before) / (frames[i + 7 /*ENTRIES*/] - before);
1772
+ rotate += (frames[i + 7 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
1773
+ x += (frames[i + 7 /*ENTRIES*/ + 2 /*X*/] - x) * t;
1774
+ y += (frames[i + 7 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
1775
+ scaleX += (frames[i + 7 /*ENTRIES*/ + 4 /*SCALEX*/] - scaleX) * t;
1776
+ scaleY += (frames[i + 7 /*ENTRIES*/ + 5 /*SCALEY*/] - scaleY) * t;
1777
+ shearY += (frames[i + 7 /*ENTRIES*/ + 6 /*SHEARY*/] - shearY) * t;
1778
+ break;
1779
+ case 1 /*STEPPED*/:
1780
+ rotate = frames[i + 1 /*ROTATE*/];
1781
+ x = frames[i + 2 /*X*/];
1782
+ y = frames[i + 3 /*Y*/];
1783
+ scaleX = frames[i + 4 /*SCALEX*/];
1784
+ scaleY = frames[i + 5 /*SCALEY*/];
1785
+ shearY = frames[i + 6 /*SHEARY*/];
1786
+ break;
1787
+ default:
1788
+ rotate = this.getBezierValue(time, i, 1 /*ROTATE*/, curveType - 2 /*BEZIER*/);
1789
+ x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1790
+ y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1791
+ scaleX = this.getBezierValue(time, i, 4 /*SCALEX*/, curveType + 18 /*BEZIER_SIZE*/ * 3 - 2 /*BEZIER*/);
1792
+ scaleY = this.getBezierValue(time, i, 5 /*SCALEY*/, curveType + 18 /*BEZIER_SIZE*/ * 4 - 2 /*BEZIER*/);
1793
+ shearY = this.getBezierValue(time, i, 6 /*SHEARY*/, curveType + 18 /*BEZIER_SIZE*/ * 5 - 2 /*BEZIER*/);
1794
+ }
1795
+ if (blend == MixBlend.setup) {
1796
+ let data = constraint.data;
1797
+ constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
1798
+ constraint.mixX = data.mixX + (x - data.mixX) * alpha;
1799
+ constraint.mixY = data.mixY + (y - data.mixY) * alpha;
1800
+ constraint.mixScaleX = data.mixScaleX + (scaleX - data.mixScaleX) * alpha;
1801
+ constraint.mixScaleY = data.mixScaleY + (scaleY - data.mixScaleY) * alpha;
1802
+ constraint.mixShearY = data.mixShearY + (shearY - data.mixShearY) * alpha;
1803
+ }
1804
+ else {
1805
+ constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
1806
+ constraint.mixX += (x - constraint.mixX) * alpha;
1807
+ constraint.mixY += (y - constraint.mixY) * alpha;
1808
+ constraint.mixScaleX += (scaleX - constraint.mixScaleX) * alpha;
1809
+ constraint.mixScaleY += (scaleY - constraint.mixScaleY) * alpha;
1810
+ constraint.mixShearY += (shearY - constraint.mixShearY) * alpha;
1811
+ }
1812
+ }
1813
+ }
1814
+ /** Changes a path constraint's {@link PathConstraint#position}. */
1815
+ export class PathConstraintPositionTimeline extends CurveTimeline1 {
1816
+ constructor(frameCount, bezierCount, pathConstraintIndex) {
1817
+ super(frameCount, bezierCount, Property.pathConstraintPosition + "|" + pathConstraintIndex);
1818
+ this.pathConstraintIndex = pathConstraintIndex;
1819
+ }
1820
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1821
+ let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
1822
+ if (!constraint.active)
1823
+ return;
1824
+ let frames = this.frames;
1825
+ if (time < frames[0]) {
1826
+ switch (blend) {
1827
+ case MixBlend.setup:
1828
+ constraint.position = constraint.data.position;
1829
+ return;
1830
+ case MixBlend.first:
1831
+ constraint.position += (constraint.data.position - constraint.position) * alpha;
1832
+ }
1833
+ return;
1834
+ }
1835
+ let position = this.getCurveValue(time);
1836
+ if (blend == MixBlend.setup)
1837
+ constraint.position = constraint.data.position + (position - constraint.data.position) * alpha;
1838
+ else
1839
+ constraint.position += (position - constraint.position) * alpha;
1840
+ }
1841
+ }
1842
+ /** Changes a path constraint's {@link PathConstraint#spacing}. */
1843
+ export class PathConstraintSpacingTimeline extends CurveTimeline1 {
1844
+ constructor(frameCount, bezierCount, pathConstraintIndex) {
1845
+ super(frameCount, bezierCount, Property.pathConstraintSpacing + "|" + pathConstraintIndex);
1846
+ /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
1847
+ this.pathConstraintIndex = 0;
1848
+ this.pathConstraintIndex = pathConstraintIndex;
1849
+ }
1850
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1851
+ let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
1852
+ if (!constraint.active)
1853
+ return;
1854
+ let frames = this.frames;
1855
+ if (time < frames[0]) {
1856
+ switch (blend) {
1857
+ case MixBlend.setup:
1858
+ constraint.spacing = constraint.data.spacing;
1859
+ return;
1860
+ case MixBlend.first:
1861
+ constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha;
1862
+ }
1863
+ return;
1864
+ }
1865
+ let spacing = this.getCurveValue(time);
1866
+ if (blend == MixBlend.setup)
1867
+ constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha;
1868
+ else
1869
+ constraint.spacing += (spacing - constraint.spacing) * alpha;
1870
+ }
1871
+ }
1872
+ /** Changes a transform constraint's {@link PathConstraint#getMixRotate()}, {@link PathConstraint#getMixX()}, and
1873
+ * {@link PathConstraint#getMixY()}. */
1874
+ export class PathConstraintMixTimeline extends CurveTimeline {
1875
+ constructor(frameCount, bezierCount, pathConstraintIndex) {
1876
+ super(frameCount, bezierCount, [
1877
+ Property.pathConstraintMix + "|" + pathConstraintIndex
1878
+ ]);
1879
+ /** The index of the path constraint slot in {@link Skeleton#getPathConstraints()} that will be changed. */
1880
+ this.pathConstraintIndex = 0;
1881
+ this.pathConstraintIndex = pathConstraintIndex;
1882
+ }
1883
+ getFrameEntries() {
1884
+ return 4 /*ENTRIES*/;
1885
+ }
1886
+ setFrame(frame, time, mixRotate, mixX, mixY) {
1887
+ let frames = this.frames;
1888
+ frame <<= 2;
1889
+ frames[frame] = time;
1890
+ frames[frame + 1 /*ROTATE*/] = mixRotate;
1891
+ frames[frame + 2 /*X*/] = mixX;
1892
+ frames[frame + 3 /*Y*/] = mixY;
1893
+ }
1894
+ apply(skeleton, lastTime, time, firedEvents, alpha, blend, direction) {
1895
+ let constraint = skeleton.pathConstraints[this.pathConstraintIndex];
1896
+ if (!constraint.active)
1897
+ return;
1898
+ let frames = this.frames;
1899
+ if (time < frames[0]) {
1900
+ switch (blend) {
1901
+ case MixBlend.setup:
1902
+ constraint.mixRotate = constraint.data.mixRotate;
1903
+ constraint.mixX = constraint.data.mixX;
1904
+ constraint.mixY = constraint.data.mixY;
1905
+ return;
1906
+ case MixBlend.first:
1907
+ constraint.mixRotate += (constraint.data.mixRotate - constraint.mixRotate) * alpha;
1908
+ constraint.mixX += (constraint.data.mixX - constraint.mixX) * alpha;
1909
+ constraint.mixY += (constraint.data.mixY - constraint.mixY) * alpha;
1910
+ }
1911
+ return;
1912
+ }
1913
+ let rotate, x, y;
1914
+ let i = Timeline.search(frames, time, 4 /*ENTRIES*/);
1915
+ let curveType = this.curves[i >> 2];
1916
+ switch (curveType) {
1917
+ case 0 /*LINEAR*/:
1918
+ let before = frames[i];
1919
+ rotate = frames[i + 1 /*ROTATE*/];
1920
+ x = frames[i + 2 /*X*/];
1921
+ y = frames[i + 3 /*Y*/];
1922
+ let t = (time - before) / (frames[i + 4 /*ENTRIES*/] - before);
1923
+ rotate += (frames[i + 4 /*ENTRIES*/ + 1 /*ROTATE*/] - rotate) * t;
1924
+ x += (frames[i + 4 /*ENTRIES*/ + 2 /*X*/] - x) * t;
1925
+ y += (frames[i + 4 /*ENTRIES*/ + 3 /*Y*/] - y) * t;
1926
+ break;
1927
+ case 1 /*STEPPED*/:
1928
+ rotate = frames[i + 1 /*ROTATE*/];
1929
+ x = frames[i + 2 /*X*/];
1930
+ y = frames[i + 3 /*Y*/];
1931
+ break;
1932
+ default:
1933
+ rotate = this.getBezierValue(time, i, 1 /*ROTATE*/, curveType - 2 /*BEZIER*/);
1934
+ x = this.getBezierValue(time, i, 2 /*X*/, curveType + 18 /*BEZIER_SIZE*/ - 2 /*BEZIER*/);
1935
+ y = this.getBezierValue(time, i, 3 /*Y*/, curveType + 18 /*BEZIER_SIZE*/ * 2 - 2 /*BEZIER*/);
1936
+ }
1937
+ if (blend == MixBlend.setup) {
1938
+ let data = constraint.data;
1939
+ constraint.mixRotate = data.mixRotate + (rotate - data.mixRotate) * alpha;
1940
+ constraint.mixX = data.mixX + (x - data.mixX) * alpha;
1941
+ constraint.mixY = data.mixY + (y - data.mixY) * alpha;
1942
+ }
1943
+ else {
1944
+ constraint.mixRotate += (rotate - constraint.mixRotate) * alpha;
1945
+ constraint.mixX += (x - constraint.mixX) * alpha;
1946
+ constraint.mixY += (y - constraint.mixY) * alpha;
1947
+ }
1948
+ }
1949
+ }
1950
1950
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW5pbWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0FuaW1hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFNeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFtQixNQUFNLFNBQVMsQ0FBQztBQUd2RSw2REFBNkQ7QUFDN0QsTUFBTSxPQUFPLFNBQVM7SUFTckIsWUFBYSxJQUFZLEVBQUUsU0FBMEIsRUFBRSxRQUFnQjtRQUN0RSxJQUFJLENBQUMsSUFBSTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzFCLENBQUM7SUFFRCxZQUFZLENBQUUsU0FBMEI7UUFDdkMsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsV0FBVyxDQUFFLEdBQWE7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVB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LENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUEsZUFBZSxDQUFDO1FBQzFELElBQUksS0FBSyxJQUFJLENBQUM7WUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xGLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDekcsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzlHLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBLGVBQWUsRUFBRSxD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QUMsQ0FBQztRQUNULElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUEsV0FBVyxDQUFDLENBQUM7UUFDcEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsU0FBUyxFQUFFO1lBQ2xCLEtBQUssQ0FBQyxDQUFBLFVBQVU7Z0JBQ2YsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQzVCLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RELENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO1lBQ1AsS0FBSyxDQUFDLENBQUEsV0FBVztnQkFDaEIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUM1QixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQzVCLE1BQU07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QUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQSxlQUFlLENBQUM7UUFDMUQsSUFBSSxLQUFLLElBQUksQ0FBQztZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQzFFLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDOUYsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pELElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLFVBQVUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUNuRyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLE1BQU0sQ0FBQyxDQUFD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LEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxLQUFLLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsVUFBVSxDQUFDLENBQUM7Z0JBQ2pDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxVQUFVLENBQUMsQ0FBQztnQkFDakMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUEsV0FBVyxHQUFHLENBQUMsQ0FBQSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pELENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBLFdBQVcsR0FBRyxDQUFDLENBQUEsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNqRCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQSxXQUFXLEdBQUcsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxHQUFH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