@esotericsoftware/spine-core 4.2.117 → 4.3.1
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 +426 -274
- package/dist/Animation.js +1174 -1210
- package/dist/AnimationState.d.ts +246 -201
- package/dist/AnimationState.js +508 -471
- package/dist/AnimationStateData.d.ts +12 -10
- package/dist/AnimationStateData.js +19 -20
- package/dist/AssetManagerBase.d.ts +27 -21
- package/dist/AssetManagerBase.js +67 -43
- package/dist/AtlasAttachmentLoader.d.ts +18 -12
- package/dist/AtlasAttachmentLoader.js +28 -39
- package/dist/Bone.d.ts +15 -109
- package/dist/Bone.js +22 -362
- package/dist/BoneData.d.ts +13 -28
- package/dist/BoneData.js +20 -29
- package/dist/BonePose.d.ts +132 -0
- package/dist/BonePose.js +456 -0
- package/dist/Constraint.d.ts +41 -0
- package/dist/Constraint.js +38 -0
- package/dist/ConstraintData.d.ts +16 -5
- package/dist/ConstraintData.js +15 -9
- package/dist/DrawOrder.d.ts +48 -0
- package/dist/DrawOrder.js +64 -0
- package/dist/Event.d.ts +11 -6
- package/dist/Event.js +10 -5
- package/dist/EventData.d.ts +10 -6
- package/dist/EventData.js +18 -7
- package/dist/IkConstraint.d.ts +23 -28
- package/dist/IkConstraint.js +122 -124
- package/dist/IkConstraintData.d.ts +14 -19
- package/dist/IkConstraintData.js +22 -23
- package/dist/IkConstraintPose.d.ts +49 -0
- package/dist/IkConstraintPose.js +55 -0
- package/dist/PathConstraint.d.ts +18 -23
- package/dist/PathConstraint.js +162 -139
- package/dist/PathConstraintData.d.ts +11 -14
- package/dist/PathConstraintData.js +14 -16
- package/dist/PathConstraintPose.d.ts +43 -0
- package/dist/PathConstraintPose.js +49 -0
- package/dist/Physics.d.ts +39 -0
- package/dist/Physics.js +41 -0
- package/dist/PhysicsConstraint.d.ts +26 -30
- package/dist/PhysicsConstraint.js +114 -94
- package/dist/PhysicsConstraintData.d.ts +28 -13
- package/dist/PhysicsConstraintData.js +35 -13
- package/dist/PhysicsConstraintPose.d.ts +47 -0
- package/dist/PhysicsConstraintPose.js +55 -0
- package/dist/Pose.d.ts +33 -0
- package/dist/Pose.js +30 -0
- package/dist/Posed.d.ts +58 -0
- package/dist/Posed.js +78 -0
- package/dist/PosedActive.d.ts +41 -0
- package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
- package/dist/PosedData.d.ts +40 -0
- package/dist/PosedData.js +45 -0
- package/dist/Skeleton.d.ts +110 -99
- package/dist/Skeleton.js +271 -449
- package/dist/SkeletonBinary.d.ts +1 -1
- package/dist/SkeletonBinary.js +655 -466
- package/dist/SkeletonBounds.d.ts +4 -4
- package/dist/SkeletonBounds.js +45 -46
- package/dist/SkeletonClipping.d.ts +26 -22
- package/dist/SkeletonClipping.js +654 -340
- package/dist/SkeletonData.d.ts +18 -35
- package/dist/SkeletonData.js +57 -97
- package/dist/SkeletonJson.d.ts +8 -6
- package/dist/SkeletonJson.js +895 -640
- package/dist/SkeletonRendererCore.d.ts +58 -0
- package/dist/SkeletonRendererCore.js +310 -0
- package/dist/Skin.d.ts +20 -16
- package/dist/Skin.js +58 -53
- package/dist/Slider.d.ts +46 -0
- package/dist/Slider.js +115 -0
- package/dist/SliderData.d.ts +58 -0
- package/dist/SliderData.js +59 -0
- package/dist/SliderPose.d.ts +37 -0
- package/dist/SliderPose.js +40 -0
- package/dist/Slot.d.ts +16 -38
- package/dist/Slot.js +37 -60
- package/dist/SlotData.d.ts +5 -12
- package/dist/SlotData.js +7 -15
- package/dist/SlotPose.d.ts +59 -0
- package/dist/SlotPose.js +81 -0
- package/dist/Texture.d.ts +1 -0
- package/dist/Texture.js +2 -1
- package/dist/TextureAtlas.d.ts +3 -3
- package/dist/TextureAtlas.js +49 -49
- package/dist/TransformConstraint.d.ts +16 -28
- package/dist/TransformConstraint.js +72 -209
- package/dist/TransformConstraintData.d.ts +108 -20
- package/dist/TransformConstraintData.js +274 -24
- package/dist/TransformConstraintPose.d.ts +45 -0
- package/dist/TransformConstraintPose.js +52 -0
- package/dist/Triangulator.d.ts +1 -1
- package/dist/Triangulator.js +91 -107
- package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
- package/dist/Update.js +30 -0
- package/dist/Utils.d.ts +14 -3
- package/dist/Utils.js +80 -37
- package/dist/attachments/Attachment.d.ts +27 -19
- package/dist/attachments/Attachment.js +59 -35
- package/dist/attachments/AttachmentLoader.d.ts +14 -14
- package/dist/attachments/AttachmentLoader.js +1 -1
- package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
- package/dist/attachments/BoundingBoxAttachment.js +2 -2
- package/dist/attachments/ClippingAttachment.d.ts +10 -3
- package/dist/attachments/ClippingAttachment.js +12 -3
- package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
- package/dist/attachments/HasSequence.js +30 -0
- package/dist/attachments/MeshAttachment.d.ts +28 -35
- package/dist/attachments/MeshAttachment.js +85 -97
- package/dist/attachments/PathAttachment.d.ts +3 -3
- package/dist/attachments/PathAttachment.js +6 -6
- package/dist/attachments/PointAttachment.d.ts +11 -6
- package/dist/attachments/PointAttachment.js +8 -3
- package/dist/attachments/RegionAttachment.d.ts +25 -27
- package/dist/attachments/RegionAttachment.js +101 -113
- package/dist/attachments/Sequence.d.ts +31 -6
- package/dist/attachments/Sequence.js +79 -13
- package/dist/esm/spine-core.min.mjs +2 -2
- package/dist/esm/spine-core.mjs +7747 -6116
- package/dist/esm/spine-core.mjs.map +4 -4
- package/dist/iife/spine-core.js +7747 -6116
- package/dist/iife/spine-core.js.map +4 -4
- package/dist/iife/spine-core.min.js +2 -2
- package/dist/index.d.ts +32 -11
- package/dist/index.js +33 -12
- package/dist/polyfills.js +4 -5
- package/package.json +1 -1
- package/dist/Updatable.js +0 -30
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, 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 type { Skeleton } from "./Skeleton.js";
|
|
30
|
+
import { BlendMode } from "./SlotData.js";
|
|
31
|
+
export declare class SkeletonRendererCore {
|
|
32
|
+
private commandPool;
|
|
33
|
+
private worldVertices;
|
|
34
|
+
private quadIndices;
|
|
35
|
+
private clipping;
|
|
36
|
+
private renderCommands;
|
|
37
|
+
render(skeleton: Skeleton, pma?: boolean, inColor?: [number, number, number, number], stride?: number): RenderCommand | undefined;
|
|
38
|
+
private batchSubCommands;
|
|
39
|
+
private batchCommands;
|
|
40
|
+
}
|
|
41
|
+
interface RenderCommand {
|
|
42
|
+
positions: Float32Array;
|
|
43
|
+
uvs: Float32Array;
|
|
44
|
+
colors: Uint32Array;
|
|
45
|
+
darkColors: Uint32Array;
|
|
46
|
+
indices: Uint16Array;
|
|
47
|
+
_positions: Float32Array;
|
|
48
|
+
_uvs: Float32Array;
|
|
49
|
+
_colors: Uint32Array;
|
|
50
|
+
_darkColors: Uint32Array;
|
|
51
|
+
_indices: Uint16Array;
|
|
52
|
+
numVertices: number;
|
|
53
|
+
numIndices: number;
|
|
54
|
+
blendMode: BlendMode;
|
|
55
|
+
texture: any;
|
|
56
|
+
next?: RenderCommand;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated April 5, 2025. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2025, 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 { ClippingAttachment, MeshAttachment, RegionAttachment } from "./attachments/index.js";
|
|
30
|
+
import { SkeletonClipping } from "./SkeletonClipping.js";
|
|
31
|
+
import { BlendMode } from "./SlotData.js";
|
|
32
|
+
export class SkeletonRendererCore {
|
|
33
|
+
commandPool = new CommandPool();
|
|
34
|
+
worldVertices = new Float32Array(12 * 1024);
|
|
35
|
+
quadIndices = new Uint16Array([0, 1, 2, 2, 3, 0]);
|
|
36
|
+
clipping = new SkeletonClipping();
|
|
37
|
+
renderCommands = [];
|
|
38
|
+
render(skeleton, pma = false, inColor, stride = 2) {
|
|
39
|
+
this.commandPool.reset();
|
|
40
|
+
this.renderCommands.length = 0;
|
|
41
|
+
const clipper = this.clipping;
|
|
42
|
+
const drawOrder = skeleton.drawOrder.appliedPose;
|
|
43
|
+
for (let i = 0; i < skeleton.slots.length; i++) {
|
|
44
|
+
const slot = drawOrder[i];
|
|
45
|
+
const attachment = slot.appliedPose.attachment;
|
|
46
|
+
if (!attachment) {
|
|
47
|
+
clipper.clipEnd(slot);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const pose = slot.appliedPose;
|
|
51
|
+
const slotColor = pose.color;
|
|
52
|
+
const alpha = slotColor.a;
|
|
53
|
+
if ((alpha === 0 || !slot.bone.active) && !(attachment instanceof ClippingAttachment)) {
|
|
54
|
+
clipper.clipEnd(slot);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
let vertices;
|
|
58
|
+
let verticesCount;
|
|
59
|
+
let uvs;
|
|
60
|
+
let indices;
|
|
61
|
+
let indicesCount;
|
|
62
|
+
let attachmentColor;
|
|
63
|
+
// biome-ignore lint/suspicious/noExplicitAny: texture depends on the runtime
|
|
64
|
+
let texture;
|
|
65
|
+
if (attachment instanceof RegionAttachment) {
|
|
66
|
+
attachmentColor = attachment.color;
|
|
67
|
+
if (attachmentColor.a === 0) {
|
|
68
|
+
clipper.clipEnd(slot);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const sequence = attachment.sequence;
|
|
72
|
+
const sequenceIndex = sequence.resolveIndex(pose);
|
|
73
|
+
attachment.computeWorldVertices(slot, attachment.getOffsets(pose), this.worldVertices, 0, stride);
|
|
74
|
+
vertices = this.worldVertices;
|
|
75
|
+
verticesCount = 4;
|
|
76
|
+
uvs = sequence.getUVs(sequenceIndex);
|
|
77
|
+
indices = this.quadIndices;
|
|
78
|
+
indicesCount = 6;
|
|
79
|
+
texture = sequence.regions[sequenceIndex]?.texture;
|
|
80
|
+
}
|
|
81
|
+
else if (attachment instanceof MeshAttachment) {
|
|
82
|
+
attachmentColor = attachment.color;
|
|
83
|
+
if (attachmentColor.a === 0) {
|
|
84
|
+
clipper.clipEnd(slot);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (this.worldVertices.length < attachment.worldVerticesLength)
|
|
88
|
+
this.worldVertices = new Float32Array(attachment.worldVerticesLength);
|
|
89
|
+
attachment.computeWorldVertices(skeleton, slot, 0, attachment.worldVerticesLength, this.worldVertices, 0, stride);
|
|
90
|
+
vertices = this.worldVertices;
|
|
91
|
+
verticesCount = attachment.worldVerticesLength >> 1;
|
|
92
|
+
const sequence = attachment.sequence;
|
|
93
|
+
const sequenceIndex = sequence.resolveIndex(pose);
|
|
94
|
+
uvs = sequence.getUVs(sequenceIndex);
|
|
95
|
+
indices = attachment.triangles;
|
|
96
|
+
indicesCount = indices.length;
|
|
97
|
+
texture = sequence.regions[sequenceIndex]?.texture;
|
|
98
|
+
}
|
|
99
|
+
else if (attachment instanceof ClippingAttachment) {
|
|
100
|
+
clipper.clipStart(skeleton, slot, attachment);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const skelColor = skeleton.color;
|
|
107
|
+
let color, darkColor;
|
|
108
|
+
if (pma) {
|
|
109
|
+
let a;
|
|
110
|
+
if (inColor) {
|
|
111
|
+
a = Math.floor(inColor[3] * skelColor.a * slotColor.a * attachmentColor.a * 255);
|
|
112
|
+
const r = Math.floor(a * inColor[0] * skelColor.r * slotColor.r * attachmentColor.r);
|
|
113
|
+
const g = Math.floor(a * inColor[1] * skelColor.g * slotColor.g * attachmentColor.g);
|
|
114
|
+
const b = Math.floor(a * inColor[2] * skelColor.b * slotColor.b * attachmentColor.b);
|
|
115
|
+
color = (a << 24) | (r << 16) | (g << 8) | b;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
a = Math.floor(skelColor.a * slotColor.a * attachmentColor.a * 255);
|
|
119
|
+
const r = Math.floor(a * skelColor.r * slotColor.r * attachmentColor.r);
|
|
120
|
+
const g = Math.floor(a * skelColor.g * slotColor.g * attachmentColor.g);
|
|
121
|
+
const b = Math.floor(a * skelColor.b * slotColor.b * attachmentColor.b);
|
|
122
|
+
color = (a << 24) | (r << 16) | (g << 8) | b;
|
|
123
|
+
}
|
|
124
|
+
darkColor = 0xff000000;
|
|
125
|
+
if (pose.darkColor) {
|
|
126
|
+
const { r, g, b } = pose.darkColor;
|
|
127
|
+
darkColor = 0xff000000 |
|
|
128
|
+
(Math.floor(r * a) << 16) |
|
|
129
|
+
(Math.floor(g * a) << 8) |
|
|
130
|
+
Math.floor(b * a);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
if (inColor) {
|
|
135
|
+
const a = Math.floor(inColor[3] * skelColor.a * slotColor.a * attachmentColor.a * 255);
|
|
136
|
+
const r = Math.floor(inColor[0] * skelColor.r * slotColor.r * attachmentColor.r * 255);
|
|
137
|
+
const g = Math.floor(inColor[1] * skelColor.g * slotColor.g * attachmentColor.g * 255);
|
|
138
|
+
const b = Math.floor(inColor[2] * skelColor.b * slotColor.b * attachmentColor.b * 255);
|
|
139
|
+
color = (a << 24) | (r << 16) | (g << 8) | b;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
const a = Math.floor(skelColor.a * slotColor.a * attachmentColor.a * 255);
|
|
143
|
+
const r = Math.floor(skelColor.r * slotColor.r * attachmentColor.r * 255);
|
|
144
|
+
const g = Math.floor(skelColor.g * slotColor.g * attachmentColor.g * 255);
|
|
145
|
+
const b = Math.floor(skelColor.b * slotColor.b * attachmentColor.b * 255);
|
|
146
|
+
color = (a << 24) | (r << 16) | (g << 8) | b;
|
|
147
|
+
}
|
|
148
|
+
darkColor = 0;
|
|
149
|
+
if (pose.darkColor) {
|
|
150
|
+
const { r, g, b } = pose.darkColor;
|
|
151
|
+
darkColor = (Math.floor(r * 255) << 16) | (Math.floor(g * 255) << 8) | Math.floor(b * 255);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (clipper.isClipping()) {
|
|
155
|
+
clipper.clipTrianglesUnpacked(vertices, 0, indices, indicesCount, uvs, stride);
|
|
156
|
+
vertices = clipper.clippedVerticesTyped;
|
|
157
|
+
verticesCount = clipper.clippedVerticesLength / stride;
|
|
158
|
+
uvs = clipper.clippedUVsTyped;
|
|
159
|
+
indices = clipper.clippedTrianglesTyped;
|
|
160
|
+
indicesCount = clipper.clippedTrianglesLength;
|
|
161
|
+
}
|
|
162
|
+
const cmd = this.commandPool.getCommand(verticesCount, indicesCount, stride);
|
|
163
|
+
cmd.blendMode = slot.data.blendMode;
|
|
164
|
+
cmd.texture = texture;
|
|
165
|
+
cmd.positions.set(vertices.subarray(0, verticesCount * stride));
|
|
166
|
+
cmd.uvs.set(uvs.subarray(0, verticesCount << 1));
|
|
167
|
+
for (let j = 0; j < verticesCount; j++) {
|
|
168
|
+
cmd.colors[j] = color;
|
|
169
|
+
cmd.darkColors[j] = darkColor;
|
|
170
|
+
}
|
|
171
|
+
if (indices instanceof Uint16Array) {
|
|
172
|
+
cmd.indices.set(indices.subarray(0, indicesCount));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
cmd.indices.set(indices.slice(0, indicesCount));
|
|
176
|
+
}
|
|
177
|
+
this.renderCommands.push(cmd);
|
|
178
|
+
clipper.clipEnd(slot);
|
|
179
|
+
}
|
|
180
|
+
clipper.clipEnd();
|
|
181
|
+
return this.batchCommands(stride);
|
|
182
|
+
}
|
|
183
|
+
batchSubCommands(commands, first, last, numVertices, numIndices, stride) {
|
|
184
|
+
const firstCmd = commands[first];
|
|
185
|
+
const batched = this.commandPool.getCommand(numVertices, numIndices, stride);
|
|
186
|
+
batched.blendMode = firstCmd.blendMode;
|
|
187
|
+
batched.texture = firstCmd.texture;
|
|
188
|
+
let positionsOffset = 0;
|
|
189
|
+
let uvsOffset = 0;
|
|
190
|
+
let colorsOffset = 0;
|
|
191
|
+
let indicesOffset = 0;
|
|
192
|
+
let vertexOffset = 0;
|
|
193
|
+
for (let i = first; i <= last; i++) {
|
|
194
|
+
const cmd = commands[i];
|
|
195
|
+
batched.positions.set(cmd.positions, positionsOffset);
|
|
196
|
+
positionsOffset += cmd.numVertices * stride;
|
|
197
|
+
batched.uvs.set(cmd.uvs, uvsOffset);
|
|
198
|
+
uvsOffset += cmd.numVertices << 1;
|
|
199
|
+
batched.colors.set(cmd.colors, colorsOffset);
|
|
200
|
+
batched.darkColors.set(cmd.darkColors, colorsOffset);
|
|
201
|
+
colorsOffset += cmd.numVertices;
|
|
202
|
+
// cannot fast copy - indices need vertex offset adjustment
|
|
203
|
+
for (let j = 0; j < cmd.numIndices; j++)
|
|
204
|
+
batched.indices[indicesOffset + j] = cmd.indices[j] + vertexOffset;
|
|
205
|
+
indicesOffset += cmd.numIndices;
|
|
206
|
+
vertexOffset += cmd.numVertices;
|
|
207
|
+
}
|
|
208
|
+
return batched;
|
|
209
|
+
}
|
|
210
|
+
batchCommands(stride) {
|
|
211
|
+
if (this.renderCommands.length === 0)
|
|
212
|
+
return undefined;
|
|
213
|
+
let root;
|
|
214
|
+
let last;
|
|
215
|
+
let first = this.renderCommands[0];
|
|
216
|
+
let startIndex = 0;
|
|
217
|
+
let i = 1;
|
|
218
|
+
let numVertices = first.numVertices;
|
|
219
|
+
let numIndices = first.numIndices;
|
|
220
|
+
while (i <= this.renderCommands.length) {
|
|
221
|
+
const cmd = i < this.renderCommands.length ? this.renderCommands[i] : null;
|
|
222
|
+
if (cmd && cmd.numVertices === 0 && cmd.numIndices === 0) {
|
|
223
|
+
i++;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const canBatch = cmd !== null &&
|
|
227
|
+
cmd.texture === first.texture &&
|
|
228
|
+
cmd.blendMode === first.blendMode &&
|
|
229
|
+
cmd.colors[0] === first.colors[0] &&
|
|
230
|
+
cmd.darkColors[0] === first.darkColors[0] &&
|
|
231
|
+
numIndices + cmd.numIndices < 0xffff;
|
|
232
|
+
if (canBatch) {
|
|
233
|
+
numVertices += cmd.numVertices;
|
|
234
|
+
numIndices += cmd.numIndices;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
const batched = this.batchSubCommands(this.renderCommands, startIndex, i - 1, numVertices, numIndices, stride);
|
|
238
|
+
if (!last) {
|
|
239
|
+
root = last = batched;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
last.next = batched;
|
|
243
|
+
last = batched;
|
|
244
|
+
}
|
|
245
|
+
if (i === this.renderCommands.length)
|
|
246
|
+
break;
|
|
247
|
+
first = this.renderCommands[i];
|
|
248
|
+
startIndex = i;
|
|
249
|
+
numVertices = first.numVertices;
|
|
250
|
+
numIndices = first.numIndices;
|
|
251
|
+
}
|
|
252
|
+
i++;
|
|
253
|
+
}
|
|
254
|
+
return root;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
class CommandPool {
|
|
258
|
+
pool = [];
|
|
259
|
+
inUse = [];
|
|
260
|
+
getCommand(numVertices, numIndices, stride) {
|
|
261
|
+
let cmd;
|
|
262
|
+
for (const c of this.pool) {
|
|
263
|
+
if (c._positions.length >= numVertices * stride && c._indices.length >= numIndices) {
|
|
264
|
+
cmd = c;
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (!cmd) {
|
|
269
|
+
const _positions = new Float32Array(numVertices * stride);
|
|
270
|
+
const _uvs = new Float32Array(numVertices << 1);
|
|
271
|
+
const _colors = new Uint32Array(numVertices);
|
|
272
|
+
const _darkColors = new Uint32Array(numVertices);
|
|
273
|
+
const _indices = new Uint16Array(numIndices);
|
|
274
|
+
cmd = {
|
|
275
|
+
positions: _positions,
|
|
276
|
+
uvs: _uvs,
|
|
277
|
+
colors: _colors,
|
|
278
|
+
darkColors: _darkColors,
|
|
279
|
+
indices: _indices,
|
|
280
|
+
_positions,
|
|
281
|
+
_uvs,
|
|
282
|
+
_colors,
|
|
283
|
+
_darkColors,
|
|
284
|
+
_indices,
|
|
285
|
+
numVertices,
|
|
286
|
+
numIndices,
|
|
287
|
+
blendMode: BlendMode.Normal,
|
|
288
|
+
texture: null
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
this.pool.splice(this.pool.indexOf(cmd), 1);
|
|
293
|
+
cmd.next = undefined;
|
|
294
|
+
cmd.numVertices = numVertices;
|
|
295
|
+
cmd.numIndices = numIndices;
|
|
296
|
+
cmd.positions = cmd._positions.subarray(0, numVertices * stride);
|
|
297
|
+
cmd.uvs = cmd._uvs.subarray(0, numVertices << 1);
|
|
298
|
+
cmd.colors = cmd._colors.subarray(0, numVertices);
|
|
299
|
+
cmd.darkColors = cmd._darkColors.subarray(0, numVertices);
|
|
300
|
+
cmd.indices = cmd._indices.subarray(0, numIndices);
|
|
301
|
+
}
|
|
302
|
+
this.inUse.push(cmd);
|
|
303
|
+
return cmd;
|
|
304
|
+
}
|
|
305
|
+
reset() {
|
|
306
|
+
this.pool.push(...this.inUse);
|
|
307
|
+
this.inUse.length = 0;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25SZW5kZXJlckNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvU2tlbGV0b25SZW5kZXJlckNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrRUEyQitFO0FBRS9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzFDLE1BQU0sT0FBTyxvQkFBb0I7SUFDeEIsV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDaEMsYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM1QyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUNsQyxjQUFjLEdBQW9CLEVBQUUsQ0FBQztJQUU3QyxNQUFNLENBQUUsUUFBa0IsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFLE9BQTBDLEVBQUUsTUFBTSxHQUFHLENBQUM7UUFDOUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUU5QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFD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SUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsT0FBTyxHQUFHLENBQUM7SUFDWixDQUFDO0lBRUQsS0FBSztRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENsaXBwaW5nQXR0YWNobWVudCwgTWVzaEF0dGFjaG1lbnQsIFJlZ2lvbkF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9pbmRleC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTa2VsZXRvbiB9IGZyb20gXCIuL1NrZWxldG9uLmpzXCI7XG5pbXBvcnQgeyBTa2VsZXRvbkNsaXBwaW5nIH0gZnJvbSBcIi4vU2tlbGV0b25DbGlwcGluZy5qc1wiO1xuaW1wb3J0IHsgQmxlbmRNb2RlIH0gZnJvbSBcIi4vU2xvdERhdGEuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29sb3IsIE51bWJlckFycmF5TGlrZSB9IGZyb20gXCIuL1V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTa2VsZXRvblJlbmRlcmVyQ29yZSB7XG5cdHByaXZhdGUgY29tbWFuZFBvb2wgPSBuZXcgQ29tbWFuZFBvb2woKTtcblx0cHJpdmF0ZSB3b3JsZFZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSgxMiAqIDEwMjQpO1xuXHRwcml2YXRlIHF1YWRJbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KFswLCAxLCAyLCAyLCAzLCAwXSk7XG5cdHByaXZhdGUgY2xpcHBpbmcgPSBuZXcgU2tlbGV0b25DbGlwcGluZygpO1xuXHRwcml2YXRlIHJlbmRlckNvbW1hbmRzOiBSZW5kZXJDb21tYW5kW10gPSBbXTtcblxuXHRyZW5kZXIgKHNrZWxldG9uOiBTa2VsZXRvbiwgcG1hID0gZmFsc2UsIGluQ29sb3I/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlID0gMik6IFJlbmRlckNvbW1hbmQgfCB1bmRlZmluZWQge1xuXHRcdHRoaXMuY29tbWFuZFBvb2wucmVzZXQoKTtcblx0XHR0aGlzLnJlbmRlckNvbW1hbmRzLmxlbmd0aCA9IDA7XG5cblx0XHRjb25zdCBjbGlwcGVyID0gdGhpcy5jbGlwcGluZztcblxuXHRcdGNvbnN0IGRyYXdPcmRlciA9IHNrZWxldG9uLmRyYXdPcmRlci5hcHBsaWVkUG9zZTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNrZWxldG9uLnNsb3RzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBzbG90ID0gZHJhd09yZGVyW2ldO1xuXHRcdFx0Y29uc3QgYXR0YWNobWVudCA9IHNsb3QuYXBwbGllZFBvc2UuYXR0YWNobWVudDtcblxuXHRcdFx0aWYgKCFhdHRhY2htZW50KSB7XG5cdFx0XHRcdGNsaXBwZXIuY2xpcEVuZChzbG90KTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHBvc2UgPSBzbG90LmFwcGxpZWRQb3NlO1xuXHRcdFx0Y29uc3Qgc2xvdENvbG9yID0gcG9zZS5jb2xvcjtcblx0XHRcdGNvbnN0IGFscGhhID0gc2xvdENvbG9yLmE7XG5cdFx0XHRpZiAoKGFscGhhID09PSAwIHx8ICFzbG90LmJvbmUuYWN0aXZlKSAmJiAhKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpKSB7XG5cdFx0XHRcdGNsaXBwZXIuY2xpcEVuZChzbG90KTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGxldCB2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlO1xuXHRcdFx0bGV0IHZlcnRpY2VzQ291bnQ6IG51bWJlcjtcblx0XHRcdGxldCB1dnM6IE51bWJlckFycmF5TGlrZTtcblx0XHRcdGxldCBpbmRpY2VzOiBudW1iZXJbXSB8IFVpbnQxNkFycmF5O1xuXHRcdFx0bGV0IGluZGljZXNDb3VudDogbnVtYmVyO1xuXHRcdFx0bGV0IGF0dGFjaG1lbnRDb2xvcjogQ29sb3I7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHRleHR1cmUgZGVwZW5kcyBvbiB0aGUgcnVudGltZVxuXHRcdFx0bGV0IHRleHR1cmU6IGFueTtcblxuXHRcdFx0aWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBSZWdpb25BdHRhY2htZW50KSB7XG5cdFx0XHRcdGF0dGFjaG1lbnRDb2xvciA9IGF0dGFjaG1lbnQuY29sb3I7XG5cblx0XHRcdFx0aWYgKGF0dGFjaG1lbnRDb2xvci5hID09PSAwKSB7XG5cdFx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgc2VxdWVuY2UgPSBhdHRhY2htZW50LnNlcXVlbmNlO1xuXHRcdFx0XHRjb25zdCBzZXF1ZW5jZUluZGV4ID0gc2VxdWVuY2UucmVzb2x2ZUluZGV4KHBvc2UpO1xuXHRcdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNsb3QsIGF0dGFjaG1lbnQuZ2V0T2Zmc2V0cyhwb3NlKSwgdGhpcy53b3JsZFZlcnRpY2VzLCAwLCBzdHJpZGUpO1xuXG5cdFx0XHRcdHZlcnRpY2VzID0gdGhpcy53b3JsZFZlcnRpY2VzO1xuXHRcdFx0XHR2ZXJ0aWNlc0NvdW50ID0gNDtcblx0XHRcdFx0dXZzID0gc2VxdWVuY2UuZ2V0VVZzKHNlcXVlbmNlSW5kZXgpO1xuXHRcdFx0XHRpbmRpY2VzID0gdGhpcy5xdWFkSW5kaWNlcztcblx0XHRcdFx0aW5kaWNlc0NvdW50ID0gNjtcblx0XHRcdFx0dGV4dHVyZSA9IHNlcXVlbmNlLnJlZ2lvbnNbc2VxdWVuY2VJbmRleF0/LnRleHR1cmU7XG5cblx0XHRcdH0gZWxzZSBpZiAoYXR0YWNobWVudCBpbnN0YW5jZW9mIE1lc2hBdHRhY2htZW50KSB7XG5cdFx0XHRcdGF0dGFjaG1lbnRDb2xvciA9IGF0dGFjaG1lbnQuY29sb3I7XG5cblx0XHRcdFx0aWYgKGF0dGFjaG1lbnRDb2xvci5hID09PSAwKSB7XG5cdFx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRoaXMud29ybGRWZXJ0aWNlcy5sZW5ndGggPCBhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGgpXG5cdFx0XHRcdFx0dGhpcy53b3JsZFZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGgpO1xuXG5cdFx0XHRcdGF0dGFjaG1lbnQuY29tcHV0ZVdvcmxkVmVydGljZXMoc2tlbGV0b24sIHNsb3QsIDAsIGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCwgdGhpcy53b3JsZFZlcnRpY2VzLCAwLCBzdHJpZGUpO1xuXHRcdFx0XHR2ZXJ0aWNlcyA9IHRoaXMud29ybGRWZXJ0aWNlcztcblx0XHRcdFx0dmVydGljZXNDb3VudCA9IGF0dGFjaG1lbnQud29ybGRWZXJ0aWNlc0xlbmd0aCA+PiAxO1xuXG5cdFx0XHRcdGNvbnN0IHNlcXVlbmNlID0gYXR0YWNobWVudC5zZXF1ZW5jZTtcblx0XHRcdFx0Y29uc3Qgc2VxdWVuY2VJbmRleCA9IHNlcXVlbmNlLnJlc29sdmVJbmRleChwb3NlKTtcblxuXHRcdFx0XHR1dnMgPSBzZXF1ZW5jZS5nZXRVVnMoc2VxdWVuY2VJbmRleCk7XG5cdFx0XHRcdGluZGljZXMgPSBhdHRhY2htZW50LnRyaWFuZ2xlcztcblx0XHRcdFx0aW5kaWNlc0NvdW50ID0gaW5kaWNlcy5sZW5ndGg7XG5cdFx0XHRcdHRleHR1cmUgPSBzZXF1ZW5jZS5yZWdpb25zW3NlcXVlbmNlSW5kZXhdPy50ZXh0dXJlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwU3RhcnQoc2tlbGV0b24sIHNsb3QsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBza2VsQ29sb3IgPSBza2VsZXRvbi5jb2xvcjtcblx0XHRcdGxldCBjb2xvcjogbnVtYmVyLCBkYXJrQ29sb3I6IG51bWJlcjtcblx0XHRcdGlmIChwbWEpIHtcblx0XHRcdFx0bGV0IGE6IG51bWJlcjtcblx0XHRcdFx0aWYgKGluQ29sb3IpIHtcblx0XHRcdFx0XHRhID0gTWF0aC5mbG9vcihpbkNvbG9yWzNdICogc2tlbENvbG9yLmEgKiBzbG90Q29sb3IuYSAqIGF0dGFjaG1lbnRDb2xvci5hICogMjU1KTtcblx0XHRcdFx0XHRjb25zdCByID0gTWF0aC5mbG9vcihhICogaW5Db2xvclswXSAqIHNrZWxDb2xvci5yICogc2xvdENvbG9yLnIgKiBhdHRhY2htZW50Q29sb3Iucik7XG5cdFx0XHRcdFx0Y29uc3QgZyA9IE1hdGguZmxvb3IoYSAqIGluQ29sb3JbMV0gKiBza2VsQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmcpO1xuXHRcdFx0XHRcdGNvbnN0IGIgPSBNYXRoLmZsb29yKGEgKiBpbkNvbG9yWzJdICogc2tlbENvbG9yLmIgKiBzbG90Q29sb3IuYiAqIGF0dGFjaG1lbnRDb2xvci5iKTtcblx0XHRcdFx0XHRjb2xvciA9IChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhID0gTWF0aC5mbG9vcihza2VsQ29sb3IuYSAqIHNsb3RDb2xvci5hICogYXR0YWNobWVudENvbG9yLmEgKiAyNTUpO1xuXHRcdFx0XHRcdGNvbnN0IHIgPSBNYXRoLmZsb29yKGEgKiBza2VsQ29sb3IuciAqIHNsb3RDb2xvci5yICogYXR0YWNobWVudENvbG9yLnIpO1xuXHRcdFx0XHRcdGNvbnN0IGcgPSBNYXRoLmZsb29yKGEgKiBza2VsQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmcpO1xuXHRcdFx0XHRcdGNvbnN0IGIgPSBNYXRoLmZsb29yKGEgKiBza2VsQ29sb3IuYiAqIHNsb3RDb2xvci5iICogYXR0YWNobWVudENvbG9yLmIpO1xuXHRcdFx0XHRcdGNvbG9yID0gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGFya0NvbG9yID0gMHhmZjAwMDAwMDtcblx0XHRcdFx0aWYgKHBvc2UuZGFya0NvbG9yKSB7XG5cdFx0XHRcdFx0Y29uc3QgeyByLCBnLCBiIH0gPSBwb3NlLmRhcmtDb2xvcjtcblx0XHRcdFx0XHRkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHxcblx0XHRcdFx0XHRcdChNYXRoLmZsb29yKHIgKiBhKSA8PCAxNikgfFxuXHRcdFx0XHRcdFx0KE1hdGguZmxvb3IoZyAqIGEpIDw8IDgpIHxcblx0XHRcdFx0XHRcdE1hdGguZmxvb3IoYiAqIGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoaW5Db2xvcikge1xuXHRcdFx0XHRcdGNvbnN0IGEgPSBNYXRoLmZsb29yKGluQ29sb3JbM10gKiBza2VsQ29sb3IuYSAqIHNsb3RDb2xvci5hICogYXR0YWNobWVudENvbG9yLmEgKiAyNTUpO1xuXHRcdFx0XHRcdGNvbnN0IHIgPSBNYXRoLmZsb29yKGluQ29sb3JbMF0gKiBza2VsQ29sb3IuciAqIHNsb3RDb2xvci5yICogYXR0YWNobWVudENvbG9yLnIgKiAyNTUpO1xuXHRcdFx0XHRcdGNvbnN0IGcgPSBNYXRoLmZsb29yKGluQ29sb3JbMV0gKiBza2VsQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmcgKiAyNTUpO1xuXHRcdFx0XHRcdGNvbnN0IGIgPSBNYXRoLmZsb29yKGluQ29sb3JbMl0gKiBza2VsQ29sb3IuYiAqIHNsb3RDb2xvci5iICogYXR0YWNobWVudENvbG9yLmIgKiAyNTUpO1xuXHRcdFx0XHRcdGNvbG9yID0gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGEgPSBNYXRoLmZsb29yKHNrZWxDb2xvci5hICogc2xvdENvbG9yLmEgKiBhdHRhY2htZW50Q29sb3IuYSAqIDI1NSk7XG5cdFx0XHRcdFx0Y29uc3QgciA9IE1hdGguZmxvb3Ioc2tlbENvbG9yLnIgKiBzbG90Q29sb3IuciAqIGF0dGFjaG1lbnRDb2xvci5yICogMjU1KTtcblx0XHRcdFx0XHRjb25zdCBnID0gTWF0aC5mbG9vcihza2VsQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmcgKiAyNTUpO1xuXHRcdFx0XHRcdGNvbnN0IGIgPSBNYXRoLmZsb29yKHNrZWxDb2xvci5iICogc2xvdENvbG9yLmIgKiBhdHRhY2htZW50Q29sb3IuYiAqIDI1NSk7XG5cdFx0XHRcdFx0Y29sb3IgPSAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkYXJrQ29sb3IgPSAwO1xuXHRcdFx0XHRpZiAocG9zZS5kYXJrQ29sb3IpIHtcblx0XHRcdFx0XHRjb25zdCB7IHIsIGcsIGIgfSA9IHBvc2UuZGFya0NvbG9yO1xuXHRcdFx0XHRcdGRhcmtDb2xvciA9IChNYXRoLmZsb29yKHIgKiAyNTUpIDw8IDE2KSB8IChNYXRoLmZsb29yKGcgKiAyNTUpIDw8IDgpIHwgTWF0aC5mbG9vcihiICogMjU1KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2xpcHBlci5pc0NsaXBwaW5nKCkpIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwVHJpYW5nbGVzVW5wYWNrZWQodmVydGljZXMsIDAsIGluZGljZXMsIGluZGljZXNDb3VudCwgdXZzLCBzdHJpZGUpO1xuXHRcdFx0XHR2ZXJ0aWNlcyA9IGNsaXBwZXIuY2xpcHBlZFZlcnRpY2VzVHlwZWQ7XG5cdFx0XHRcdHZlcnRpY2VzQ291bnQgPSBjbGlwcGVyLmNsaXBwZWRWZXJ0aWNlc0xlbmd0aCAvIHN0cmlkZTtcblx0XHRcdFx0dXZzID0gY2xpcHBlci5jbGlwcGVkVVZzVHlwZWQ7XG5cdFx0XHRcdGluZGljZXMgPSBjbGlwcGVyLmNsaXBwZWRUcmlhbmdsZXNUeXBlZDtcblx0XHRcdFx0aW5kaWNlc0NvdW50ID0gY2xpcHBlci5jbGlwcGVkVHJpYW5nbGVzTGVuZ3RoO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjbWQgPSB0aGlzLmNvbW1hbmRQb29sLmdldENvbW1hbmQodmVydGljZXNDb3VudCwgaW5kaWNlc0NvdW50LCBzdHJpZGUpO1xuXHRcdFx0Y21kLmJsZW5kTW9kZSA9IHNsb3QuZGF0YS5ibGVuZE1vZGU7XG5cdFx0XHRjbWQudGV4dHVyZSA9IHRleHR1cmU7XG5cblx0XHRcdGNtZC5wb3NpdGlvbnMuc2V0KHZlcnRpY2VzLnN1YmFycmF5KDAsIHZlcnRpY2VzQ291bnQgKiBzdHJpZGUpKTtcblx0XHRcdGNtZC51dnMuc2V0KHV2cy5zdWJhcnJheSgwLCB2ZXJ0aWNlc0NvdW50IDw8IDEpKTtcblxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB2ZXJ0aWNlc0NvdW50OyBqKyspIHtcblx0XHRcdFx0Y21kLmNvbG9yc1tqXSA9IGNvbG9yO1xuXHRcdFx0XHRjbWQuZGFya0NvbG9yc1tqXSA9IGRhcmtDb2xvcjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluZGljZXMgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkge1xuXHRcdFx0XHRjbWQuaW5kaWNlcy5zZXQoaW5kaWNlcy5zdWJhcnJheSgwLCBpbmRpY2VzQ291bnQpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNtZC5pbmRpY2VzLnNldChpbmRpY2VzLnNsaWNlKDAsIGluZGljZXNDb3VudCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJlbmRlckNvbW1hbmRzLnB1c2goY21kKTtcblx0XHRcdGNsaXBwZXIuY2xpcEVuZChzbG90KTtcblx0XHR9XG5cblx0XHRjbGlwcGVyLmNsaXBFbmQoKTtcblx0XHRyZXR1cm4gdGhpcy5iYXRjaENvbW1hbmRzKHN0cmlkZSk7XG5cdH1cblxuXHRwcml2YXRlIGJhdGNoU3ViQ29tbWFuZHMgKGNvbW1hbmRzOiBSZW5kZXJDb21tYW5kW10sIGZpcnN0OiBudW1iZXIsIGxhc3Q6IG51bWJlcixcblx0XHRudW1WZXJ0aWNlczogbnVtYmVyLCBudW1JbmRpY2VzOiBudW1iZXIsIHN0cmlkZTogbnVtYmVyKTogUmVuZGVyQ29tbWFuZCB7XG5cblx0XHRjb25zdCBmaXJzdENtZCA9IGNvbW1hbmRzW2ZpcnN0XTtcblx0XHRjb25zdCBiYXRjaGVkID0gdGhpcy5jb21tYW5kUG9vbC5nZXRDb21tYW5kKG51bVZlcnRpY2VzLCBudW1JbmRpY2VzLCBzdHJpZGUpO1xuXG5cdFx0YmF0Y2hlZC5ibGVuZE1vZGUgPSBmaXJzdENtZC5ibGVuZE1vZGU7XG5cdFx0YmF0Y2hlZC50ZXh0dXJlID0gZmlyc3RDbWQudGV4dHVyZTtcblxuXHRcdGxldCBwb3NpdGlvbnNPZmZzZXQgPSAwO1xuXHRcdGxldCB1dnNPZmZzZXQgPSAwO1xuXHRcdGxldCBjb2xvcnNPZmZzZXQgPSAwO1xuXHRcdGxldCBpbmRpY2VzT2Zmc2V0ID0gMDtcblx0XHRsZXQgdmVydGV4T2Zmc2V0ID0gMDtcblxuXHRcdGZvciAobGV0IGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspIHtcblx0XHRcdGNvbnN0IGNtZCA9IGNvbW1hbmRzW2ldO1xuXG5cdFx0XHRiYXRjaGVkLnBvc2l0aW9ucy5zZXQoY21kLnBvc2l0aW9ucywgcG9zaXRpb25zT2Zmc2V0KTtcblx0XHRcdHBvc2l0aW9uc09mZnNldCArPSBjbWQubnVtVmVydGljZXMgKiBzdHJpZGU7XG5cblx0XHRcdGJhdGNoZWQudXZzLnNldChjbWQudXZzLCB1dnNPZmZzZXQpO1xuXHRcdFx0dXZzT2Zmc2V0ICs9IGNtZC5udW1WZXJ0aWNlcyA8PCAxO1xuXG5cdFx0XHRiYXRjaGVkLmNvbG9ycy5zZXQoY21kLmNvbG9ycywgY29sb3JzT2Zmc2V0KTtcblx0XHRcdGJhdGNoZWQuZGFya0NvbG9ycy5zZXQoY21kLmRhcmtDb2xvcnMsIGNvbG9yc09mZnNldCk7XG5cdFx0XHRjb2xvcnNPZmZzZXQgKz0gY21kLm51bVZlcnRpY2VzO1xuXG5cdFx0XHQvLyBjYW5ub3QgZmFzdCBjb3B5IC0gaW5kaWNlcyBuZWVkIHZlcnRleCBvZmZzZXQgYWRqdXN0bWVudFxuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBjbWQubnVtSW5kaWNlczsgaisrKVxuXHRcdFx0XHRiYXRjaGVkLmluZGljZXNbaW5kaWNlc09mZnNldCArIGpdID0gY21kLmluZGljZXNbal0gKyB2ZXJ0ZXhPZmZzZXQ7XG5cblx0XHRcdGluZGljZXNPZmZzZXQgKz0gY21kLm51bUluZGljZXM7XG5cdFx0XHR2ZXJ0ZXhPZmZzZXQgKz0gY21kLm51bVZlcnRpY2VzO1xuXHRcdH1cblxuXHRcdHJldHVybiBiYXRjaGVkO1xuXHR9XG5cblx0cHJpdmF0ZSBiYXRjaENvbW1hbmRzIChzdHJpZGU6IG51bWJlcik6IFJlbmRlckNvbW1hbmQgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLnJlbmRlckNvbW1hbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdGxldCByb290OiBSZW5kZXJDb21tYW5kIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBsYXN0OiBSZW5kZXJDb21tYW5kIHwgdW5kZWZpbmVkO1xuXG5cdFx0bGV0IGZpcnN0ID0gdGhpcy5yZW5kZXJDb21tYW5kc1swXTtcblx0XHRsZXQgc3RhcnRJbmRleCA9IDA7XG5cdFx0bGV0IGkgPSAxO1xuXHRcdGxldCBudW1WZXJ0aWNlcyA9IGZpcnN0Lm51bVZlcnRpY2VzO1xuXHRcdGxldCBudW1JbmRpY2VzID0gZmlyc3QubnVtSW5kaWNlcztcblxuXHRcdHdoaWxlIChpIDw9IHRoaXMucmVuZGVyQ29tbWFuZHMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBjbWQgPSBpIDwgdGhpcy5yZW5kZXJDb21tYW5kcy5sZW5ndGggPyB0aGlzLnJlbmRlckNvbW1hbmRzW2ldIDogbnVsbDtcblxuXHRcdFx0aWYgKGNtZCAmJiBjbWQubnVtVmVydGljZXMgPT09IDAgJiYgY21kLm51bUluZGljZXMgPT09IDApIHtcblx0XHRcdFx0aSsrO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuQmF0Y2ggPSBjbWQgIT09IG51bGwgJiZcblx0XHRcdFx0Y21kLnRleHR1cmUgPT09IGZpcnN0LnRleHR1cmUgJiZcblx0XHRcdFx0Y21kLmJsZW5kTW9kZSA9PT0gZmlyc3QuYmxlbmRNb2RlICYmXG5cdFx0XHRcdGNtZC5jb2xvcnNbMF0gPT09IGZpcnN0LmNvbG9yc1swXSAmJlxuXHRcdFx0XHRjbWQuZGFya0NvbG9yc1swXSA9PT0gZmlyc3QuZGFya0NvbG9yc1swXSAmJlxuXHRcdFx0XHRudW1JbmRpY2VzICsgY21kLm51bUluZGljZXMgPCAweGZmZmY7XG5cdFx0XHRpZiAoY2FuQmF0Y2gpIHtcblx0XHRcdFx0bnVtVmVydGljZXMgKz0gY21kLm51bVZlcnRpY2VzO1xuXHRcdFx0XHRudW1JbmRpY2VzICs9IGNtZC5udW1JbmRpY2VzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYmF0Y2hlZCA9IHRoaXMuYmF0Y2hTdWJDb21tYW5kcyh0aGlzLnJlbmRlckNvbW1hbmRzLCBzdGFydEluZGV4LCBpIC0gMSxcblx0XHRcdFx0XHRudW1WZXJ0aWNlcywgbnVtSW5kaWNlcywgc3RyaWRlKTtcblxuXHRcdFx0XHRpZiAoIWxhc3QpIHtcblx0XHRcdFx0XHRyb290ID0gbGFzdCA9IGJhdGNoZWQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGFzdC5uZXh0ID0gYmF0Y2hlZDtcblx0XHRcdFx0XHRsYXN0ID0gYmF0Y2hlZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpID09PSB0aGlzLnJlbmRlckNvbW1hbmRzLmxlbmd0aCkgYnJlYWs7XG5cblx0XHRcdFx0Zmlyc3QgPSB0aGlzLnJlbmRlckNvbW1hbmRzW2ldO1xuXHRcdFx0XHRzdGFydEluZGV4ID0gaTtcblx0XHRcdFx0bnVtVmVydGljZXMgPSBmaXJzdC5udW1WZXJ0aWNlcztcblx0XHRcdFx0bnVtSW5kaWNlcyA9IGZpcnN0Lm51bUluZGljZXM7XG5cdFx0XHR9XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJvb3Q7XG5cdH1cbn1cblxuLy8gdmFsdWVzIHdpdGggdW5kZXIgc2NvcmUgaXMgdGhlIG9yaWdpbmFsIHNpemVkIGFycmF5LCBiaWdnZXIgdGhhbiBuZWNlc3Nhcnlcbi8vIHZhbHVlcyB3aXRob3V0IHVuZGVyIHNjb3JlIGlzIGEgdmlldyBvZiB0aGUgb3JpZ25hbCBhcnJheSwgc2l6ZWQgYXMgbmVlZGVkXG5pbnRlcmZhY2UgUmVuZGVyQ29tbWFuZCB7XG5cdHBvc2l0aW9uczogRmxvYXQzMkFycmF5O1xuXHR1dnM6IEZsb2F0MzJBcnJheTtcblx0Y29sb3JzOiBVaW50MzJBcnJheTtcblx0ZGFya0NvbG9yczogVWludDMyQXJyYXk7XG5cdGluZGljZXM6IFVpbnQxNkFycmF5O1xuXHRfcG9zaXRpb25zOiBGbG9hdDMyQXJyYXk7XG5cdF91dnM6IEZsb2F0MzJBcnJheTtcblx0X2NvbG9yczogVWludDMyQXJyYXk7XG5cdF9kYXJrQ29sb3JzOiBVaW50MzJBcnJheTtcblx0X2luZGljZXM6IFVpbnQxNkFycmF5O1xuXHRudW1WZXJ0aWNlczogbnVtYmVyO1xuXHRudW1JbmRpY2VzOiBudW1iZXI7XG5cdGJsZW5kTW9kZTogQmxlbmRNb2RlO1xuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IHRleHR1cmUgZGVwZW5kcyBvbiB0aGUgcnVudGltZVxuXHR0ZXh0dXJlOiBhbnk7XG5cdG5leHQ/OiBSZW5kZXJDb21tYW5kO1xufVxuXG5jbGFzcyBDb21tYW5kUG9vbCB7XG5cdHByaXZhdGUgcG9vbDogUmVuZGVyQ29tbWFuZFtdID0gW107XG5cdHByaXZhdGUgaW5Vc2U6IFJlbmRlckNvbW1hbmRbXSA9IFtdO1xuXG5cdGdldENvbW1hbmQgKG51bVZlcnRpY2VzOiBudW1iZXIsIG51bUluZGljZXM6IG51bWJlciwgc3RyaWRlOiBudW1iZXIpOiBSZW5kZXJDb21tYW5kIHtcblx0XHRsZXQgY21kOiBSZW5kZXJDb21tYW5kIHwgdW5kZWZpbmVkO1xuXHRcdGZvciAoY29uc3QgYyBvZiB0aGlzLnBvb2wpIHtcblx0XHRcdGlmIChjLl9wb3NpdGlvbnMubGVuZ3RoID49IG51bVZlcnRpY2VzICogc3RyaWRlICYmIGMuX2luZGljZXMubGVuZ3RoID49IG51bUluZGljZXMpIHtcblx0XHRcdFx0Y21kID0gYztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCFjbWQpIHtcblx0XHRcdGNvbnN0IF9wb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzICogc3RyaWRlKTtcblx0XHRcdGNvbnN0IF91dnMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVZlcnRpY2VzIDw8IDEpO1xuXHRcdFx0Y29uc3QgX2NvbG9ycyA9IG5ldyBVaW50MzJBcnJheShudW1WZXJ0aWNlcyk7XG5cdFx0XHRjb25zdCBfZGFya0NvbG9ycyA9IG5ldyBVaW50MzJBcnJheShudW1WZXJ0aWNlcyk7XG5cdFx0XHRjb25zdCBfaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheShudW1JbmRpY2VzKTtcblx0XHRcdGNtZCA9IHtcblx0XHRcdFx0cG9zaXRpb25zOiBfcG9zaXRpb25zLFxuXHRcdFx0XHR1dnM6IF91dnMsXG5cdFx0XHRcdGNvbG9yczogX2NvbG9ycyxcblx0XHRcdFx0ZGFya0NvbG9yczogX2RhcmtDb2xvcnMsXG5cdFx0XHRcdGluZGljZXM6IF9pbmRpY2VzLFxuXHRcdFx0XHRfcG9zaXRpb25zLFxuXHRcdFx0XHRfdXZzLFxuXHRcdFx0XHRfY29sb3JzLFxuXHRcdFx0XHRfZGFya0NvbG9ycyxcblx0XHRcdFx0X2luZGljZXMsXG5cdFx0XHRcdG51bVZlcnRpY2VzLFxuXHRcdFx0XHRudW1JbmRpY2VzLFxuXHRcdFx0XHRibGVuZE1vZGU6IEJsZW5kTW9kZS5Ob3JtYWwsXG5cdFx0XHRcdHRleHR1cmU6IG51bGxcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9vbC5zcGxpY2UodGhpcy5wb29sLmluZGV4T2YoY21kKSwgMSk7XG5cdFx0XHRjbWQubmV4dCA9IHVuZGVmaW5lZDtcblx0XHRcdGNtZC5udW1WZXJ0aWNlcyA9IG51bVZlcnRpY2VzO1xuXHRcdFx0Y21kLm51bUluZGljZXMgPSBudW1JbmRpY2VzO1xuXG5cdFx0XHRjbWQucG9zaXRpb25zID0gY21kLl9wb3NpdGlvbnMuc3ViYXJyYXkoMCwgbnVtVmVydGljZXMgKiBzdHJpZGUpO1xuXHRcdFx0Y21kLnV2cyA9IGNtZC5fdXZzLnN1YmFycmF5KDAsIG51bVZlcnRpY2VzIDw8IDEpO1xuXHRcdFx0Y21kLmNvbG9ycyA9IGNtZC5fY29sb3JzLnN1YmFycmF5KDAsIG51bVZlcnRpY2VzKTtcblx0XHRcdGNtZC5kYXJrQ29sb3JzID0gY21kLl9kYXJrQ29sb3JzLnN1YmFycmF5KDAsIG51bVZlcnRpY2VzKTtcblx0XHRcdGNtZC5pbmRpY2VzID0gY21kLl9pbmRpY2VzLnN1YmFycmF5KDAsIG51bUluZGljZXMpO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5Vc2UucHVzaChjbWQpO1xuXHRcdHJldHVybiBjbWQ7XG5cdH1cblxuXHRyZXNldCAoKTogdm9pZCB7XG5cdFx0dGhpcy5wb29sLnB1c2goLi4udGhpcy5pblVzZSk7XG5cdFx0dGhpcy5pblVzZS5sZW5ndGggPSAwO1xuXHR9XG59Il19
|
package/dist/Skin.d.ts
CHANGED
|
@@ -26,42 +26,46 @@
|
|
|
26
26
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
27
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
28
|
*****************************************************************************/
|
|
29
|
-
import { Attachment } from "./attachments/Attachment.js";
|
|
30
|
-
import { BoneData } from "./BoneData.js";
|
|
31
|
-
import { ConstraintData } from "./ConstraintData.js";
|
|
32
|
-
import { Skeleton } from "./Skeleton.js";
|
|
33
|
-
import { Color, StringMap } from "./Utils.js";
|
|
29
|
+
import type { Attachment } from "./attachments/Attachment.js";
|
|
30
|
+
import type { BoneData } from "./BoneData.js";
|
|
31
|
+
import type { ConstraintData } from "./ConstraintData.js";
|
|
32
|
+
import type { Skeleton } from "./Skeleton.js";
|
|
33
|
+
import { Color, type StringMap } from "./Utils.js";
|
|
34
34
|
/** Stores an entry in the skin consisting of the slot index, name, and attachment **/
|
|
35
35
|
export declare class SkinEntry {
|
|
36
|
+
/** The {@link Skeleton.slots} index. */
|
|
36
37
|
slotIndex: number;
|
|
37
|
-
|
|
38
|
+
placeholder: string;
|
|
39
|
+
/** The attachment for this skin entry. */
|
|
38
40
|
attachment: Attachment;
|
|
39
|
-
constructor(slotIndex: number | undefined,
|
|
41
|
+
constructor(slotIndex: number | undefined, placeholder: string, attachment: Attachment);
|
|
40
42
|
}
|
|
41
|
-
/** Stores attachments by slot index and
|
|
43
|
+
/** Stores attachments by slot index and placeholder name. Multiple {@link Skeleton} instances can use the same skins.
|
|
42
44
|
*
|
|
43
|
-
* See
|
|
45
|
+
* See {@link SkeletonData.defaultSkin}, {@link Skeleton.skin}, and
|
|
44
46
|
* [Runtime skins](http://esotericsoftware.com/spine-runtime-skins) in the Spine Runtimes Guide. */
|
|
45
47
|
export declare class Skin {
|
|
46
|
-
/** The skin's name,
|
|
48
|
+
/** The skin's name, unique across all skins in the skeleton.
|
|
49
|
+
*
|
|
50
|
+
* See {@link SkeletonData.findSkin}. */
|
|
47
51
|
name: string;
|
|
48
52
|
attachments: StringMap<Attachment>[];
|
|
49
53
|
bones: BoneData[];
|
|
50
|
-
constraints: ConstraintData[];
|
|
54
|
+
constraints: ConstraintData<any, any>[];
|
|
51
55
|
/** The color of the skin as it was in Spine, or a default color if nonessential data was not exported. */
|
|
52
56
|
color: Color;
|
|
53
57
|
constructor(name: string);
|
|
54
58
|
/** Adds an attachment to the skin for the specified slot index and name. */
|
|
55
|
-
setAttachment(slotIndex: number,
|
|
59
|
+
setAttachment(slotIndex: number, placeholder: string, attachment: Attachment): void;
|
|
56
60
|
/** Adds all attachments, bones, and constraints from the specified skin to this skin. */
|
|
57
61
|
addSkin(skin: Skin): void;
|
|
58
62
|
/** Adds all bones and constraints and copies of all attachments from the specified skin to this skin. Mesh attachments are not
|
|
59
63
|
* copied, instead a new linked mesh is created. The attachment copies can be modified without affecting the originals. */
|
|
60
64
|
copySkin(skin: Skin): void;
|
|
61
|
-
/** Returns the attachment for the specified slot index and
|
|
62
|
-
getAttachment(slotIndex: number,
|
|
63
|
-
/** Removes the attachment in the skin for the specified slot index and
|
|
64
|
-
removeAttachment(slotIndex: number,
|
|
65
|
+
/** Returns the attachment for the specified slot index and placeholder, or null. */
|
|
66
|
+
getAttachment(slotIndex: number, placeholder: string): Attachment | null;
|
|
67
|
+
/** Removes the attachment in the skin for the specified slot index and placeholder, if any. */
|
|
68
|
+
removeAttachment(slotIndex: number, placeholder: string): void;
|
|
65
69
|
/** Returns all attachments in this skin. */
|
|
66
70
|
getAttachments(): Array<SkinEntry>;
|
|
67
71
|
/** Returns all attachments in this skin for the specified slot index. */
|