@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.
- package/dist/Animation.d.ts +382 -382
- package/dist/Animation.js +2058 -2031
- package/dist/AnimationState.d.ts +396 -396
- package/dist/AnimationState.js +1083 -959
- package/dist/AnimationStateData.d.ts +51 -51
- package/dist/AnimationStateData.js +72 -70
- package/dist/AssetManagerBase.d.ts +74 -72
- package/dist/AssetManagerBase.js +304 -303
- package/dist/AtlasAttachmentLoader.d.ts +53 -53
- package/dist/AtlasAttachmentLoader.js +95 -94
- package/dist/Bone.d.ts +138 -138
- package/dist/Bone.js +340 -334
- package/dist/BoneData.d.ts +72 -72
- package/dist/BoneData.js +82 -74
- package/dist/ConstraintData.d.ts +35 -35
- package/dist/ConstraintData.js +36 -36
- package/dist/Event.d.ts +44 -44
- package/dist/Event.js +49 -42
- package/dist/EventData.d.ts +41 -41
- package/dist/EventData.js +44 -37
- package/dist/IkConstraint.d.ts +64 -64
- package/dist/IkConstraint.js +291 -285
- package/dist/IkConstraintData.d.ts +54 -54
- package/dist/IkConstraintData.js +56 -54
- package/dist/PathConstraint.d.ts +71 -71
- package/dist/PathConstraint.js +475 -469
- package/dist/PathConstraintData.d.ts +80 -80
- package/dist/PathConstraintData.js +84 -70
- package/dist/Skeleton.d.ts +152 -152
- package/dist/Skeleton.js +581 -563
- package/dist/SkeletonBinary.d.ts +68 -68
- package/dist/SkeletonBinary.js +1132 -1131
- package/dist/SkeletonBounds.d.ts +77 -77
- package/dist/SkeletonBounds.js +218 -218
- package/dist/SkeletonClipping.d.ts +50 -50
- package/dist/SkeletonClipping.js +323 -323
- package/dist/SkeletonData.d.ts +114 -114
- package/dist/SkeletonData.js +190 -167
- package/dist/SkeletonJson.d.ts +53 -53
- package/dist/SkeletonJson.js +954 -953
- package/dist/Skin.d.ts +71 -71
- package/dist/Skin.js +203 -201
- package/dist/Slot.d.ts +69 -69
- package/dist/Slot.js +97 -85
- package/dist/SlotData.d.ts +57 -57
- package/dist/SlotData.js +68 -55
- package/dist/Texture.d.ts +69 -69
- package/dist/Texture.js +72 -72
- package/dist/TextureAtlas.d.ts +65 -65
- package/dist/TextureAtlas.js +267 -246
- package/dist/TransformConstraint.d.ts +60 -60
- package/dist/TransformConstraint.js +246 -240
- package/dist/TransformConstraintData.d.ts +60 -60
- package/dist/TransformConstraintData.js +62 -60
- package/dist/Triangulator.d.ts +43 -43
- package/dist/Triangulator.js +243 -243
- package/dist/Updatable.d.ts +37 -37
- package/dist/Updatable.js +29 -29
- package/dist/Utils.d.ts +168 -168
- package/dist/Utils.js +403 -403
- package/dist/VertexEffect.d.ts +35 -35
- package/dist/VertexEffect.js +29 -29
- package/dist/attachments/Attachment.d.ts +72 -72
- package/dist/attachments/Attachment.js +149 -141
- package/dist/attachments/AttachmentLoader.d.ts +54 -54
- package/dist/attachments/AttachmentLoader.js +29 -29
- package/dist/attachments/BoundingBoxAttachment.d.ts +40 -40
- package/dist/attachments/BoundingBoxAttachment.js +47 -47
- package/dist/attachments/ClippingAttachment.d.ts +42 -42
- package/dist/attachments/ClippingAttachment.js +51 -48
- package/dist/attachments/HasTextureRegion.d.ts +44 -44
- package/dist/attachments/HasTextureRegion.js +29 -29
- package/dist/attachments/MeshAttachment.d.ts +79 -79
- package/dist/attachments/MeshAttachment.js +189 -167
- package/dist/attachments/PathAttachment.d.ts +47 -47
- package/dist/attachments/PathAttachment.js +59 -57
- package/dist/attachments/PointAttachment.d.ts +48 -48
- package/dist/attachments/PointAttachment.js +66 -63
- package/dist/attachments/RegionAttachment.d.ts +111 -111
- package/dist/attachments/RegionAttachment.js +204 -199
- package/dist/attachments/Sequence.d.ts +55 -55
- package/dist/attachments/Sequence.js +90 -90
- package/dist/attachments/index.d.ts +8 -8
- package/dist/attachments/index.js +8 -8
- package/dist/iife/spine-core.js +178 -8
- package/dist/iife/spine-core.js.map +2 -2
- package/dist/iife/spine-core.min.js +2 -2
- package/dist/index.d.ts +42 -42
- package/dist/index.js +42 -42
- package/dist/polyfills.d.ts +29 -29
- package/dist/polyfills.js +38 -38
- package/dist/vertexeffects/JitterEffect.d.ts +39 -39
- package/dist/vertexeffects/JitterEffect.js +45 -45
- package/dist/vertexeffects/SwirlEffect.d.ts +44 -44
- package/dist/vertexeffects/SwirlEffect.js +60 -60
- package/package.json +32 -32
package/dist/SkeletonClipping.js
CHANGED
|
@@ -1,324 +1,324 @@
|
|
|
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 { Triangulator } from "./Triangulator";
|
|
30
|
-
import { Utils } from "./Utils";
|
|
31
|
-
export class SkeletonClipping {
|
|
32
|
-
constructor() {
|
|
33
|
-
this.triangulator = new Triangulator();
|
|
34
|
-
this.clippingPolygon = new Array();
|
|
35
|
-
this.clipOutput = new Array();
|
|
36
|
-
this.clippedVertices = new Array();
|
|
37
|
-
this.clippedTriangles = new Array();
|
|
38
|
-
this.scratch = new Array();
|
|
39
|
-
}
|
|
40
|
-
clipStart(slot, clip) {
|
|
41
|
-
if (this.clipAttachment)
|
|
42
|
-
return 0;
|
|
43
|
-
this.clipAttachment = clip;
|
|
44
|
-
let n = clip.worldVerticesLength;
|
|
45
|
-
let vertices = Utils.setArraySize(this.clippingPolygon, n);
|
|
46
|
-
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
|
47
|
-
let clippingPolygon = this.clippingPolygon;
|
|
48
|
-
SkeletonClipping.makeClockwise(clippingPolygon);
|
|
49
|
-
let clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon));
|
|
50
|
-
for (let i = 0, n = clippingPolygons.length; i < n; i++) {
|
|
51
|
-
let polygon = clippingPolygons[i];
|
|
52
|
-
SkeletonClipping.makeClockwise(polygon);
|
|
53
|
-
polygon.push(polygon[0]);
|
|
54
|
-
polygon.push(polygon[1]);
|
|
55
|
-
}
|
|
56
|
-
return clippingPolygons.length;
|
|
57
|
-
}
|
|
58
|
-
clipEndWithSlot(slot) {
|
|
59
|
-
if (this.clipAttachment && this.clipAttachment.endSlot == slot.data)
|
|
60
|
-
this.clipEnd();
|
|
61
|
-
}
|
|
62
|
-
clipEnd() {
|
|
63
|
-
if (!this.clipAttachment)
|
|
64
|
-
return;
|
|
65
|
-
this.clipAttachment = null;
|
|
66
|
-
this.clippingPolygons = null;
|
|
67
|
-
this.clippedVertices.length = 0;
|
|
68
|
-
this.clippedTriangles.length = 0;
|
|
69
|
-
this.clippingPolygon.length = 0;
|
|
70
|
-
}
|
|
71
|
-
isClipping() {
|
|
72
|
-
return this.clipAttachment != null;
|
|
73
|
-
}
|
|
74
|
-
clipTriangles(vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
|
75
|
-
let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
|
76
|
-
let clippedTriangles = this.clippedTriangles;
|
|
77
|
-
let polygons = this.clippingPolygons;
|
|
78
|
-
let polygonsCount = this.clippingPolygons.length;
|
|
79
|
-
let vertexSize = twoColor ? 12 : 8;
|
|
80
|
-
let index = 0;
|
|
81
|
-
clippedVertices.length = 0;
|
|
82
|
-
clippedTriangles.length = 0;
|
|
83
|
-
outer: for (let i = 0; i < trianglesLength; i += 3) {
|
|
84
|
-
let vertexOffset = triangles[i] << 1;
|
|
85
|
-
let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
|
86
|
-
let u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
|
87
|
-
vertexOffset = triangles[i + 1] << 1;
|
|
88
|
-
let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
|
89
|
-
let u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
|
90
|
-
vertexOffset = triangles[i + 2] << 1;
|
|
91
|
-
let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
|
92
|
-
let u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
|
93
|
-
for (let p = 0; p < polygonsCount; p++) {
|
|
94
|
-
let s = clippedVertices.length;
|
|
95
|
-
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
|
96
|
-
let clipOutputLength = clipOutput.length;
|
|
97
|
-
if (clipOutputLength == 0)
|
|
98
|
-
continue;
|
|
99
|
-
let d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
|
100
|
-
let d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
|
101
|
-
let clipOutputCount = clipOutputLength >> 1;
|
|
102
|
-
let clipOutputItems = this.clipOutput;
|
|
103
|
-
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
|
104
|
-
for (let ii = 0; ii < clipOutputLength; ii += 2) {
|
|
105
|
-
let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
|
106
|
-
clippedVerticesItems[s] = x;
|
|
107
|
-
clippedVerticesItems[s + 1] = y;
|
|
108
|
-
clippedVerticesItems[s + 2] = light.r;
|
|
109
|
-
clippedVerticesItems[s + 3] = light.g;
|
|
110
|
-
clippedVerticesItems[s + 4] = light.b;
|
|
111
|
-
clippedVerticesItems[s + 5] = light.a;
|
|
112
|
-
let c0 = x - x3, c1 = y - y3;
|
|
113
|
-
let a = (d0 * c0 + d1 * c1) * d;
|
|
114
|
-
let b = (d4 * c0 + d2 * c1) * d;
|
|
115
|
-
let c = 1 - a - b;
|
|
116
|
-
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
|
117
|
-
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
|
118
|
-
if (twoColor) {
|
|
119
|
-
clippedVerticesItems[s + 8] = dark.r;
|
|
120
|
-
clippedVerticesItems[s + 9] = dark.g;
|
|
121
|
-
clippedVerticesItems[s + 10] = dark.b;
|
|
122
|
-
clippedVerticesItems[s + 11] = dark.a;
|
|
123
|
-
}
|
|
124
|
-
s += vertexSize;
|
|
125
|
-
}
|
|
126
|
-
s = clippedTriangles.length;
|
|
127
|
-
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
|
128
|
-
clipOutputCount--;
|
|
129
|
-
for (let ii = 1; ii < clipOutputCount; ii++) {
|
|
130
|
-
clippedTrianglesItems[s] = index;
|
|
131
|
-
clippedTrianglesItems[s + 1] = (index + ii);
|
|
132
|
-
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
|
133
|
-
s += 3;
|
|
134
|
-
}
|
|
135
|
-
index += clipOutputCount + 1;
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
|
139
|
-
clippedVerticesItems[s] = x1;
|
|
140
|
-
clippedVerticesItems[s + 1] = y1;
|
|
141
|
-
clippedVerticesItems[s + 2] = light.r;
|
|
142
|
-
clippedVerticesItems[s + 3] = light.g;
|
|
143
|
-
clippedVerticesItems[s + 4] = light.b;
|
|
144
|
-
clippedVerticesItems[s + 5] = light.a;
|
|
145
|
-
if (!twoColor) {
|
|
146
|
-
clippedVerticesItems[s + 6] = u1;
|
|
147
|
-
clippedVerticesItems[s + 7] = v1;
|
|
148
|
-
clippedVerticesItems[s + 8] = x2;
|
|
149
|
-
clippedVerticesItems[s + 9] = y2;
|
|
150
|
-
clippedVerticesItems[s + 10] = light.r;
|
|
151
|
-
clippedVerticesItems[s + 11] = light.g;
|
|
152
|
-
clippedVerticesItems[s + 12] = light.b;
|
|
153
|
-
clippedVerticesItems[s + 13] = light.a;
|
|
154
|
-
clippedVerticesItems[s + 14] = u2;
|
|
155
|
-
clippedVerticesItems[s + 15] = v2;
|
|
156
|
-
clippedVerticesItems[s + 16] = x3;
|
|
157
|
-
clippedVerticesItems[s + 17] = y3;
|
|
158
|
-
clippedVerticesItems[s + 18] = light.r;
|
|
159
|
-
clippedVerticesItems[s + 19] = light.g;
|
|
160
|
-
clippedVerticesItems[s + 20] = light.b;
|
|
161
|
-
clippedVerticesItems[s + 21] = light.a;
|
|
162
|
-
clippedVerticesItems[s + 22] = u3;
|
|
163
|
-
clippedVerticesItems[s + 23] = v3;
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
clippedVerticesItems[s + 6] = u1;
|
|
167
|
-
clippedVerticesItems[s + 7] = v1;
|
|
168
|
-
clippedVerticesItems[s + 8] = dark.r;
|
|
169
|
-
clippedVerticesItems[s + 9] = dark.g;
|
|
170
|
-
clippedVerticesItems[s + 10] = dark.b;
|
|
171
|
-
clippedVerticesItems[s + 11] = dark.a;
|
|
172
|
-
clippedVerticesItems[s + 12] = x2;
|
|
173
|
-
clippedVerticesItems[s + 13] = y2;
|
|
174
|
-
clippedVerticesItems[s + 14] = light.r;
|
|
175
|
-
clippedVerticesItems[s + 15] = light.g;
|
|
176
|
-
clippedVerticesItems[s + 16] = light.b;
|
|
177
|
-
clippedVerticesItems[s + 17] = light.a;
|
|
178
|
-
clippedVerticesItems[s + 18] = u2;
|
|
179
|
-
clippedVerticesItems[s + 19] = v2;
|
|
180
|
-
clippedVerticesItems[s + 20] = dark.r;
|
|
181
|
-
clippedVerticesItems[s + 21] = dark.g;
|
|
182
|
-
clippedVerticesItems[s + 22] = dark.b;
|
|
183
|
-
clippedVerticesItems[s + 23] = dark.a;
|
|
184
|
-
clippedVerticesItems[s + 24] = x3;
|
|
185
|
-
clippedVerticesItems[s + 25] = y3;
|
|
186
|
-
clippedVerticesItems[s + 26] = light.r;
|
|
187
|
-
clippedVerticesItems[s + 27] = light.g;
|
|
188
|
-
clippedVerticesItems[s + 28] = light.b;
|
|
189
|
-
clippedVerticesItems[s + 29] = light.a;
|
|
190
|
-
clippedVerticesItems[s + 30] = u3;
|
|
191
|
-
clippedVerticesItems[s + 31] = v3;
|
|
192
|
-
clippedVerticesItems[s + 32] = dark.r;
|
|
193
|
-
clippedVerticesItems[s + 33] = dark.g;
|
|
194
|
-
clippedVerticesItems[s + 34] = dark.b;
|
|
195
|
-
clippedVerticesItems[s + 35] = dark.a;
|
|
196
|
-
}
|
|
197
|
-
s = clippedTriangles.length;
|
|
198
|
-
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);
|
|
199
|
-
clippedTrianglesItems[s] = index;
|
|
200
|
-
clippedTrianglesItems[s + 1] = (index + 1);
|
|
201
|
-
clippedTrianglesItems[s + 2] = (index + 2);
|
|
202
|
-
index += 3;
|
|
203
|
-
continue outer;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
/** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping
|
|
209
|
-
* area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */
|
|
210
|
-
clip(x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
|
211
|
-
let originalOutput = output;
|
|
212
|
-
let clipped = false;
|
|
213
|
-
// Avoid copy at the end.
|
|
214
|
-
let input = null;
|
|
215
|
-
if (clippingArea.length % 4 >= 2) {
|
|
216
|
-
input = output;
|
|
217
|
-
output = this.scratch;
|
|
218
|
-
}
|
|
219
|
-
else
|
|
220
|
-
input = this.scratch;
|
|
221
|
-
input.length = 0;
|
|
222
|
-
input.push(x1);
|
|
223
|
-
input.push(y1);
|
|
224
|
-
input.push(x2);
|
|
225
|
-
input.push(y2);
|
|
226
|
-
input.push(x3);
|
|
227
|
-
input.push(y3);
|
|
228
|
-
input.push(x1);
|
|
229
|
-
input.push(y1);
|
|
230
|
-
output.length = 0;
|
|
231
|
-
let clippingVertices = clippingArea;
|
|
232
|
-
let clippingVerticesLast = clippingArea.length - 4;
|
|
233
|
-
for (let i = 0;; i += 2) {
|
|
234
|
-
let edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
|
235
|
-
let edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
|
236
|
-
let deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
|
237
|
-
let inputVertices = input;
|
|
238
|
-
let inputVerticesLength = input.length - 2, outputStart = output.length;
|
|
239
|
-
for (let ii = 0; ii < inputVerticesLength; ii += 2) {
|
|
240
|
-
let inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
|
241
|
-
let inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
|
242
|
-
let side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
|
243
|
-
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
|
244
|
-
if (side2) { // v1 inside, v2 inside
|
|
245
|
-
output.push(inputX2);
|
|
246
|
-
output.push(inputY2);
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
// v1 inside, v2 outside
|
|
250
|
-
let c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
|
251
|
-
let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);
|
|
252
|
-
if (Math.abs(s) > 0.000001) {
|
|
253
|
-
let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;
|
|
254
|
-
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
|
255
|
-
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
output.push(edgeX);
|
|
259
|
-
output.push(edgeY);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
else if (side2) { // v1 outside, v2 inside
|
|
263
|
-
let c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
|
264
|
-
let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);
|
|
265
|
-
if (Math.abs(s) > 0.000001) {
|
|
266
|
-
let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;
|
|
267
|
-
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
|
268
|
-
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
|
269
|
-
}
|
|
270
|
-
else {
|
|
271
|
-
output.push(edgeX);
|
|
272
|
-
output.push(edgeY);
|
|
273
|
-
}
|
|
274
|
-
output.push(inputX2);
|
|
275
|
-
output.push(inputY2);
|
|
276
|
-
}
|
|
277
|
-
clipped = true;
|
|
278
|
-
}
|
|
279
|
-
if (outputStart == output.length) { // All edges outside.
|
|
280
|
-
originalOutput.length = 0;
|
|
281
|
-
return true;
|
|
282
|
-
}
|
|
283
|
-
output.push(output[0]);
|
|
284
|
-
output.push(output[1]);
|
|
285
|
-
if (i == clippingVerticesLast)
|
|
286
|
-
break;
|
|
287
|
-
let temp = output;
|
|
288
|
-
output = input;
|
|
289
|
-
output.length = 0;
|
|
290
|
-
input = temp;
|
|
291
|
-
}
|
|
292
|
-
if (originalOutput != output) {
|
|
293
|
-
originalOutput.length = 0;
|
|
294
|
-
for (let i = 0, n = output.length - 2; i < n; i++)
|
|
295
|
-
originalOutput[i] = output[i];
|
|
296
|
-
}
|
|
297
|
-
else
|
|
298
|
-
originalOutput.length = originalOutput.length - 2;
|
|
299
|
-
return clipped;
|
|
300
|
-
}
|
|
301
|
-
static makeClockwise(polygon) {
|
|
302
|
-
let vertices = polygon;
|
|
303
|
-
let verticeslength = polygon.length;
|
|
304
|
-
let area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
|
305
|
-
for (let i = 0, n = verticeslength - 3; i < n; i += 2) {
|
|
306
|
-
p1x = vertices[i];
|
|
307
|
-
p1y = vertices[i + 1];
|
|
308
|
-
p2x = vertices[i + 2];
|
|
309
|
-
p2y = vertices[i + 3];
|
|
310
|
-
area += p1x * p2y - p2x * p1y;
|
|
311
|
-
}
|
|
312
|
-
if (area < 0)
|
|
313
|
-
return;
|
|
314
|
-
for (let i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
|
315
|
-
let x = vertices[i], y = vertices[i + 1];
|
|
316
|
-
let other = lastX - i;
|
|
317
|
-
vertices[i] = vertices[other];
|
|
318
|
-
vertices[i + 1] = vertices[other + 1];
|
|
319
|
-
vertices[other] = x;
|
|
320
|
-
vertices[other + 1] = y;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}
|
|
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 { Triangulator } from "./Triangulator";
|
|
30
|
+
import { Utils } from "./Utils";
|
|
31
|
+
export class SkeletonClipping {
|
|
32
|
+
constructor() {
|
|
33
|
+
this.triangulator = new Triangulator();
|
|
34
|
+
this.clippingPolygon = new Array();
|
|
35
|
+
this.clipOutput = new Array();
|
|
36
|
+
this.clippedVertices = new Array();
|
|
37
|
+
this.clippedTriangles = new Array();
|
|
38
|
+
this.scratch = new Array();
|
|
39
|
+
}
|
|
40
|
+
clipStart(slot, clip) {
|
|
41
|
+
if (this.clipAttachment)
|
|
42
|
+
return 0;
|
|
43
|
+
this.clipAttachment = clip;
|
|
44
|
+
let n = clip.worldVerticesLength;
|
|
45
|
+
let vertices = Utils.setArraySize(this.clippingPolygon, n);
|
|
46
|
+
clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
|
|
47
|
+
let clippingPolygon = this.clippingPolygon;
|
|
48
|
+
SkeletonClipping.makeClockwise(clippingPolygon);
|
|
49
|
+
let clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon));
|
|
50
|
+
for (let i = 0, n = clippingPolygons.length; i < n; i++) {
|
|
51
|
+
let polygon = clippingPolygons[i];
|
|
52
|
+
SkeletonClipping.makeClockwise(polygon);
|
|
53
|
+
polygon.push(polygon[0]);
|
|
54
|
+
polygon.push(polygon[1]);
|
|
55
|
+
}
|
|
56
|
+
return clippingPolygons.length;
|
|
57
|
+
}
|
|
58
|
+
clipEndWithSlot(slot) {
|
|
59
|
+
if (this.clipAttachment && this.clipAttachment.endSlot == slot.data)
|
|
60
|
+
this.clipEnd();
|
|
61
|
+
}
|
|
62
|
+
clipEnd() {
|
|
63
|
+
if (!this.clipAttachment)
|
|
64
|
+
return;
|
|
65
|
+
this.clipAttachment = null;
|
|
66
|
+
this.clippingPolygons = null;
|
|
67
|
+
this.clippedVertices.length = 0;
|
|
68
|
+
this.clippedTriangles.length = 0;
|
|
69
|
+
this.clippingPolygon.length = 0;
|
|
70
|
+
}
|
|
71
|
+
isClipping() {
|
|
72
|
+
return this.clipAttachment != null;
|
|
73
|
+
}
|
|
74
|
+
clipTriangles(vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) {
|
|
75
|
+
let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
|
|
76
|
+
let clippedTriangles = this.clippedTriangles;
|
|
77
|
+
let polygons = this.clippingPolygons;
|
|
78
|
+
let polygonsCount = this.clippingPolygons.length;
|
|
79
|
+
let vertexSize = twoColor ? 12 : 8;
|
|
80
|
+
let index = 0;
|
|
81
|
+
clippedVertices.length = 0;
|
|
82
|
+
clippedTriangles.length = 0;
|
|
83
|
+
outer: for (let i = 0; i < trianglesLength; i += 3) {
|
|
84
|
+
let vertexOffset = triangles[i] << 1;
|
|
85
|
+
let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
|
|
86
|
+
let u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
|
|
87
|
+
vertexOffset = triangles[i + 1] << 1;
|
|
88
|
+
let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
|
|
89
|
+
let u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
|
|
90
|
+
vertexOffset = triangles[i + 2] << 1;
|
|
91
|
+
let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
|
|
92
|
+
let u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
|
|
93
|
+
for (let p = 0; p < polygonsCount; p++) {
|
|
94
|
+
let s = clippedVertices.length;
|
|
95
|
+
if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
|
|
96
|
+
let clipOutputLength = clipOutput.length;
|
|
97
|
+
if (clipOutputLength == 0)
|
|
98
|
+
continue;
|
|
99
|
+
let d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
|
|
100
|
+
let d = 1 / (d0 * d2 + d1 * (y1 - y3));
|
|
101
|
+
let clipOutputCount = clipOutputLength >> 1;
|
|
102
|
+
let clipOutputItems = this.clipOutput;
|
|
103
|
+
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
|
|
104
|
+
for (let ii = 0; ii < clipOutputLength; ii += 2) {
|
|
105
|
+
let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
|
|
106
|
+
clippedVerticesItems[s] = x;
|
|
107
|
+
clippedVerticesItems[s + 1] = y;
|
|
108
|
+
clippedVerticesItems[s + 2] = light.r;
|
|
109
|
+
clippedVerticesItems[s + 3] = light.g;
|
|
110
|
+
clippedVerticesItems[s + 4] = light.b;
|
|
111
|
+
clippedVerticesItems[s + 5] = light.a;
|
|
112
|
+
let c0 = x - x3, c1 = y - y3;
|
|
113
|
+
let a = (d0 * c0 + d1 * c1) * d;
|
|
114
|
+
let b = (d4 * c0 + d2 * c1) * d;
|
|
115
|
+
let c = 1 - a - b;
|
|
116
|
+
clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
|
|
117
|
+
clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
|
|
118
|
+
if (twoColor) {
|
|
119
|
+
clippedVerticesItems[s + 8] = dark.r;
|
|
120
|
+
clippedVerticesItems[s + 9] = dark.g;
|
|
121
|
+
clippedVerticesItems[s + 10] = dark.b;
|
|
122
|
+
clippedVerticesItems[s + 11] = dark.a;
|
|
123
|
+
}
|
|
124
|
+
s += vertexSize;
|
|
125
|
+
}
|
|
126
|
+
s = clippedTriangles.length;
|
|
127
|
+
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
|
|
128
|
+
clipOutputCount--;
|
|
129
|
+
for (let ii = 1; ii < clipOutputCount; ii++) {
|
|
130
|
+
clippedTrianglesItems[s] = index;
|
|
131
|
+
clippedTrianglesItems[s + 1] = (index + ii);
|
|
132
|
+
clippedTrianglesItems[s + 2] = (index + ii + 1);
|
|
133
|
+
s += 3;
|
|
134
|
+
}
|
|
135
|
+
index += clipOutputCount + 1;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
|
|
139
|
+
clippedVerticesItems[s] = x1;
|
|
140
|
+
clippedVerticesItems[s + 1] = y1;
|
|
141
|
+
clippedVerticesItems[s + 2] = light.r;
|
|
142
|
+
clippedVerticesItems[s + 3] = light.g;
|
|
143
|
+
clippedVerticesItems[s + 4] = light.b;
|
|
144
|
+
clippedVerticesItems[s + 5] = light.a;
|
|
145
|
+
if (!twoColor) {
|
|
146
|
+
clippedVerticesItems[s + 6] = u1;
|
|
147
|
+
clippedVerticesItems[s + 7] = v1;
|
|
148
|
+
clippedVerticesItems[s + 8] = x2;
|
|
149
|
+
clippedVerticesItems[s + 9] = y2;
|
|
150
|
+
clippedVerticesItems[s + 10] = light.r;
|
|
151
|
+
clippedVerticesItems[s + 11] = light.g;
|
|
152
|
+
clippedVerticesItems[s + 12] = light.b;
|
|
153
|
+
clippedVerticesItems[s + 13] = light.a;
|
|
154
|
+
clippedVerticesItems[s + 14] = u2;
|
|
155
|
+
clippedVerticesItems[s + 15] = v2;
|
|
156
|
+
clippedVerticesItems[s + 16] = x3;
|
|
157
|
+
clippedVerticesItems[s + 17] = y3;
|
|
158
|
+
clippedVerticesItems[s + 18] = light.r;
|
|
159
|
+
clippedVerticesItems[s + 19] = light.g;
|
|
160
|
+
clippedVerticesItems[s + 20] = light.b;
|
|
161
|
+
clippedVerticesItems[s + 21] = light.a;
|
|
162
|
+
clippedVerticesItems[s + 22] = u3;
|
|
163
|
+
clippedVerticesItems[s + 23] = v3;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
clippedVerticesItems[s + 6] = u1;
|
|
167
|
+
clippedVerticesItems[s + 7] = v1;
|
|
168
|
+
clippedVerticesItems[s + 8] = dark.r;
|
|
169
|
+
clippedVerticesItems[s + 9] = dark.g;
|
|
170
|
+
clippedVerticesItems[s + 10] = dark.b;
|
|
171
|
+
clippedVerticesItems[s + 11] = dark.a;
|
|
172
|
+
clippedVerticesItems[s + 12] = x2;
|
|
173
|
+
clippedVerticesItems[s + 13] = y2;
|
|
174
|
+
clippedVerticesItems[s + 14] = light.r;
|
|
175
|
+
clippedVerticesItems[s + 15] = light.g;
|
|
176
|
+
clippedVerticesItems[s + 16] = light.b;
|
|
177
|
+
clippedVerticesItems[s + 17] = light.a;
|
|
178
|
+
clippedVerticesItems[s + 18] = u2;
|
|
179
|
+
clippedVerticesItems[s + 19] = v2;
|
|
180
|
+
clippedVerticesItems[s + 20] = dark.r;
|
|
181
|
+
clippedVerticesItems[s + 21] = dark.g;
|
|
182
|
+
clippedVerticesItems[s + 22] = dark.b;
|
|
183
|
+
clippedVerticesItems[s + 23] = dark.a;
|
|
184
|
+
clippedVerticesItems[s + 24] = x3;
|
|
185
|
+
clippedVerticesItems[s + 25] = y3;
|
|
186
|
+
clippedVerticesItems[s + 26] = light.r;
|
|
187
|
+
clippedVerticesItems[s + 27] = light.g;
|
|
188
|
+
clippedVerticesItems[s + 28] = light.b;
|
|
189
|
+
clippedVerticesItems[s + 29] = light.a;
|
|
190
|
+
clippedVerticesItems[s + 30] = u3;
|
|
191
|
+
clippedVerticesItems[s + 31] = v3;
|
|
192
|
+
clippedVerticesItems[s + 32] = dark.r;
|
|
193
|
+
clippedVerticesItems[s + 33] = dark.g;
|
|
194
|
+
clippedVerticesItems[s + 34] = dark.b;
|
|
195
|
+
clippedVerticesItems[s + 35] = dark.a;
|
|
196
|
+
}
|
|
197
|
+
s = clippedTriangles.length;
|
|
198
|
+
let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);
|
|
199
|
+
clippedTrianglesItems[s] = index;
|
|
200
|
+
clippedTrianglesItems[s + 1] = (index + 1);
|
|
201
|
+
clippedTrianglesItems[s + 2] = (index + 2);
|
|
202
|
+
index += 3;
|
|
203
|
+
continue outer;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping
|
|
209
|
+
* area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */
|
|
210
|
+
clip(x1, y1, x2, y2, x3, y3, clippingArea, output) {
|
|
211
|
+
let originalOutput = output;
|
|
212
|
+
let clipped = false;
|
|
213
|
+
// Avoid copy at the end.
|
|
214
|
+
let input = null;
|
|
215
|
+
if (clippingArea.length % 4 >= 2) {
|
|
216
|
+
input = output;
|
|
217
|
+
output = this.scratch;
|
|
218
|
+
}
|
|
219
|
+
else
|
|
220
|
+
input = this.scratch;
|
|
221
|
+
input.length = 0;
|
|
222
|
+
input.push(x1);
|
|
223
|
+
input.push(y1);
|
|
224
|
+
input.push(x2);
|
|
225
|
+
input.push(y2);
|
|
226
|
+
input.push(x3);
|
|
227
|
+
input.push(y3);
|
|
228
|
+
input.push(x1);
|
|
229
|
+
input.push(y1);
|
|
230
|
+
output.length = 0;
|
|
231
|
+
let clippingVertices = clippingArea;
|
|
232
|
+
let clippingVerticesLast = clippingArea.length - 4;
|
|
233
|
+
for (let i = 0;; i += 2) {
|
|
234
|
+
let edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
|
|
235
|
+
let edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3];
|
|
236
|
+
let deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2;
|
|
237
|
+
let inputVertices = input;
|
|
238
|
+
let inputVerticesLength = input.length - 2, outputStart = output.length;
|
|
239
|
+
for (let ii = 0; ii < inputVerticesLength; ii += 2) {
|
|
240
|
+
let inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
|
|
241
|
+
let inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3];
|
|
242
|
+
let side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0;
|
|
243
|
+
if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) {
|
|
244
|
+
if (side2) { // v1 inside, v2 inside
|
|
245
|
+
output.push(inputX2);
|
|
246
|
+
output.push(inputY2);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
// v1 inside, v2 outside
|
|
250
|
+
let c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
|
251
|
+
let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);
|
|
252
|
+
if (Math.abs(s) > 0.000001) {
|
|
253
|
+
let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;
|
|
254
|
+
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
|
255
|
+
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
output.push(edgeX);
|
|
259
|
+
output.push(edgeY);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else if (side2) { // v1 outside, v2 inside
|
|
263
|
+
let c0 = inputY2 - inputY, c2 = inputX2 - inputX;
|
|
264
|
+
let s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY);
|
|
265
|
+
if (Math.abs(s) > 0.000001) {
|
|
266
|
+
let ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s;
|
|
267
|
+
output.push(edgeX + (edgeX2 - edgeX) * ua);
|
|
268
|
+
output.push(edgeY + (edgeY2 - edgeY) * ua);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
output.push(edgeX);
|
|
272
|
+
output.push(edgeY);
|
|
273
|
+
}
|
|
274
|
+
output.push(inputX2);
|
|
275
|
+
output.push(inputY2);
|
|
276
|
+
}
|
|
277
|
+
clipped = true;
|
|
278
|
+
}
|
|
279
|
+
if (outputStart == output.length) { // All edges outside.
|
|
280
|
+
originalOutput.length = 0;
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
output.push(output[0]);
|
|
284
|
+
output.push(output[1]);
|
|
285
|
+
if (i == clippingVerticesLast)
|
|
286
|
+
break;
|
|
287
|
+
let temp = output;
|
|
288
|
+
output = input;
|
|
289
|
+
output.length = 0;
|
|
290
|
+
input = temp;
|
|
291
|
+
}
|
|
292
|
+
if (originalOutput != output) {
|
|
293
|
+
originalOutput.length = 0;
|
|
294
|
+
for (let i = 0, n = output.length - 2; i < n; i++)
|
|
295
|
+
originalOutput[i] = output[i];
|
|
296
|
+
}
|
|
297
|
+
else
|
|
298
|
+
originalOutput.length = originalOutput.length - 2;
|
|
299
|
+
return clipped;
|
|
300
|
+
}
|
|
301
|
+
static makeClockwise(polygon) {
|
|
302
|
+
let vertices = polygon;
|
|
303
|
+
let verticeslength = polygon.length;
|
|
304
|
+
let area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
|
|
305
|
+
for (let i = 0, n = verticeslength - 3; i < n; i += 2) {
|
|
306
|
+
p1x = vertices[i];
|
|
307
|
+
p1y = vertices[i + 1];
|
|
308
|
+
p2x = vertices[i + 2];
|
|
309
|
+
p2y = vertices[i + 3];
|
|
310
|
+
area += p1x * p2y - p2x * p1y;
|
|
311
|
+
}
|
|
312
|
+
if (area < 0)
|
|
313
|
+
return;
|
|
314
|
+
for (let i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
|
|
315
|
+
let x = vertices[i], y = vertices[i + 1];
|
|
316
|
+
let other = lastX - i;
|
|
317
|
+
vertices[i] = vertices[other];
|
|
318
|
+
vertices[i + 1] = vertices[other + 1];
|
|
319
|
+
vertices[other] = x;
|
|
320
|
+
vertices[other + 1] = y;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
324
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25DbGlwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ta2VsZXRvbkNsaXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUkvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBMEIsTUFBTSxTQUFTLENBQUM7QUFFeEQsTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUNTLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxvQkFBZSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDdEMsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDekMsb0JBQWUsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3RDLHFCQUFnQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFDL0IsWUFBTyxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFxVHZDLENBQUM7SUFoVEEsU0FBUyxDQUFFLElBQVUsRUFBRSxJQUF3QjtRQUM5QyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFM0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ2pDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNDLGdCQUFnQixDQUFDLGFBQWEsQ0FB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QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRWxDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3FCQUNsQzt5QkFBTTt3QkFDTixvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNqQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNqQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDckMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFFdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUV0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFD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QUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzt3QkFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7cUJBQzNDO3lCQUFNO3dCQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ25CO2lCQUNEO3FCQUFNLElBQUksS0FBSyxFQUFFLEVBQUUsd0JBQXdCO29CQUMzQyxJQUFJLEVBQUUsR0FBRyxPQUFPLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFDO29CQUNqRCxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUN0RCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFO3dCQUMzQixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO3dCQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FB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
|