@esotericsoftware/spine-core 4.1.25 → 4.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/Animation.d.ts +382 -0
- package/dist/Animation.js +2052 -0
- package/dist/AnimationState.d.ts +398 -0
- package/dist/AnimationState.js +1096 -0
- package/dist/AnimationStateData.d.ts +51 -0
- package/dist/AnimationStateData.js +70 -0
- package/dist/AssetManagerBase.d.ts +75 -0
- package/dist/AssetManagerBase.js +320 -0
- package/dist/AtlasAttachmentLoader.d.ts +53 -0
- package/dist/AtlasAttachmentLoader.js +92 -0
- package/dist/Bone.d.ts +138 -0
- package/dist/Bone.js +336 -0
- package/dist/BoneData.d.ts +72 -0
- package/dist/BoneData.js +80 -0
- package/dist/ConstraintData.d.ts +35 -0
- package/dist/ConstraintData.js +37 -0
- package/dist/Event.d.ts +44 -0
- package/dist/Event.js +48 -0
- package/dist/EventData.d.ts +41 -0
- package/dist/EventData.js +43 -0
- package/dist/IkConstraint.d.ts +64 -0
- package/dist/IkConstraint.js +303 -0
- package/dist/IkConstraintData.d.ts +56 -0
- package/dist/IkConstraintData.js +63 -0
- package/dist/PathConstraint.d.ts +71 -0
- package/dist/PathConstraint.js +476 -0
- package/dist/PathConstraintData.d.ts +82 -0
- package/dist/PathConstraintData.js +91 -0
- package/dist/Skeleton.d.ts +163 -0
- package/dist/Skeleton.js +588 -0
- package/dist/SkeletonBinary.d.ts +68 -0
- package/dist/SkeletonBinary.js +1172 -0
- package/dist/SkeletonBounds.d.ts +77 -0
- package/dist/SkeletonBounds.js +219 -0
- package/dist/SkeletonClipping.d.ts +50 -0
- package/dist/SkeletonClipping.js +326 -0
- package/dist/SkeletonData.d.ts +114 -0
- package/dist/SkeletonData.js +190 -0
- package/dist/SkeletonJson.d.ts +53 -0
- package/dist/SkeletonJson.js +1027 -0
- package/dist/Skin.d.ts +71 -0
- package/dist/Skin.js +201 -0
- package/dist/Slot.d.ts +69 -0
- package/dist/Slot.js +93 -0
- package/dist/SlotData.d.ts +57 -0
- package/dist/SlotData.js +64 -0
- package/dist/Texture.d.ts +69 -0
- package/dist/Texture.js +73 -0
- package/dist/TextureAtlas.d.ts +68 -0
- package/dist/TextureAtlas.js +267 -0
- package/dist/TransformConstraint.d.ts +60 -0
- package/dist/TransformConstraint.js +247 -0
- package/dist/TransformConstraintData.d.ts +62 -0
- package/dist/TransformConstraintData.js +69 -0
- package/dist/Triangulator.d.ts +43 -0
- package/dist/Triangulator.js +244 -0
- package/dist/Updatable.d.ts +37 -0
- package/dist/Updatable.js +30 -0
- package/dist/Utils.d.ts +168 -0
- package/dist/Utils.js +404 -0
- package/dist/attachments/Attachment.d.ts +72 -0
- package/dist/attachments/Attachment.js +147 -0
- package/dist/attachments/AttachmentLoader.d.ts +54 -0
- package/dist/attachments/AttachmentLoader.js +30 -0
- package/dist/attachments/BoundingBoxAttachment.d.ts +40 -0
- package/dist/attachments/BoundingBoxAttachment.js +48 -0
- package/dist/attachments/ClippingAttachment.d.ts +42 -0
- package/dist/attachments/ClippingAttachment.js +51 -0
- package/dist/attachments/HasTextureRegion.d.ts +44 -0
- package/dist/attachments/HasTextureRegion.js +30 -0
- package/dist/attachments/MeshAttachment.d.ts +79 -0
- package/dist/attachments/MeshAttachment.js +188 -0
- package/dist/attachments/PathAttachment.d.ts +47 -0
- package/dist/attachments/PathAttachment.js +59 -0
- package/dist/attachments/PointAttachment.d.ts +48 -0
- package/dist/attachments/PointAttachment.js +66 -0
- package/dist/attachments/RegionAttachment.d.ts +110 -0
- package/dist/attachments/RegionAttachment.js +213 -0
- package/dist/attachments/Sequence.d.ts +55 -0
- package/dist/attachments/Sequence.js +91 -0
- package/dist/attachments/index.d.ts +8 -0
- package/dist/attachments/index.js +9 -0
- package/dist/iife/spine-core.js +10708 -0
- package/dist/iife/spine-core.js.map +7 -0
- package/dist/iife/spine-core.min.js +2 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +40 -0
- package/dist/polyfills.d.ts +29 -0
- package/dist/polyfills.js +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,244 @@
|
|
|
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 { Pool } from "./Utils";
|
|
30
|
+
export class Triangulator {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.convexPolygons = new Array();
|
|
33
|
+
this.convexPolygonsIndices = new Array();
|
|
34
|
+
this.indicesArray = new Array();
|
|
35
|
+
this.isConcaveArray = new Array();
|
|
36
|
+
this.triangles = new Array();
|
|
37
|
+
this.polygonPool = new Pool(() => {
|
|
38
|
+
return new Array();
|
|
39
|
+
});
|
|
40
|
+
this.polygonIndicesPool = new Pool(() => {
|
|
41
|
+
return new Array();
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
triangulate(verticesArray) {
|
|
45
|
+
let vertices = verticesArray;
|
|
46
|
+
let vertexCount = verticesArray.length >> 1;
|
|
47
|
+
let indices = this.indicesArray;
|
|
48
|
+
indices.length = 0;
|
|
49
|
+
for (let i = 0; i < vertexCount; i++)
|
|
50
|
+
indices[i] = i;
|
|
51
|
+
let isConcave = this.isConcaveArray;
|
|
52
|
+
isConcave.length = 0;
|
|
53
|
+
for (let i = 0, n = vertexCount; i < n; ++i)
|
|
54
|
+
isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices);
|
|
55
|
+
let triangles = this.triangles;
|
|
56
|
+
triangles.length = 0;
|
|
57
|
+
while (vertexCount > 3) {
|
|
58
|
+
// Find ear tip.
|
|
59
|
+
let previous = vertexCount - 1, i = 0, next = 1;
|
|
60
|
+
while (true) {
|
|
61
|
+
outer: if (!isConcave[i]) {
|
|
62
|
+
let p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1;
|
|
63
|
+
let p1x = vertices[p1], p1y = vertices[p1 + 1];
|
|
64
|
+
let p2x = vertices[p2], p2y = vertices[p2 + 1];
|
|
65
|
+
let p3x = vertices[p3], p3y = vertices[p3 + 1];
|
|
66
|
+
for (let ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) {
|
|
67
|
+
if (!isConcave[ii])
|
|
68
|
+
continue;
|
|
69
|
+
let v = indices[ii] << 1;
|
|
70
|
+
let vx = vertices[v], vy = vertices[v + 1];
|
|
71
|
+
if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) {
|
|
72
|
+
if (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) {
|
|
73
|
+
if (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy))
|
|
74
|
+
break outer;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (next == 0) {
|
|
81
|
+
do {
|
|
82
|
+
if (!isConcave[i])
|
|
83
|
+
break;
|
|
84
|
+
i--;
|
|
85
|
+
} while (i > 0);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
previous = i;
|
|
89
|
+
i = next;
|
|
90
|
+
next = (next + 1) % vertexCount;
|
|
91
|
+
}
|
|
92
|
+
// Cut ear tip.
|
|
93
|
+
triangles.push(indices[(vertexCount + i - 1) % vertexCount]);
|
|
94
|
+
triangles.push(indices[i]);
|
|
95
|
+
triangles.push(indices[(i + 1) % vertexCount]);
|
|
96
|
+
indices.splice(i, 1);
|
|
97
|
+
isConcave.splice(i, 1);
|
|
98
|
+
vertexCount--;
|
|
99
|
+
let previousIndex = (vertexCount + i - 1) % vertexCount;
|
|
100
|
+
let nextIndex = i == vertexCount ? 0 : i;
|
|
101
|
+
isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices);
|
|
102
|
+
isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices);
|
|
103
|
+
}
|
|
104
|
+
if (vertexCount == 3) {
|
|
105
|
+
triangles.push(indices[2]);
|
|
106
|
+
triangles.push(indices[0]);
|
|
107
|
+
triangles.push(indices[1]);
|
|
108
|
+
}
|
|
109
|
+
return triangles;
|
|
110
|
+
}
|
|
111
|
+
decompose(verticesArray, triangles) {
|
|
112
|
+
let vertices = verticesArray;
|
|
113
|
+
let convexPolygons = this.convexPolygons;
|
|
114
|
+
this.polygonPool.freeAll(convexPolygons);
|
|
115
|
+
convexPolygons.length = 0;
|
|
116
|
+
let convexPolygonsIndices = this.convexPolygonsIndices;
|
|
117
|
+
this.polygonIndicesPool.freeAll(convexPolygonsIndices);
|
|
118
|
+
convexPolygonsIndices.length = 0;
|
|
119
|
+
let polygonIndices = this.polygonIndicesPool.obtain();
|
|
120
|
+
polygonIndices.length = 0;
|
|
121
|
+
let polygon = this.polygonPool.obtain();
|
|
122
|
+
polygon.length = 0;
|
|
123
|
+
// Merge subsequent triangles if they form a triangle fan.
|
|
124
|
+
let fanBaseIndex = -1, lastWinding = 0;
|
|
125
|
+
for (let i = 0, n = triangles.length; i < n; i += 3) {
|
|
126
|
+
let t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1;
|
|
127
|
+
let x1 = vertices[t1], y1 = vertices[t1 + 1];
|
|
128
|
+
let x2 = vertices[t2], y2 = vertices[t2 + 1];
|
|
129
|
+
let x3 = vertices[t3], y3 = vertices[t3 + 1];
|
|
130
|
+
// If the base of the last triangle is the same as this triangle, check if they form a convex polygon (triangle fan).
|
|
131
|
+
let merged = false;
|
|
132
|
+
if (fanBaseIndex == t1) {
|
|
133
|
+
let o = polygon.length - 4;
|
|
134
|
+
let winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3);
|
|
135
|
+
let winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]);
|
|
136
|
+
if (winding1 == lastWinding && winding2 == lastWinding) {
|
|
137
|
+
polygon.push(x3);
|
|
138
|
+
polygon.push(y3);
|
|
139
|
+
polygonIndices.push(t3);
|
|
140
|
+
merged = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Otherwise make this triangle the new base.
|
|
144
|
+
if (!merged) {
|
|
145
|
+
if (polygon.length > 0) {
|
|
146
|
+
convexPolygons.push(polygon);
|
|
147
|
+
convexPolygonsIndices.push(polygonIndices);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this.polygonPool.free(polygon);
|
|
151
|
+
this.polygonIndicesPool.free(polygonIndices);
|
|
152
|
+
}
|
|
153
|
+
polygon = this.polygonPool.obtain();
|
|
154
|
+
polygon.length = 0;
|
|
155
|
+
polygon.push(x1);
|
|
156
|
+
polygon.push(y1);
|
|
157
|
+
polygon.push(x2);
|
|
158
|
+
polygon.push(y2);
|
|
159
|
+
polygon.push(x3);
|
|
160
|
+
polygon.push(y3);
|
|
161
|
+
polygonIndices = this.polygonIndicesPool.obtain();
|
|
162
|
+
polygonIndices.length = 0;
|
|
163
|
+
polygonIndices.push(t1);
|
|
164
|
+
polygonIndices.push(t2);
|
|
165
|
+
polygonIndices.push(t3);
|
|
166
|
+
lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3);
|
|
167
|
+
fanBaseIndex = t1;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (polygon.length > 0) {
|
|
171
|
+
convexPolygons.push(polygon);
|
|
172
|
+
convexPolygonsIndices.push(polygonIndices);
|
|
173
|
+
}
|
|
174
|
+
// Go through the list of polygons and try to merge the remaining triangles with the found triangle fans.
|
|
175
|
+
for (let i = 0, n = convexPolygons.length; i < n; i++) {
|
|
176
|
+
polygonIndices = convexPolygonsIndices[i];
|
|
177
|
+
if (polygonIndices.length == 0)
|
|
178
|
+
continue;
|
|
179
|
+
let firstIndex = polygonIndices[0];
|
|
180
|
+
let lastIndex = polygonIndices[polygonIndices.length - 1];
|
|
181
|
+
polygon = convexPolygons[i];
|
|
182
|
+
let o = polygon.length - 4;
|
|
183
|
+
let prevPrevX = polygon[o], prevPrevY = polygon[o + 1];
|
|
184
|
+
let prevX = polygon[o + 2], prevY = polygon[o + 3];
|
|
185
|
+
let firstX = polygon[0], firstY = polygon[1];
|
|
186
|
+
let secondX = polygon[2], secondY = polygon[3];
|
|
187
|
+
let winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY);
|
|
188
|
+
for (let ii = 0; ii < n; ii++) {
|
|
189
|
+
if (ii == i)
|
|
190
|
+
continue;
|
|
191
|
+
let otherIndices = convexPolygonsIndices[ii];
|
|
192
|
+
if (otherIndices.length != 3)
|
|
193
|
+
continue;
|
|
194
|
+
let otherFirstIndex = otherIndices[0];
|
|
195
|
+
let otherSecondIndex = otherIndices[1];
|
|
196
|
+
let otherLastIndex = otherIndices[2];
|
|
197
|
+
let otherPoly = convexPolygons[ii];
|
|
198
|
+
let x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1];
|
|
199
|
+
if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex)
|
|
200
|
+
continue;
|
|
201
|
+
let winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3);
|
|
202
|
+
let winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY);
|
|
203
|
+
if (winding1 == winding && winding2 == winding) {
|
|
204
|
+
otherPoly.length = 0;
|
|
205
|
+
otherIndices.length = 0;
|
|
206
|
+
polygon.push(x3);
|
|
207
|
+
polygon.push(y3);
|
|
208
|
+
polygonIndices.push(otherLastIndex);
|
|
209
|
+
prevPrevX = prevX;
|
|
210
|
+
prevPrevY = prevY;
|
|
211
|
+
prevX = x3;
|
|
212
|
+
prevY = y3;
|
|
213
|
+
ii = 0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Remove empty polygons that resulted from the merge step above.
|
|
218
|
+
for (let i = convexPolygons.length - 1; i >= 0; i--) {
|
|
219
|
+
polygon = convexPolygons[i];
|
|
220
|
+
if (polygon.length == 0) {
|
|
221
|
+
convexPolygons.splice(i, 1);
|
|
222
|
+
this.polygonPool.free(polygon);
|
|
223
|
+
polygonIndices = convexPolygonsIndices[i];
|
|
224
|
+
convexPolygonsIndices.splice(i, 1);
|
|
225
|
+
this.polygonIndicesPool.free(polygonIndices);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return convexPolygons;
|
|
229
|
+
}
|
|
230
|
+
static isConcave(index, vertexCount, vertices, indices) {
|
|
231
|
+
let previous = indices[(vertexCount + index - 1) % vertexCount] << 1;
|
|
232
|
+
let current = indices[index] << 1;
|
|
233
|
+
let next = indices[(index + 1) % vertexCount] << 1;
|
|
234
|
+
return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]);
|
|
235
|
+
}
|
|
236
|
+
static positiveArea(p1x, p1y, p2x, p2y, p3x, p3y) {
|
|
237
|
+
return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0;
|
|
238
|
+
}
|
|
239
|
+
static winding(p1x, p1y, p2x, p2y, p3x, p3y) {
|
|
240
|
+
let px = p2x - p1x, py = p2y - p1y;
|
|
241
|
+
return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJpYW5ndWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1RyaWFuZ3VsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFtQixJQUFJLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEQsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFDUyxtQkFBYyxHQUFHLElBQUksS0FBSyxFQUFpQixDQUFDO1FBQzVDLDBCQUFxQixHQUFHLElBQUksS0FBSyxFQUFpQixDQUFDO1FBRW5ELGlCQUFZLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNuQyxtQkFBYyxHQUFHLElBQUksS0FBSyxFQUFXLENBQUM7UUFDdEMsY0FBUyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFFaEMsZ0JBQVcsR0FBRyxJQUFJLElBQUksQ0FBZ0IsR0FBRyxFQUFFO1lBQ2xELE9BQU8sSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUVLLHVCQUFrQixHQUFHLElBQUksSUFBSSxDQUFnQixHQUFHLEVBQUU7WUFDekQsT0FBTyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBK05KLENBQUM7SUE3Tk8sV0FBVyxDQUFFLGFBQThCO1FBQ2pELElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUM3QixJQUFJLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUU1QyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFF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
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
/** The interface for items updated by {@link Skeleton#updateWorldTransform()}. */
|
|
30
|
+
export interface Updatable {
|
|
31
|
+
update(): void;
|
|
32
|
+
/** Returns false when this item has not been updated because a skin is required and the {@link Skeleton#skin active skin}
|
|
33
|
+
* does not contain this item.
|
|
34
|
+
* @see Skin#getBones()
|
|
35
|
+
* @see Skin#getConstraints() */
|
|
36
|
+
isActive(): boolean;
|
|
37
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1VwZGF0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0UifQ==
|
package/dist/Utils.d.ts
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
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 { Skeleton } from "./Skeleton";
|
|
30
|
+
import { MixBlend } from "./Animation";
|
|
31
|
+
export interface StringMap<T> {
|
|
32
|
+
[key: string]: T;
|
|
33
|
+
}
|
|
34
|
+
export declare class IntSet {
|
|
35
|
+
array: (number | undefined)[];
|
|
36
|
+
add(value: number): boolean;
|
|
37
|
+
contains(value: number): boolean;
|
|
38
|
+
remove(value: number): void;
|
|
39
|
+
clear(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare class StringSet {
|
|
42
|
+
entries: StringMap<boolean>;
|
|
43
|
+
size: number;
|
|
44
|
+
add(value: string): boolean;
|
|
45
|
+
addAll(values: string[]): boolean;
|
|
46
|
+
contains(value: string): boolean;
|
|
47
|
+
clear(): void;
|
|
48
|
+
}
|
|
49
|
+
export interface NumberArrayLike {
|
|
50
|
+
readonly length: number;
|
|
51
|
+
[n: number]: number;
|
|
52
|
+
}
|
|
53
|
+
export interface Disposable {
|
|
54
|
+
dispose(): void;
|
|
55
|
+
}
|
|
56
|
+
export interface Restorable {
|
|
57
|
+
restore(): void;
|
|
58
|
+
}
|
|
59
|
+
export declare class Color {
|
|
60
|
+
r: number;
|
|
61
|
+
g: number;
|
|
62
|
+
b: number;
|
|
63
|
+
a: number;
|
|
64
|
+
static WHITE: Color;
|
|
65
|
+
static RED: Color;
|
|
66
|
+
static GREEN: Color;
|
|
67
|
+
static BLUE: Color;
|
|
68
|
+
static MAGENTA: Color;
|
|
69
|
+
constructor(r?: number, g?: number, b?: number, a?: number);
|
|
70
|
+
set(r: number, g: number, b: number, a: number): this;
|
|
71
|
+
setFromColor(c: Color): this;
|
|
72
|
+
setFromString(hex: string): this;
|
|
73
|
+
add(r: number, g: number, b: number, a: number): this;
|
|
74
|
+
clamp(): this;
|
|
75
|
+
static rgba8888ToColor(color: Color, value: number): void;
|
|
76
|
+
static rgb888ToColor(color: Color, value: number): void;
|
|
77
|
+
static fromString(hex: string): Color;
|
|
78
|
+
}
|
|
79
|
+
export declare class MathUtils {
|
|
80
|
+
static PI: number;
|
|
81
|
+
static PI2: number;
|
|
82
|
+
static radiansToDegrees: number;
|
|
83
|
+
static radDeg: number;
|
|
84
|
+
static degreesToRadians: number;
|
|
85
|
+
static degRad: number;
|
|
86
|
+
static clamp(value: number, min: number, max: number): number;
|
|
87
|
+
static cosDeg(degrees: number): number;
|
|
88
|
+
static sinDeg(degrees: number): number;
|
|
89
|
+
static signum(value: number): number;
|
|
90
|
+
static toInt(x: number): number;
|
|
91
|
+
static cbrt(x: number): number;
|
|
92
|
+
static randomTriangular(min: number, max: number): number;
|
|
93
|
+
static randomTriangularWith(min: number, max: number, mode: number): number;
|
|
94
|
+
static isPowerOfTwo(value: number): boolean | 0;
|
|
95
|
+
}
|
|
96
|
+
export declare abstract class Interpolation {
|
|
97
|
+
protected abstract applyInternal(a: number): number;
|
|
98
|
+
apply(start: number, end: number, a: number): number;
|
|
99
|
+
}
|
|
100
|
+
export declare class Pow extends Interpolation {
|
|
101
|
+
protected power: number;
|
|
102
|
+
constructor(power: number);
|
|
103
|
+
applyInternal(a: number): number;
|
|
104
|
+
}
|
|
105
|
+
export declare class PowOut extends Pow {
|
|
106
|
+
constructor(power: number);
|
|
107
|
+
applyInternal(a: number): number;
|
|
108
|
+
}
|
|
109
|
+
export declare class Utils {
|
|
110
|
+
static SUPPORTS_TYPED_ARRAYS: boolean;
|
|
111
|
+
static arrayCopy<T>(source: ArrayLike<T>, sourceStart: number, dest: ArrayLike<T>, destStart: number, numElements: number): void;
|
|
112
|
+
static arrayFill<T>(array: ArrayLike<T>, fromIndex: number, toIndex: number, value: T): void;
|
|
113
|
+
static setArraySize<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
|
114
|
+
static ensureArrayCapacity<T>(array: Array<T>, size: number, value?: any): Array<T>;
|
|
115
|
+
static newArray<T>(size: number, defaultValue: T): Array<T>;
|
|
116
|
+
static newFloatArray(size: number): NumberArrayLike;
|
|
117
|
+
static newShortArray(size: number): NumberArrayLike;
|
|
118
|
+
static toFloatArray(array: Array<number>): number[] | Float32Array;
|
|
119
|
+
static toSinglePrecision(value: number): number;
|
|
120
|
+
static webkit602BugfixHelper(alpha: number, blend: MixBlend): void;
|
|
121
|
+
static contains<T>(array: Array<T>, element: T, identity?: boolean): boolean;
|
|
122
|
+
static enumValue(type: any, name: string): any;
|
|
123
|
+
}
|
|
124
|
+
export declare class DebugUtils {
|
|
125
|
+
static logBones(skeleton: Skeleton): void;
|
|
126
|
+
}
|
|
127
|
+
export declare class Pool<T> {
|
|
128
|
+
private items;
|
|
129
|
+
private instantiator;
|
|
130
|
+
constructor(instantiator: () => T);
|
|
131
|
+
obtain(): T;
|
|
132
|
+
free(item: T): void;
|
|
133
|
+
freeAll(items: ArrayLike<T>): void;
|
|
134
|
+
clear(): void;
|
|
135
|
+
}
|
|
136
|
+
export declare class Vector2 {
|
|
137
|
+
x: number;
|
|
138
|
+
y: number;
|
|
139
|
+
constructor(x?: number, y?: number);
|
|
140
|
+
set(x: number, y: number): Vector2;
|
|
141
|
+
length(): number;
|
|
142
|
+
normalize(): this;
|
|
143
|
+
}
|
|
144
|
+
export declare class TimeKeeper {
|
|
145
|
+
maxDelta: number;
|
|
146
|
+
framesPerSecond: number;
|
|
147
|
+
delta: number;
|
|
148
|
+
totalTime: number;
|
|
149
|
+
private lastTime;
|
|
150
|
+
private frameCount;
|
|
151
|
+
private frameTime;
|
|
152
|
+
update(): void;
|
|
153
|
+
}
|
|
154
|
+
export interface ArrayLike<T> {
|
|
155
|
+
length: number;
|
|
156
|
+
[n: number]: T;
|
|
157
|
+
}
|
|
158
|
+
export declare class WindowedMean {
|
|
159
|
+
values: Array<number>;
|
|
160
|
+
addedValues: number;
|
|
161
|
+
lastValue: number;
|
|
162
|
+
mean: number;
|
|
163
|
+
dirty: boolean;
|
|
164
|
+
constructor(windowSize?: number);
|
|
165
|
+
hasEnoughData(): boolean;
|
|
166
|
+
addValue(value: number): void;
|
|
167
|
+
getMean(): number;
|
|
168
|
+
}
|