@esotericsoftware/spine-core 4.1.2 → 4.1.6

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 (96) hide show
  1. package/dist/Animation.d.ts +382 -382
  2. package/dist/Animation.js +2058 -2031
  3. package/dist/AnimationState.d.ts +396 -396
  4. package/dist/AnimationState.js +1083 -959
  5. package/dist/AnimationStateData.d.ts +51 -51
  6. package/dist/AnimationStateData.js +72 -70
  7. package/dist/AssetManagerBase.d.ts +74 -72
  8. package/dist/AssetManagerBase.js +304 -303
  9. package/dist/AtlasAttachmentLoader.d.ts +53 -53
  10. package/dist/AtlasAttachmentLoader.js +95 -94
  11. package/dist/Bone.d.ts +138 -138
  12. package/dist/Bone.js +340 -334
  13. package/dist/BoneData.d.ts +72 -72
  14. package/dist/BoneData.js +82 -74
  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 +49 -42
  19. package/dist/EventData.d.ts +41 -41
  20. package/dist/EventData.js +44 -37
  21. package/dist/IkConstraint.d.ts +64 -64
  22. package/dist/IkConstraint.js +291 -285
  23. package/dist/IkConstraintData.d.ts +54 -54
  24. package/dist/IkConstraintData.js +56 -54
  25. package/dist/PathConstraint.d.ts +71 -71
  26. package/dist/PathConstraint.js +475 -469
  27. package/dist/PathConstraintData.d.ts +80 -80
  28. package/dist/PathConstraintData.js +84 -70
  29. package/dist/Skeleton.d.ts +152 -152
  30. package/dist/Skeleton.js +581 -563
  31. package/dist/SkeletonBinary.d.ts +68 -68
  32. package/dist/SkeletonBinary.js +1132 -1131
  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 +190 -167
  39. package/dist/SkeletonJson.d.ts +53 -53
  40. package/dist/SkeletonJson.js +954 -953
  41. package/dist/Skin.d.ts +71 -71
  42. package/dist/Skin.js +203 -201
  43. package/dist/Slot.d.ts +69 -69
  44. package/dist/Slot.js +97 -85
  45. package/dist/SlotData.d.ts +57 -57
  46. package/dist/SlotData.js +68 -55
  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 +267 -246
  51. package/dist/TransformConstraint.d.ts +60 -60
  52. package/dist/TransformConstraint.js +246 -240
  53. package/dist/TransformConstraintData.d.ts +60 -60
  54. package/dist/TransformConstraintData.js +62 -60
  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 +72 -72
  64. package/dist/attachments/Attachment.js +149 -141
  65. package/dist/attachments/AttachmentLoader.d.ts +54 -54
  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 +51 -48
  71. package/dist/attachments/HasTextureRegion.d.ts +44 -44
  72. package/dist/attachments/HasTextureRegion.js +29 -29
  73. package/dist/attachments/MeshAttachment.d.ts +79 -79
  74. package/dist/attachments/MeshAttachment.js +189 -167
  75. package/dist/attachments/PathAttachment.d.ts +47 -47
  76. package/dist/attachments/PathAttachment.js +59 -57
  77. package/dist/attachments/PointAttachment.d.ts +48 -48
  78. package/dist/attachments/PointAttachment.js +66 -63
  79. package/dist/attachments/RegionAttachment.d.ts +111 -111
  80. package/dist/attachments/RegionAttachment.js +204 -199
  81. package/dist/attachments/Sequence.d.ts +55 -55
  82. package/dist/attachments/Sequence.js +90 -90
  83. package/dist/attachments/index.d.ts +8 -8
  84. package/dist/attachments/index.js +8 -8
  85. package/dist/iife/spine-core.js +178 -8
  86. package/dist/iife/spine-core.js.map +2 -2
  87. package/dist/iife/spine-core.min.js +2 -2
  88. package/dist/index.d.ts +42 -42
  89. package/dist/index.js +42 -42
  90. package/dist/polyfills.d.ts +29 -29
  91. package/dist/polyfills.js +38 -38
  92. package/dist/vertexeffects/JitterEffect.d.ts +39 -39
  93. package/dist/vertexeffects/JitterEffect.js +45 -45
  94. package/dist/vertexeffects/SwirlEffect.d.ts +44 -44
  95. package/dist/vertexeffects/SwirlEffect.js +60 -60
  96. package/package.json +32 -32
package/dist/Bone.js CHANGED
@@ -1,334 +1,340 @@
1
- /******************************************************************************
2
- * Spine Runtimes License Agreement
3
- * Last updated September 24, 2021. Replaces all prior versions.
4
- *
5
- * Copyright (c) 2013-2021, 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 { TransformMode } from "./BoneData";
30
- import { MathUtils } from "./Utils";
31
- /** Stores a bone's current pose.
32
- *
33
- * A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a
34
- * local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a
35
- * constraint or application code modifies the world transform after it was computed from the local transform. */
36
- export class Bone {
37
- /** @param parent May be null. */
38
- constructor(data, skeleton, parent) {
39
- /** The immediate children of this bone. */
40
- this.children = new Array();
41
- /** The local x translation. */
42
- this.x = 0;
43
- /** The local y translation. */
44
- this.y = 0;
45
- /** The local rotation in degrees, counter clockwise. */
46
- this.rotation = 0;
47
- /** The local scaleX. */
48
- this.scaleX = 0;
49
- /** The local scaleY. */
50
- this.scaleY = 0;
51
- /** The local shearX. */
52
- this.shearX = 0;
53
- /** The local shearY. */
54
- this.shearY = 0;
55
- /** The applied local x translation. */
56
- this.ax = 0;
57
- /** The applied local y translation. */
58
- this.ay = 0;
59
- /** The applied local rotation in degrees, counter clockwise. */
60
- this.arotation = 0;
61
- /** The applied local scaleX. */
62
- this.ascaleX = 0;
63
- /** The applied local scaleY. */
64
- this.ascaleY = 0;
65
- /** The applied local shearX. */
66
- this.ashearX = 0;
67
- /** The applied local shearY. */
68
- this.ashearY = 0;
69
- /** Part of the world transform matrix for the X axis. If changed, {@link #updateAppliedTransform()} should be called. */
70
- this.a = 0;
71
- /** Part of the world transform matrix for the Y axis. If changed, {@link #updateAppliedTransform()} should be called. */
72
- this.b = 0;
73
- /** Part of the world transform matrix for the X axis. If changed, {@link #updateAppliedTransform()} should be called. */
74
- this.c = 0;
75
- /** Part of the world transform matrix for the Y axis. If changed, {@link #updateAppliedTransform()} should be called. */
76
- this.d = 0;
77
- /** The world X position. If changed, {@link #updateAppliedTransform()} should be called. */
78
- this.worldY = 0;
79
- /** The world Y position. If changed, {@link #updateAppliedTransform()} should be called. */
80
- this.worldX = 0;
81
- this.sorted = false;
82
- this.active = false;
83
- if (!data)
84
- throw new Error("data cannot be null.");
85
- if (!skeleton)
86
- throw new Error("skeleton cannot be null.");
87
- this.data = data;
88
- this.skeleton = skeleton;
89
- this.parent = parent;
90
- this.setToSetupPose();
91
- }
92
- /** Returns false when the bone has not been computed because {@link BoneData#skinRequired} is true and the
93
- * {@link Skeleton#skin active skin} does not {@link Skin#bones contain} this bone. */
94
- isActive() {
95
- return this.active;
96
- }
97
- /** Computes the world transform using the parent bone and this bone's local applied transform. */
98
- update() {
99
- this.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY);
100
- }
101
- /** Computes the world transform using the parent bone and this bone's local transform.
102
- *
103
- * See {@link #updateWorldTransformWith()}. */
104
- updateWorldTransform() {
105
- this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
106
- }
107
- /** Computes the world transform using the parent bone and the specified local transform. The applied transform is set to the
108
- * specified local transform. Child bones are not updated.
109
- *
110
- * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
111
- * Runtimes Guide. */
112
- updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY) {
113
- this.ax = x;
114
- this.ay = y;
115
- this.arotation = rotation;
116
- this.ascaleX = scaleX;
117
- this.ascaleY = scaleY;
118
- this.ashearX = shearX;
119
- this.ashearY = shearY;
120
- let parent = this.parent;
121
- if (!parent) { // Root bone.
122
- let skeleton = this.skeleton;
123
- let rotationY = rotation + 90 + shearY;
124
- let sx = skeleton.scaleX;
125
- let sy = skeleton.scaleY;
126
- this.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;
127
- this.b = MathUtils.cosDeg(rotationY) * scaleY * sx;
128
- this.c = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;
129
- this.d = MathUtils.sinDeg(rotationY) * scaleY * sy;
130
- this.worldX = x * sx + skeleton.x;
131
- this.worldY = y * sy + skeleton.y;
132
- return;
133
- }
134
- let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
135
- this.worldX = pa * x + pb * y + parent.worldX;
136
- this.worldY = pc * x + pd * y + parent.worldY;
137
- switch (this.data.transformMode) {
138
- case TransformMode.Normal: {
139
- let rotationY = rotation + 90 + shearY;
140
- let la = MathUtils.cosDeg(rotation + shearX) * scaleX;
141
- let lb = MathUtils.cosDeg(rotationY) * scaleY;
142
- let lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
143
- let ld = MathUtils.sinDeg(rotationY) * scaleY;
144
- this.a = pa * la + pb * lc;
145
- this.b = pa * lb + pb * ld;
146
- this.c = pc * la + pd * lc;
147
- this.d = pc * lb + pd * ld;
148
- return;
149
- }
150
- case TransformMode.OnlyTranslation: {
151
- let rotationY = rotation + 90 + shearY;
152
- this.a = MathUtils.cosDeg(rotation + shearX) * scaleX;
153
- this.b = MathUtils.cosDeg(rotationY) * scaleY;
154
- this.c = MathUtils.sinDeg(rotation + shearX) * scaleX;
155
- this.d = MathUtils.sinDeg(rotationY) * scaleY;
156
- break;
157
- }
158
- case TransformMode.NoRotationOrReflection: {
159
- let s = pa * pa + pc * pc;
160
- let prx = 0;
161
- if (s > 0.0001) {
162
- s = Math.abs(pa * pd - pb * pc) / s;
163
- pa /= this.skeleton.scaleX;
164
- pc /= this.skeleton.scaleY;
165
- pb = pc * s;
166
- pd = pa * s;
167
- prx = Math.atan2(pc, pa) * MathUtils.radDeg;
168
- }
169
- else {
170
- pa = 0;
171
- pc = 0;
172
- prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;
173
- }
174
- let rx = rotation + shearX - prx;
175
- let ry = rotation + shearY - prx + 90;
176
- let la = MathUtils.cosDeg(rx) * scaleX;
177
- let lb = MathUtils.cosDeg(ry) * scaleY;
178
- let lc = MathUtils.sinDeg(rx) * scaleX;
179
- let ld = MathUtils.sinDeg(ry) * scaleY;
180
- this.a = pa * la - pb * lc;
181
- this.b = pa * lb - pb * ld;
182
- this.c = pc * la + pd * lc;
183
- this.d = pc * lb + pd * ld;
184
- break;
185
- }
186
- case TransformMode.NoScale:
187
- case TransformMode.NoScaleOrReflection: {
188
- let cos = MathUtils.cosDeg(rotation);
189
- let sin = MathUtils.sinDeg(rotation);
190
- let za = (pa * cos + pb * sin) / this.skeleton.scaleX;
191
- let zc = (pc * cos + pd * sin) / this.skeleton.scaleY;
192
- let s = Math.sqrt(za * za + zc * zc);
193
- if (s > 0.00001)
194
- s = 1 / s;
195
- za *= s;
196
- zc *= s;
197
- s = Math.sqrt(za * za + zc * zc);
198
- if (this.data.transformMode == TransformMode.NoScale
199
- && (pa * pd - pb * pc < 0) != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0))
200
- s = -s;
201
- let r = Math.PI / 2 + Math.atan2(zc, za);
202
- let zb = Math.cos(r) * s;
203
- let zd = Math.sin(r) * s;
204
- let la = MathUtils.cosDeg(shearX) * scaleX;
205
- let lb = MathUtils.cosDeg(90 + shearY) * scaleY;
206
- let lc = MathUtils.sinDeg(shearX) * scaleX;
207
- let ld = MathUtils.sinDeg(90 + shearY) * scaleY;
208
- this.a = za * la + zb * lc;
209
- this.b = za * lb + zb * ld;
210
- this.c = zc * la + zd * lc;
211
- this.d = zc * lb + zd * ld;
212
- break;
213
- }
214
- }
215
- this.a *= this.skeleton.scaleX;
216
- this.b *= this.skeleton.scaleX;
217
- this.c *= this.skeleton.scaleY;
218
- this.d *= this.skeleton.scaleY;
219
- }
220
- /** Sets this bone's local transform to the setup pose. */
221
- setToSetupPose() {
222
- let data = this.data;
223
- this.x = data.x;
224
- this.y = data.y;
225
- this.rotation = data.rotation;
226
- this.scaleX = data.scaleX;
227
- this.scaleY = data.scaleY;
228
- this.shearX = data.shearX;
229
- this.shearY = data.shearY;
230
- }
231
- /** The world rotation for the X axis, calculated using {@link #a} and {@link #c}. */
232
- getWorldRotationX() {
233
- return Math.atan2(this.c, this.a) * MathUtils.radDeg;
234
- }
235
- /** The world rotation for the Y axis, calculated using {@link #b} and {@link #d}. */
236
- getWorldRotationY() {
237
- return Math.atan2(this.d, this.b) * MathUtils.radDeg;
238
- }
239
- /** The magnitude (always positive) of the world scale X, calculated using {@link #a} and {@link #c}. */
240
- getWorldScaleX() {
241
- return Math.sqrt(this.a * this.a + this.c * this.c);
242
- }
243
- /** The magnitude (always positive) of the world scale Y, calculated using {@link #b} and {@link #d}. */
244
- getWorldScaleY() {
245
- return Math.sqrt(this.b * this.b + this.d * this.d);
246
- }
247
- /** Computes the applied transform values from the world transform.
248
- *
249
- * If the world transform is modified (by a constraint, {@link #rotateWorld(float)}, etc) then this method should be called so
250
- * the applied transform matches the world transform. The applied transform may be needed by other code (eg to apply other
251
- * constraints).
252
- *
253
- * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The applied transform after
254
- * calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */
255
- updateAppliedTransform() {
256
- let parent = this.parent;
257
- if (!parent) {
258
- this.ax = this.worldX - this.skeleton.x;
259
- this.ay = this.worldY - this.skeleton.y;
260
- this.arotation = Math.atan2(this.c, this.a) * MathUtils.radDeg;
261
- this.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c);
262
- this.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d);
263
- this.ashearX = 0;
264
- this.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * MathUtils.radDeg;
265
- return;
266
- }
267
- let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
268
- let pid = 1 / (pa * pd - pb * pc);
269
- let dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY;
270
- this.ax = (dx * pd * pid - dy * pb * pid);
271
- this.ay = (dy * pa * pid - dx * pc * pid);
272
- let ia = pid * pd;
273
- let id = pid * pa;
274
- let ib = pid * pb;
275
- let ic = pid * pc;
276
- let ra = ia * this.a - ib * this.c;
277
- let rb = ia * this.b - ib * this.d;
278
- let rc = id * this.c - ic * this.a;
279
- let rd = id * this.d - ic * this.b;
280
- this.ashearX = 0;
281
- this.ascaleX = Math.sqrt(ra * ra + rc * rc);
282
- if (this.ascaleX > 0.0001) {
283
- let det = ra * rd - rb * rc;
284
- this.ascaleY = det / this.ascaleX;
285
- this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
286
- this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
287
- }
288
- else {
289
- this.ascaleX = 0;
290
- this.ascaleY = Math.sqrt(rb * rb + rd * rd);
291
- this.ashearY = 0;
292
- this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;
293
- }
294
- }
295
- /** Transforms a point from world coordinates to the bone's local coordinates. */
296
- worldToLocal(world) {
297
- let invDet = 1 / (this.a * this.d - this.b * this.c);
298
- let x = world.x - this.worldX, y = world.y - this.worldY;
299
- world.x = x * this.d * invDet - y * this.b * invDet;
300
- world.y = y * this.a * invDet - x * this.c * invDet;
301
- return world;
302
- }
303
- /** Transforms a point from the bone's local coordinates to world coordinates. */
304
- localToWorld(local) {
305
- let x = local.x, y = local.y;
306
- local.x = x * this.a + y * this.b + this.worldX;
307
- local.y = x * this.c + y * this.d + this.worldY;
308
- return local;
309
- }
310
- /** Transforms a world rotation to a local rotation. */
311
- worldToLocalRotation(worldRotation) {
312
- let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation);
313
- return Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * MathUtils.radDeg + this.rotation - this.shearX;
314
- }
315
- /** Transforms a local rotation to a world rotation. */
316
- localToWorldRotation(localRotation) {
317
- localRotation -= this.rotation - this.shearX;
318
- let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation);
319
- return Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * MathUtils.radDeg;
320
- }
321
- /** Rotates the world transform the specified amount.
322
- * <p>
323
- * After changes are made to the world transform, {@link #updateAppliedTransform()} should be called and {@link #update()} will
324
- * need to be called on any child bones, recursively. */
325
- rotateWorld(degrees) {
326
- let a = this.a, b = this.b, c = this.c, d = this.d;
327
- let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees);
328
- this.a = cos * a - sin * c;
329
- this.b = cos * b - sin * d;
330
- this.c = sin * a + cos * c;
331
- this.d = sin * b + cos * d;
332
- }
333
- }
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Cb25lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3JELE9BQU8sRUFBRSxTQUFTLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFN0M7Ozs7aUhBSWlIO0FBQ2pILE1BQU0sT0FBTyxJQUFJO0lBNEVoQixpQ0FBaUM7SUFDakMsWUFBYSxJQUFjLEVBQUUsUUFBa0IsRUFBRSxNQUFZO1FBbkU3RCwyQ0FBMkM7UUFDM0MsYUFBUSxHQUFHLElBQUksS0FBSyxFQUFRLENBQUM7UUFFN0IsK0JBQStCO1FBQy9CLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFFTiwrQkFBK0I7UUFDL0IsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUVOLHdEQUF3RDtRQUN4RCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWIsd0JBQXdCO1FBQ3hCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWCx3QkFBd0I7UUFDeEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUVYLHdCQUF3QjtRQUN4QixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRVgsd0JBQXdCO1FBQ3hCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWCx1Q0FBdUM7UUFDdkMsT0FBRSxHQUFHLENBQUMsQ0FBQztRQUVQLHVDQUF1QztRQUN2QyxPQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRVAsZ0VBQWdFO1FBQ2hFLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFFZCxnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVaLGdDQUFnQztRQUNoQyxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBRVosZ0NBQWdDO1FBQ2hDLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFFWixnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVaLHlIQUF5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QyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUMvRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDbkgsT0FBTztTQUNQO1FBQ0QsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2RSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFO1lBQzFCLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNyRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7U0FDdkQ7YUFBTTtZQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1NBQzVEO0lBQ0YsQ0FBQztJQUVELGlGQUFpRjtJQUNqRixZQUFZLENBQUUsS0FBYztRQUMzQixJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekQsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3BELEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUNwRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsWUFBWSxDQUFFLEtBQWM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDaEQsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2hELE9BQU8sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxvQkFBb0IsQ0FBRSxhQUFxQjtRQUMxQyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzlILENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsb0JBQW9CLENBQUUsYUFBcUI7UUFDMUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDaEcsQ0FBQztJQUVEOzs7NERBR3dEO0lBQ3hELFdBQVcsQ0FBRSxPQUFlO1FBQzNCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkQsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0QifQ==
1
+ /******************************************************************************
2
+ * Spine Runtimes License Agreement
3
+ * Last updated September 24, 2021. Replaces all prior versions.
4
+ *
5
+ * Copyright (c) 2013-2021, 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 { TransformMode } from "./BoneData";
30
+ import { MathUtils } from "./Utils";
31
+ /** Stores a bone's current pose.
32
+ *
33
+ * A bone has a local transform which is used to compute its world transform. A bone also has an applied transform, which is a
34
+ * local transform that can be applied to compute the world transform. The local transform and applied transform may differ if a
35
+ * constraint or application code modifies the world transform after it was computed from the local transform. */
36
+ export class Bone {
37
+ /** @param parent May be null. */
38
+ constructor(data, skeleton, parent) {
39
+ /** The bone's setup pose data. */
40
+ this.data = null;
41
+ /** The skeleton this bone belongs to. */
42
+ this.skeleton = null;
43
+ /** The parent bone, or null if this is the root bone. */
44
+ this.parent = null;
45
+ /** The immediate children of this bone. */
46
+ this.children = new Array();
47
+ /** The local x translation. */
48
+ this.x = 0;
49
+ /** The local y translation. */
50
+ this.y = 0;
51
+ /** The local rotation in degrees, counter clockwise. */
52
+ this.rotation = 0;
53
+ /** The local scaleX. */
54
+ this.scaleX = 0;
55
+ /** The local scaleY. */
56
+ this.scaleY = 0;
57
+ /** The local shearX. */
58
+ this.shearX = 0;
59
+ /** The local shearY. */
60
+ this.shearY = 0;
61
+ /** The applied local x translation. */
62
+ this.ax = 0;
63
+ /** The applied local y translation. */
64
+ this.ay = 0;
65
+ /** The applied local rotation in degrees, counter clockwise. */
66
+ this.arotation = 0;
67
+ /** The applied local scaleX. */
68
+ this.ascaleX = 0;
69
+ /** The applied local scaleY. */
70
+ this.ascaleY = 0;
71
+ /** The applied local shearX. */
72
+ this.ashearX = 0;
73
+ /** The applied local shearY. */
74
+ this.ashearY = 0;
75
+ /** Part of the world transform matrix for the X axis. If changed, {@link #updateAppliedTransform()} should be called. */
76
+ this.a = 0;
77
+ /** Part of the world transform matrix for the Y axis. If changed, {@link #updateAppliedTransform()} should be called. */
78
+ this.b = 0;
79
+ /** Part of the world transform matrix for the X axis. If changed, {@link #updateAppliedTransform()} should be called. */
80
+ this.c = 0;
81
+ /** Part of the world transform matrix for the Y axis. If changed, {@link #updateAppliedTransform()} should be called. */
82
+ this.d = 0;
83
+ /** The world X position. If changed, {@link #updateAppliedTransform()} should be called. */
84
+ this.worldY = 0;
85
+ /** The world Y position. If changed, {@link #updateAppliedTransform()} should be called. */
86
+ this.worldX = 0;
87
+ this.sorted = false;
88
+ this.active = false;
89
+ if (!data)
90
+ throw new Error("data cannot be null.");
91
+ if (!skeleton)
92
+ throw new Error("skeleton cannot be null.");
93
+ this.data = data;
94
+ this.skeleton = skeleton;
95
+ this.parent = parent;
96
+ this.setToSetupPose();
97
+ }
98
+ /** Returns false when the bone has not been computed because {@link BoneData#skinRequired} is true and the
99
+ * {@link Skeleton#skin active skin} does not {@link Skin#bones contain} this bone. */
100
+ isActive() {
101
+ return this.active;
102
+ }
103
+ /** Computes the world transform using the parent bone and this bone's local applied transform. */
104
+ update() {
105
+ this.updateWorldTransformWith(this.ax, this.ay, this.arotation, this.ascaleX, this.ascaleY, this.ashearX, this.ashearY);
106
+ }
107
+ /** Computes the world transform using the parent bone and this bone's local transform.
108
+ *
109
+ * See {@link #updateWorldTransformWith()}. */
110
+ updateWorldTransform() {
111
+ this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY);
112
+ }
113
+ /** Computes the world transform using the parent bone and the specified local transform. The applied transform is set to the
114
+ * specified local transform. Child bones are not updated.
115
+ *
116
+ * See [World transforms](http://esotericsoftware.com/spine-runtime-skeletons#World-transforms) in the Spine
117
+ * Runtimes Guide. */
118
+ updateWorldTransformWith(x, y, rotation, scaleX, scaleY, shearX, shearY) {
119
+ this.ax = x;
120
+ this.ay = y;
121
+ this.arotation = rotation;
122
+ this.ascaleX = scaleX;
123
+ this.ascaleY = scaleY;
124
+ this.ashearX = shearX;
125
+ this.ashearY = shearY;
126
+ let parent = this.parent;
127
+ if (!parent) { // Root bone.
128
+ let skeleton = this.skeleton;
129
+ let rotationY = rotation + 90 + shearY;
130
+ let sx = skeleton.scaleX;
131
+ let sy = skeleton.scaleY;
132
+ this.a = MathUtils.cosDeg(rotation + shearX) * scaleX * sx;
133
+ this.b = MathUtils.cosDeg(rotationY) * scaleY * sx;
134
+ this.c = MathUtils.sinDeg(rotation + shearX) * scaleX * sy;
135
+ this.d = MathUtils.sinDeg(rotationY) * scaleY * sy;
136
+ this.worldX = x * sx + skeleton.x;
137
+ this.worldY = y * sy + skeleton.y;
138
+ return;
139
+ }
140
+ let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
141
+ this.worldX = pa * x + pb * y + parent.worldX;
142
+ this.worldY = pc * x + pd * y + parent.worldY;
143
+ switch (this.data.transformMode) {
144
+ case TransformMode.Normal: {
145
+ let rotationY = rotation + 90 + shearY;
146
+ let la = MathUtils.cosDeg(rotation + shearX) * scaleX;
147
+ let lb = MathUtils.cosDeg(rotationY) * scaleY;
148
+ let lc = MathUtils.sinDeg(rotation + shearX) * scaleX;
149
+ let ld = MathUtils.sinDeg(rotationY) * scaleY;
150
+ this.a = pa * la + pb * lc;
151
+ this.b = pa * lb + pb * ld;
152
+ this.c = pc * la + pd * lc;
153
+ this.d = pc * lb + pd * ld;
154
+ return;
155
+ }
156
+ case TransformMode.OnlyTranslation: {
157
+ let rotationY = rotation + 90 + shearY;
158
+ this.a = MathUtils.cosDeg(rotation + shearX) * scaleX;
159
+ this.b = MathUtils.cosDeg(rotationY) * scaleY;
160
+ this.c = MathUtils.sinDeg(rotation + shearX) * scaleX;
161
+ this.d = MathUtils.sinDeg(rotationY) * scaleY;
162
+ break;
163
+ }
164
+ case TransformMode.NoRotationOrReflection: {
165
+ let s = pa * pa + pc * pc;
166
+ let prx = 0;
167
+ if (s > 0.0001) {
168
+ s = Math.abs(pa * pd - pb * pc) / s;
169
+ pa /= this.skeleton.scaleX;
170
+ pc /= this.skeleton.scaleY;
171
+ pb = pc * s;
172
+ pd = pa * s;
173
+ prx = Math.atan2(pc, pa) * MathUtils.radDeg;
174
+ }
175
+ else {
176
+ pa = 0;
177
+ pc = 0;
178
+ prx = 90 - Math.atan2(pd, pb) * MathUtils.radDeg;
179
+ }
180
+ let rx = rotation + shearX - prx;
181
+ let ry = rotation + shearY - prx + 90;
182
+ let la = MathUtils.cosDeg(rx) * scaleX;
183
+ let lb = MathUtils.cosDeg(ry) * scaleY;
184
+ let lc = MathUtils.sinDeg(rx) * scaleX;
185
+ let ld = MathUtils.sinDeg(ry) * scaleY;
186
+ this.a = pa * la - pb * lc;
187
+ this.b = pa * lb - pb * ld;
188
+ this.c = pc * la + pd * lc;
189
+ this.d = pc * lb + pd * ld;
190
+ break;
191
+ }
192
+ case TransformMode.NoScale:
193
+ case TransformMode.NoScaleOrReflection: {
194
+ let cos = MathUtils.cosDeg(rotation);
195
+ let sin = MathUtils.sinDeg(rotation);
196
+ let za = (pa * cos + pb * sin) / this.skeleton.scaleX;
197
+ let zc = (pc * cos + pd * sin) / this.skeleton.scaleY;
198
+ let s = Math.sqrt(za * za + zc * zc);
199
+ if (s > 0.00001)
200
+ s = 1 / s;
201
+ za *= s;
202
+ zc *= s;
203
+ s = Math.sqrt(za * za + zc * zc);
204
+ if (this.data.transformMode == TransformMode.NoScale
205
+ && (pa * pd - pb * pc < 0) != (this.skeleton.scaleX < 0 != this.skeleton.scaleY < 0))
206
+ s = -s;
207
+ let r = Math.PI / 2 + Math.atan2(zc, za);
208
+ let zb = Math.cos(r) * s;
209
+ let zd = Math.sin(r) * s;
210
+ let la = MathUtils.cosDeg(shearX) * scaleX;
211
+ let lb = MathUtils.cosDeg(90 + shearY) * scaleY;
212
+ let lc = MathUtils.sinDeg(shearX) * scaleX;
213
+ let ld = MathUtils.sinDeg(90 + shearY) * scaleY;
214
+ this.a = za * la + zb * lc;
215
+ this.b = za * lb + zb * ld;
216
+ this.c = zc * la + zd * lc;
217
+ this.d = zc * lb + zd * ld;
218
+ break;
219
+ }
220
+ }
221
+ this.a *= this.skeleton.scaleX;
222
+ this.b *= this.skeleton.scaleX;
223
+ this.c *= this.skeleton.scaleY;
224
+ this.d *= this.skeleton.scaleY;
225
+ }
226
+ /** Sets this bone's local transform to the setup pose. */
227
+ setToSetupPose() {
228
+ let data = this.data;
229
+ this.x = data.x;
230
+ this.y = data.y;
231
+ this.rotation = data.rotation;
232
+ this.scaleX = data.scaleX;
233
+ this.scaleY = data.scaleY;
234
+ this.shearX = data.shearX;
235
+ this.shearY = data.shearY;
236
+ }
237
+ /** The world rotation for the X axis, calculated using {@link #a} and {@link #c}. */
238
+ getWorldRotationX() {
239
+ return Math.atan2(this.c, this.a) * MathUtils.radDeg;
240
+ }
241
+ /** The world rotation for the Y axis, calculated using {@link #b} and {@link #d}. */
242
+ getWorldRotationY() {
243
+ return Math.atan2(this.d, this.b) * MathUtils.radDeg;
244
+ }
245
+ /** The magnitude (always positive) of the world scale X, calculated using {@link #a} and {@link #c}. */
246
+ getWorldScaleX() {
247
+ return Math.sqrt(this.a * this.a + this.c * this.c);
248
+ }
249
+ /** The magnitude (always positive) of the world scale Y, calculated using {@link #b} and {@link #d}. */
250
+ getWorldScaleY() {
251
+ return Math.sqrt(this.b * this.b + this.d * this.d);
252
+ }
253
+ /** Computes the applied transform values from the world transform.
254
+ *
255
+ * If the world transform is modified (by a constraint, {@link #rotateWorld(float)}, etc) then this method should be called so
256
+ * the applied transform matches the world transform. The applied transform may be needed by other code (eg to apply other
257
+ * constraints).
258
+ *
259
+ * Some information is ambiguous in the world transform, such as -1,-1 scale versus 180 rotation. The applied transform after
260
+ * calling this method is equivalent to the local transform used to compute the world transform, but may not be identical. */
261
+ updateAppliedTransform() {
262
+ let parent = this.parent;
263
+ if (!parent) {
264
+ this.ax = this.worldX - this.skeleton.x;
265
+ this.ay = this.worldY - this.skeleton.y;
266
+ this.arotation = Math.atan2(this.c, this.a) * MathUtils.radDeg;
267
+ this.ascaleX = Math.sqrt(this.a * this.a + this.c * this.c);
268
+ this.ascaleY = Math.sqrt(this.b * this.b + this.d * this.d);
269
+ this.ashearX = 0;
270
+ this.ashearY = Math.atan2(this.a * this.b + this.c * this.d, this.a * this.d - this.b * this.c) * MathUtils.radDeg;
271
+ return;
272
+ }
273
+ let pa = parent.a, pb = parent.b, pc = parent.c, pd = parent.d;
274
+ let pid = 1 / (pa * pd - pb * pc);
275
+ let dx = this.worldX - parent.worldX, dy = this.worldY - parent.worldY;
276
+ this.ax = (dx * pd * pid - dy * pb * pid);
277
+ this.ay = (dy * pa * pid - dx * pc * pid);
278
+ let ia = pid * pd;
279
+ let id = pid * pa;
280
+ let ib = pid * pb;
281
+ let ic = pid * pc;
282
+ let ra = ia * this.a - ib * this.c;
283
+ let rb = ia * this.b - ib * this.d;
284
+ let rc = id * this.c - ic * this.a;
285
+ let rd = id * this.d - ic * this.b;
286
+ this.ashearX = 0;
287
+ this.ascaleX = Math.sqrt(ra * ra + rc * rc);
288
+ if (this.ascaleX > 0.0001) {
289
+ let det = ra * rd - rb * rc;
290
+ this.ascaleY = det / this.ascaleX;
291
+ this.ashearY = Math.atan2(ra * rb + rc * rd, det) * MathUtils.radDeg;
292
+ this.arotation = Math.atan2(rc, ra) * MathUtils.radDeg;
293
+ }
294
+ else {
295
+ this.ascaleX = 0;
296
+ this.ascaleY = Math.sqrt(rb * rb + rd * rd);
297
+ this.ashearY = 0;
298
+ this.arotation = 90 - Math.atan2(rd, rb) * MathUtils.radDeg;
299
+ }
300
+ }
301
+ /** Transforms a point from world coordinates to the bone's local coordinates. */
302
+ worldToLocal(world) {
303
+ let invDet = 1 / (this.a * this.d - this.b * this.c);
304
+ let x = world.x - this.worldX, y = world.y - this.worldY;
305
+ world.x = x * this.d * invDet - y * this.b * invDet;
306
+ world.y = y * this.a * invDet - x * this.c * invDet;
307
+ return world;
308
+ }
309
+ /** Transforms a point from the bone's local coordinates to world coordinates. */
310
+ localToWorld(local) {
311
+ let x = local.x, y = local.y;
312
+ local.x = x * this.a + y * this.b + this.worldX;
313
+ local.y = x * this.c + y * this.d + this.worldY;
314
+ return local;
315
+ }
316
+ /** Transforms a world rotation to a local rotation. */
317
+ worldToLocalRotation(worldRotation) {
318
+ let sin = MathUtils.sinDeg(worldRotation), cos = MathUtils.cosDeg(worldRotation);
319
+ return Math.atan2(this.a * sin - this.c * cos, this.d * cos - this.b * sin) * MathUtils.radDeg + this.rotation - this.shearX;
320
+ }
321
+ /** Transforms a local rotation to a world rotation. */
322
+ localToWorldRotation(localRotation) {
323
+ localRotation -= this.rotation - this.shearX;
324
+ let sin = MathUtils.sinDeg(localRotation), cos = MathUtils.cosDeg(localRotation);
325
+ return Math.atan2(cos * this.c + sin * this.d, cos * this.a + sin * this.b) * MathUtils.radDeg;
326
+ }
327
+ /** Rotates the world transform the specified amount.
328
+ * <p>
329
+ * After changes are made to the world transform, {@link #updateAppliedTransform()} should be called and {@link #update()} will
330
+ * need to be called on any child bones, recursively. */
331
+ rotateWorld(degrees) {
332
+ let a = this.a, b = this.b, c = this.c, d = this.d;
333
+ let cos = MathUtils.cosDeg(degrees), sin = MathUtils.sinDeg(degrees);
334
+ this.a = cos * a - sin * c;
335
+ this.b = cos * b - sin * d;
336
+ this.c = sin * a + cos * c;
337
+ this.d = sin * b + cos * d;
338
+ }
339
+ }
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Cb25lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3JELE9BQU8sRUFBRSxTQUFTLEVBQVcsTUFBTSxTQUFTLENBQUM7QUFFN0M7Ozs7aUhBSWlIO0FBQ2pILE1BQU0sT0FBTyxJQUFJO0lBNEVoQixpQ0FBaUM7SUFDakMsWUFBYSxJQUFjLEVBQUUsUUFBa0IsRUFBRSxNQUFZO1FBNUU3RCxrQ0FBa0M7UUFDbEMsU0FBSSxHQUFhLElBQUksQ0FBQztRQUV0Qix5Q0FBeUM7UUFDekMsYUFBUSxHQUFhLElBQUksQ0FBQztRQUUxQix5REFBeUQ7UUFDekQsV0FBTSxHQUFTLElBQUksQ0FBQztRQUVwQiwyQ0FBMkM7UUFDM0MsYUFBUSxHQUFHLElBQUksS0FBSyxFQUFRLENBQUM7UUFFN0IsK0JBQStCO1FBQy9CLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFFTiwrQkFBK0I7UUFDL0IsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUVOLHdEQUF3RDtRQUN4RCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRWIsd0JBQXdCO1FBQ3hCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWCx3QkFBd0I7UUFDeEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUVYLHdCQUF3QjtRQUN4QixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRVgsd0JBQXdCO1FBQ3hCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFFWCx1Q0FBdUM7UUFDdkMsT0FBRSxHQUFHLENBQUMsQ0FBQztRQUVQLHVDQUF1QztRQUN2QyxPQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRVAsZ0VBQWdFO1FBQ2hFLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFFZCxnQ0FBZ0M7UUFDaEMsWUFBTyxHQUFHLENBQUMsQ0FBQztRQUVaLGdD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QUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQztnQkFDdkMsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3ZDLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDM0IsTUFBTTthQUNOO1lBQ0QsS0FBSyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQzNCLEtBQUssYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3ZDLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RELElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJ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Q0FBQztRQUNsQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2RSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxFQUFFO1lBQzFCLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNyRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7U0FDdkQ7YUFBTTtZQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1NBQzVEO0lBQ0YsQ0FBQztJQUVELGlGQUFpRjtJQUNqRixZQUFZLENBQUUsS0FBYztRQUMzQixJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENB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