@esotericsoftware/spine-core 4.0.11 → 4.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Animation.d.ts +363 -363
- package/dist/Animation.js +1949 -1949
- package/dist/AnimationState.d.ts +396 -396
- package/dist/AnimationState.js +958 -958
- package/dist/AnimationStateData.d.ts +51 -51
- package/dist/AnimationStateData.js +69 -69
- package/dist/AssetManagerBase.d.ts +72 -72
- package/dist/AssetManagerBase.js +303 -303
- package/dist/AtlasAttachmentLoader.d.ts +51 -51
- package/dist/AtlasAttachmentLoader.js +73 -73
- package/dist/Bone.d.ts +138 -138
- package/dist/Bone.js +333 -333
- package/dist/BoneData.d.ts +72 -72
- package/dist/BoneData.js +73 -73
- package/dist/ConstraintData.d.ts +35 -35
- package/dist/ConstraintData.js +36 -36
- package/dist/Event.d.ts +44 -44
- package/dist/Event.js +41 -41
- package/dist/EventData.d.ts +41 -41
- package/dist/EventData.js +36 -36
- package/dist/IkConstraint.d.ts +64 -64
- package/dist/IkConstraint.js +284 -284
- package/dist/IkConstraintData.d.ts +54 -54
- package/dist/IkConstraintData.js +53 -53
- package/dist/PathConstraint.d.ts +71 -71
- package/dist/PathConstraint.js +468 -468
- package/dist/PathConstraintData.d.ts +80 -80
- package/dist/PathConstraintData.js +69 -69
- package/dist/Skeleton.d.ts +158 -158
- package/dist/Skeleton.js +570 -570
- package/dist/SkeletonBinary.d.ts +67 -67
- package/dist/SkeletonBinary.js +1093 -1093
- 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 +166 -166
- package/dist/SkeletonJson.d.ts +51 -51
- package/dist/SkeletonJson.js +915 -915
- package/dist/Skin.d.ts +71 -71
- package/dist/Skin.js +200 -200
- package/dist/Slot.d.ts +72 -72
- package/dist/Slot.js +93 -93
- package/dist/SlotData.d.ts +57 -57
- package/dist/SlotData.js +54 -54
- package/dist/Texture.d.ts +69 -69
- package/dist/Texture.js +72 -72
- package/dist/TextureAtlas.d.ts +65 -65
- package/dist/TextureAtlas.js +245 -245
- package/dist/TransformConstraint.d.ts +60 -60
- package/dist/TransformConstraint.js +239 -239
- package/dist/TransformConstraintData.d.ts +60 -60
- package/dist/TransformConstraintData.js +59 -59
- 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 +71 -71
- package/dist/attachments/Attachment.js +139 -139
- package/dist/attachments/AttachmentLoader.d.ts +53 -53
- 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 +47 -47
- package/dist/attachments/MeshAttachment.d.ts +74 -74
- package/dist/attachments/MeshAttachment.js +159 -159
- package/dist/attachments/PathAttachment.d.ts +47 -47
- package/dist/attachments/PathAttachment.js +56 -56
- package/dist/attachments/PointAttachment.d.ts +48 -48
- package/dist/attachments/PointAttachment.js +62 -62
- package/dist/attachments/RegionAttachment.d.ts +108 -108
- package/dist/attachments/RegionAttachment.js +196 -196
- package/dist/attachments/index.d.ts +8 -8
- package/dist/attachments/index.js +8 -8
- package/dist/iife/spine-core.js +3 -3
- package/dist/iife/spine-core.js.map +2 -2
- package/dist/iife/spine-core.min.js +1 -1
- 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/SkeletonJson.js
CHANGED
|
@@ -1,916 +1,916 @@
|
|
|
1
|
-
/******************************************************************************
|
|
2
|
-
* Spine Runtimes License Agreement
|
|
3
|
-
* Last updated January 1, 2020. Replaces all prior versions.
|
|
4
|
-
*
|
|
5
|
-
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
6
|
-
*
|
|
7
|
-
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
-
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
-
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
-
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
-
*
|
|
12
|
-
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
-
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
-
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
-
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
-
* include this license and copyright notice.
|
|
17
|
-
*
|
|
18
|
-
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
-
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
-
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
-
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
-
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
-
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
-
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
-
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
-
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
-
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
-
*****************************************************************************/
|
|
29
|
-
import { Animation, AttachmentTimeline, RGBATimeline, RGBTimeline, AlphaTimeline, RGBA2Timeline, RGB2Timeline, RotateTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, IkConstraintTimeline, TransformConstraintTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PathConstraintMixTimeline, DeformTimeline, DrawOrderTimeline, EventTimeline } from "./Animation";
|
|
30
|
-
import { BoneData, TransformMode } from "./BoneData";
|
|
31
|
-
import { EventData } from "./EventData";
|
|
32
|
-
import { Event } from "./Event";
|
|
33
|
-
import { IkConstraintData } from "./IkConstraintData";
|
|
34
|
-
import { PathConstraintData, PositionMode, SpacingMode, RotateMode } from "./PathConstraintData";
|
|
35
|
-
import { SkeletonData } from "./SkeletonData";
|
|
36
|
-
import { Skin } from "./Skin";
|
|
37
|
-
import { SlotData, BlendMode } from "./SlotData";
|
|
38
|
-
import { TransformConstraintData } from "./TransformConstraintData";
|
|
39
|
-
import { Utils, Color } from "./Utils";
|
|
40
|
-
/** Loads skeleton data in the Spine JSON format.
|
|
41
|
-
*
|
|
42
|
-
* See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
|
|
43
|
-
* [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
|
|
44
|
-
* Runtimes Guide. */
|
|
45
|
-
export class SkeletonJson {
|
|
46
|
-
constructor(attachmentLoader) {
|
|
47
|
-
/** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
|
|
48
|
-
* runtime than were used in Spine.
|
|
49
|
-
*
|
|
50
|
-
* See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
|
|
51
|
-
this.scale = 1;
|
|
52
|
-
this.linkedMeshes = new Array();
|
|
53
|
-
this.attachmentLoader = attachmentLoader;
|
|
54
|
-
}
|
|
55
|
-
readSkeletonData(json) {
|
|
56
|
-
let scale = this.scale;
|
|
57
|
-
let skeletonData = new SkeletonData();
|
|
58
|
-
let root = typeof (json) === "string" ? JSON.parse(json) : json;
|
|
59
|
-
// Skeleton
|
|
60
|
-
let skeletonMap = root.skeleton;
|
|
61
|
-
if (skeletonMap) {
|
|
62
|
-
skeletonData.hash = skeletonMap.hash;
|
|
63
|
-
skeletonData.version = skeletonMap.spine;
|
|
64
|
-
skeletonData.x = skeletonMap.x;
|
|
65
|
-
skeletonData.y = skeletonMap.y;
|
|
66
|
-
skeletonData.width = skeletonMap.width;
|
|
67
|
-
skeletonData.height = skeletonMap.height;
|
|
68
|
-
skeletonData.fps = skeletonMap.fps;
|
|
69
|
-
skeletonData.imagesPath = skeletonMap.images;
|
|
70
|
-
}
|
|
71
|
-
// Bones
|
|
72
|
-
if (root.bones) {
|
|
73
|
-
for (let i = 0; i < root.bones.length; i++) {
|
|
74
|
-
let boneMap = root.bones[i];
|
|
75
|
-
let parent = null;
|
|
76
|
-
let parentName = getValue(boneMap, "parent", null);
|
|
77
|
-
if (parentName)
|
|
78
|
-
parent = skeletonData.findBone(parentName);
|
|
79
|
-
let data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
|
|
80
|
-
data.length = getValue(boneMap, "length", 0) * scale;
|
|
81
|
-
data.x = getValue(boneMap, "x", 0) * scale;
|
|
82
|
-
data.y = getValue(boneMap, "y", 0) * scale;
|
|
83
|
-
data.rotation = getValue(boneMap, "rotation", 0);
|
|
84
|
-
data.scaleX = getValue(boneMap, "scaleX", 1);
|
|
85
|
-
data.scaleY = getValue(boneMap, "scaleY", 1);
|
|
86
|
-
data.shearX = getValue(boneMap, "shearX", 0);
|
|
87
|
-
data.shearY = getValue(boneMap, "shearY", 0);
|
|
88
|
-
data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, "transform", "Normal"));
|
|
89
|
-
data.skinRequired = getValue(boneMap, "skin", false);
|
|
90
|
-
let color = getValue(boneMap, "color", null);
|
|
91
|
-
if (color)
|
|
92
|
-
data.color.setFromString(color);
|
|
93
|
-
skeletonData.bones.push(data);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
// Slots.
|
|
97
|
-
if (root.slots) {
|
|
98
|
-
for (let i = 0; i < root.slots.length; i++) {
|
|
99
|
-
let slotMap = root.slots[i];
|
|
100
|
-
let boneData = skeletonData.findBone(slotMap.bone);
|
|
101
|
-
let data = new SlotData(skeletonData.slots.length, slotMap.name, boneData);
|
|
102
|
-
let color = getValue(slotMap, "color", null);
|
|
103
|
-
if (color)
|
|
104
|
-
data.color.setFromString(color);
|
|
105
|
-
let dark = getValue(slotMap, "dark", null);
|
|
106
|
-
if (dark)
|
|
107
|
-
data.darkColor = Color.fromString(dark);
|
|
108
|
-
data.attachmentName = getValue(slotMap, "attachment", null);
|
|
109
|
-
data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal"));
|
|
110
|
-
skeletonData.slots.push(data);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// IK constraints
|
|
114
|
-
if (root.ik) {
|
|
115
|
-
for (let i = 0; i < root.ik.length; i++) {
|
|
116
|
-
let constraintMap = root.ik[i];
|
|
117
|
-
let data = new IkConstraintData(constraintMap.name);
|
|
118
|
-
data.order = getValue(constraintMap, "order", 0);
|
|
119
|
-
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
120
|
-
for (let ii = 0; ii < constraintMap.bones.length; ii++)
|
|
121
|
-
data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
|
|
122
|
-
data.target = skeletonData.findBone(constraintMap.target);
|
|
123
|
-
data.mix = getValue(constraintMap, "mix", 1);
|
|
124
|
-
data.softness = getValue(constraintMap, "softness", 0) * scale;
|
|
125
|
-
data.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1;
|
|
126
|
-
data.compress = getValue(constraintMap, "compress", false);
|
|
127
|
-
data.stretch = getValue(constraintMap, "stretch", false);
|
|
128
|
-
data.uniform = getValue(constraintMap, "uniform", false);
|
|
129
|
-
skeletonData.ikConstraints.push(data);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// Transform constraints.
|
|
133
|
-
if (root.transform) {
|
|
134
|
-
for (let i = 0; i < root.transform.length; i++) {
|
|
135
|
-
let constraintMap = root.transform[i];
|
|
136
|
-
let data = new TransformConstraintData(constraintMap.name);
|
|
137
|
-
data.order = getValue(constraintMap, "order", 0);
|
|
138
|
-
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
139
|
-
for (let ii = 0; ii < constraintMap.bones.length; ii++)
|
|
140
|
-
data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
|
|
141
|
-
let targetName = constraintMap.target;
|
|
142
|
-
data.target = skeletonData.findBone(targetName);
|
|
143
|
-
data.local = getValue(constraintMap, "local", false);
|
|
144
|
-
data.relative = getValue(constraintMap, "relative", false);
|
|
145
|
-
data.offsetRotation = getValue(constraintMap, "rotation", 0);
|
|
146
|
-
data.offsetX = getValue(constraintMap, "x", 0) * scale;
|
|
147
|
-
data.offsetY = getValue(constraintMap, "y", 0) * scale;
|
|
148
|
-
data.offsetScaleX = getValue(constraintMap, "scaleX", 0);
|
|
149
|
-
data.offsetScaleY = getValue(constraintMap, "scaleY", 0);
|
|
150
|
-
data.offsetShearY = getValue(constraintMap, "shearY", 0);
|
|
151
|
-
data.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
152
|
-
data.mixX = getValue(constraintMap, "mixX", 1);
|
|
153
|
-
data.mixY = getValue(constraintMap, "mixY", data.mixX);
|
|
154
|
-
data.mixScaleX = getValue(constraintMap, "mixScaleX", 1);
|
|
155
|
-
data.mixScaleY = getValue(constraintMap, "mixScaleY", data.mixScaleX);
|
|
156
|
-
data.mixShearY = getValue(constraintMap, "mixShearY", 1);
|
|
157
|
-
skeletonData.transformConstraints.push(data);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// Path constraints.
|
|
161
|
-
if (root.path) {
|
|
162
|
-
for (let i = 0; i < root.path.length; i++) {
|
|
163
|
-
let constraintMap = root.path[i];
|
|
164
|
-
let data = new PathConstraintData(constraintMap.name);
|
|
165
|
-
data.order = getValue(constraintMap, "order", 0);
|
|
166
|
-
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
167
|
-
for (let ii = 0; ii < constraintMap.bones.length; ii++)
|
|
168
|
-
data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
|
|
169
|
-
let targetName = constraintMap.target;
|
|
170
|
-
data.target = skeletonData.findSlot(targetName);
|
|
171
|
-
data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
|
|
172
|
-
data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
|
|
173
|
-
data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
|
|
174
|
-
data.offsetRotation = getValue(constraintMap, "rotation", 0);
|
|
175
|
-
data.position = getValue(constraintMap, "position", 0);
|
|
176
|
-
if (data.positionMode == PositionMode.Fixed)
|
|
177
|
-
data.position *= scale;
|
|
178
|
-
data.spacing = getValue(constraintMap, "spacing", 0);
|
|
179
|
-
if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
|
|
180
|
-
data.spacing *= scale;
|
|
181
|
-
data.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
182
|
-
data.mixX = getValue(constraintMap, "mixX", 1);
|
|
183
|
-
data.mixY = getValue(constraintMap, "mixY", data.mixX);
|
|
184
|
-
skeletonData.pathConstraints.push(data);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
// Skins.
|
|
188
|
-
if (root.skins) {
|
|
189
|
-
for (let i = 0; i < root.skins.length; i++) {
|
|
190
|
-
let skinMap = root.skins[i];
|
|
191
|
-
let skin = new Skin(skinMap.name);
|
|
192
|
-
if (skinMap.bones) {
|
|
193
|
-
for (let ii = 0; ii < skinMap.bones.length; ii++)
|
|
194
|
-
skin.bones.push(skeletonData.findBone(skinMap.bones[ii]));
|
|
195
|
-
}
|
|
196
|
-
if (skinMap.ik) {
|
|
197
|
-
for (let ii = 0; ii < skinMap.ik.length; ii++)
|
|
198
|
-
skin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii]));
|
|
199
|
-
}
|
|
200
|
-
if (skinMap.transform) {
|
|
201
|
-
for (let ii = 0; ii < skinMap.transform.length; ii++)
|
|
202
|
-
skin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii]));
|
|
203
|
-
}
|
|
204
|
-
if (skinMap.path) {
|
|
205
|
-
for (let ii = 0; ii < skinMap.path.length; ii++)
|
|
206
|
-
skin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii]));
|
|
207
|
-
}
|
|
208
|
-
for (let slotName in skinMap.attachments) {
|
|
209
|
-
let slot = skeletonData.findSlot(slotName);
|
|
210
|
-
let slotMap = skinMap.attachments[slotName];
|
|
211
|
-
for (let entryName in slotMap) {
|
|
212
|
-
let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
|
|
213
|
-
if (attachment)
|
|
214
|
-
skin.setAttachment(slot.index, entryName, attachment);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
skeletonData.skins.push(skin);
|
|
218
|
-
if (skin.name == "default")
|
|
219
|
-
skeletonData.defaultSkin = skin;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
// Linked meshes.
|
|
223
|
-
for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
|
|
224
|
-
let linkedMesh = this.linkedMeshes[i];
|
|
225
|
-
let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
|
|
226
|
-
let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
|
|
227
|
-
linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
|
|
228
|
-
linkedMesh.mesh.setParentMesh(parent);
|
|
229
|
-
linkedMesh.mesh.updateUVs();
|
|
230
|
-
}
|
|
231
|
-
this.linkedMeshes.length = 0;
|
|
232
|
-
// Events.
|
|
233
|
-
if (root.events) {
|
|
234
|
-
for (let eventName in root.events) {
|
|
235
|
-
let eventMap = root.events[eventName];
|
|
236
|
-
let data = new EventData(eventName);
|
|
237
|
-
data.intValue = getValue(eventMap, "int", 0);
|
|
238
|
-
data.floatValue = getValue(eventMap, "float", 0);
|
|
239
|
-
data.stringValue = getValue(eventMap, "string", "");
|
|
240
|
-
data.audioPath = getValue(eventMap, "audio", null);
|
|
241
|
-
if (data.audioPath) {
|
|
242
|
-
data.volume = getValue(eventMap, "volume", 1);
|
|
243
|
-
data.balance = getValue(eventMap, "balance", 0);
|
|
244
|
-
}
|
|
245
|
-
skeletonData.events.push(data);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
// Animations.
|
|
249
|
-
if (root.animations) {
|
|
250
|
-
for (let animationName in root.animations) {
|
|
251
|
-
let animationMap = root.animations[animationName];
|
|
252
|
-
this.readAnimation(animationMap, animationName, skeletonData);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return skeletonData;
|
|
256
|
-
}
|
|
257
|
-
readAttachment(map, skin, slotIndex, name, skeletonData) {
|
|
258
|
-
let scale = this.scale;
|
|
259
|
-
name = getValue(map, "name", name);
|
|
260
|
-
switch (getValue(map, "type", "region")) {
|
|
261
|
-
case "region": {
|
|
262
|
-
let path = getValue(map, "path", name);
|
|
263
|
-
let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
|
|
264
|
-
if (!region)
|
|
265
|
-
return null;
|
|
266
|
-
region.path = path;
|
|
267
|
-
region.x = getValue(map, "x", 0) * scale;
|
|
268
|
-
region.y = getValue(map, "y", 0) * scale;
|
|
269
|
-
region.scaleX = getValue(map, "scaleX", 1);
|
|
270
|
-
region.scaleY = getValue(map, "scaleY", 1);
|
|
271
|
-
region.rotation = getValue(map, "rotation", 0);
|
|
272
|
-
region.width = map.width * scale;
|
|
273
|
-
region.height = map.height * scale;
|
|
274
|
-
let color = getValue(map, "color", null);
|
|
275
|
-
if (color)
|
|
276
|
-
region.color.setFromString(color);
|
|
277
|
-
region.updateOffset();
|
|
278
|
-
return region;
|
|
279
|
-
}
|
|
280
|
-
case "boundingbox": {
|
|
281
|
-
let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
|
|
282
|
-
if (!box)
|
|
283
|
-
return null;
|
|
284
|
-
this.readVertices(map, box, map.vertexCount << 1);
|
|
285
|
-
let color = getValue(map, "color", null);
|
|
286
|
-
if (color)
|
|
287
|
-
box.color.setFromString(color);
|
|
288
|
-
return box;
|
|
289
|
-
}
|
|
290
|
-
case "mesh":
|
|
291
|
-
case "linkedmesh": {
|
|
292
|
-
let path = getValue(map, "path", name);
|
|
293
|
-
let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
|
|
294
|
-
if (!mesh)
|
|
295
|
-
return null;
|
|
296
|
-
mesh.path = path;
|
|
297
|
-
let color = getValue(map, "color", null);
|
|
298
|
-
if (color)
|
|
299
|
-
mesh.color.setFromString(color);
|
|
300
|
-
mesh.width = getValue(map, "width", 0) * scale;
|
|
301
|
-
mesh.height = getValue(map, "height", 0) * scale;
|
|
302
|
-
let parent = getValue(map, "parent", null);
|
|
303
|
-
if (parent) {
|
|
304
|
-
this.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, "skin", null), slotIndex, parent, getValue(map, "deform", true)));
|
|
305
|
-
return mesh;
|
|
306
|
-
}
|
|
307
|
-
let uvs = map.uvs;
|
|
308
|
-
this.readVertices(map, mesh, uvs.length);
|
|
309
|
-
mesh.triangles = map.triangles;
|
|
310
|
-
mesh.regionUVs = uvs;
|
|
311
|
-
mesh.updateUVs();
|
|
312
|
-
mesh.edges = getValue(map, "edges", null);
|
|
313
|
-
mesh.hullLength = getValue(map, "hull", 0) * 2;
|
|
314
|
-
return mesh;
|
|
315
|
-
}
|
|
316
|
-
case "path": {
|
|
317
|
-
let path = this.attachmentLoader.newPathAttachment(skin, name);
|
|
318
|
-
if (!path)
|
|
319
|
-
return null;
|
|
320
|
-
path.closed = getValue(map, "closed", false);
|
|
321
|
-
path.constantSpeed = getValue(map, "constantSpeed", true);
|
|
322
|
-
let vertexCount = map.vertexCount;
|
|
323
|
-
this.readVertices(map, path, vertexCount << 1);
|
|
324
|
-
let lengths = Utils.newArray(vertexCount / 3, 0);
|
|
325
|
-
for (let i = 0; i < map.lengths.length; i++)
|
|
326
|
-
lengths[i] = map.lengths[i] * scale;
|
|
327
|
-
path.lengths = lengths;
|
|
328
|
-
let color = getValue(map, "color", null);
|
|
329
|
-
if (color)
|
|
330
|
-
path.color.setFromString(color);
|
|
331
|
-
return path;
|
|
332
|
-
}
|
|
333
|
-
case "point": {
|
|
334
|
-
let point = this.attachmentLoader.newPointAttachment(skin, name);
|
|
335
|
-
if (!point)
|
|
336
|
-
return null;
|
|
337
|
-
point.x = getValue(map, "x", 0) * scale;
|
|
338
|
-
point.y = getValue(map, "y", 0) * scale;
|
|
339
|
-
point.rotation = getValue(map, "rotation", 0);
|
|
340
|
-
let color = getValue(map, "color", null);
|
|
341
|
-
if (color)
|
|
342
|
-
point.color.setFromString(color);
|
|
343
|
-
return point;
|
|
344
|
-
}
|
|
345
|
-
case "clipping": {
|
|
346
|
-
let clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
|
347
|
-
if (!clip)
|
|
348
|
-
return null;
|
|
349
|
-
let end = getValue(map, "end", null);
|
|
350
|
-
if (end)
|
|
351
|
-
clip.endSlot = skeletonData.findSlot(end);
|
|
352
|
-
let vertexCount = map.vertexCount;
|
|
353
|
-
this.readVertices(map, clip, vertexCount << 1);
|
|
354
|
-
let color = getValue(map, "color", null);
|
|
355
|
-
if (color)
|
|
356
|
-
clip.color.setFromString(color);
|
|
357
|
-
return clip;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
return null;
|
|
361
|
-
}
|
|
362
|
-
readVertices(map, attachment, verticesLength) {
|
|
363
|
-
let scale = this.scale;
|
|
364
|
-
attachment.worldVerticesLength = verticesLength;
|
|
365
|
-
let vertices = map.vertices;
|
|
366
|
-
if (verticesLength == vertices.length) {
|
|
367
|
-
let scaledVertices = Utils.toFloatArray(vertices);
|
|
368
|
-
if (scale != 1) {
|
|
369
|
-
for (let i = 0, n = vertices.length; i < n; i++)
|
|
370
|
-
scaledVertices[i] *= scale;
|
|
371
|
-
}
|
|
372
|
-
attachment.vertices = scaledVertices;
|
|
373
|
-
return;
|
|
374
|
-
}
|
|
375
|
-
let weights = new Array();
|
|
376
|
-
let bones = new Array();
|
|
377
|
-
for (let i = 0, n = vertices.length; i < n;) {
|
|
378
|
-
let boneCount = vertices[i++];
|
|
379
|
-
bones.push(boneCount);
|
|
380
|
-
for (let nn = i + boneCount * 4; i < nn; i += 4) {
|
|
381
|
-
bones.push(vertices[i]);
|
|
382
|
-
weights.push(vertices[i + 1] * scale);
|
|
383
|
-
weights.push(vertices[i + 2] * scale);
|
|
384
|
-
weights.push(vertices[i + 3]);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
attachment.bones = bones;
|
|
388
|
-
attachment.vertices = Utils.toFloatArray(weights);
|
|
389
|
-
}
|
|
390
|
-
readAnimation(map, name, skeletonData) {
|
|
391
|
-
let scale = this.scale;
|
|
392
|
-
let timelines = new Array();
|
|
393
|
-
// Slot timelines.
|
|
394
|
-
if (map.slots) {
|
|
395
|
-
for (let slotName in map.slots) {
|
|
396
|
-
let slotMap = map.slots[slotName];
|
|
397
|
-
let slotIndex = skeletonData.findSlot(slotName).index;
|
|
398
|
-
for (let timelineName in slotMap) {
|
|
399
|
-
let timelineMap = slotMap[timelineName];
|
|
400
|
-
if (!timelineMap)
|
|
401
|
-
continue;
|
|
402
|
-
let frames = timelineMap.length;
|
|
403
|
-
if (timelineName == "attachment") {
|
|
404
|
-
let timeline = new AttachmentTimeline(frames, slotIndex);
|
|
405
|
-
for (let frame = 0; frame < frames; frame++) {
|
|
406
|
-
let keyMap = timelineMap[frame];
|
|
407
|
-
timeline.setFrame(frame, getValue(keyMap, "time", 0), keyMap.name);
|
|
408
|
-
}
|
|
409
|
-
timelines.push(timeline);
|
|
410
|
-
}
|
|
411
|
-
else if (timelineName == "rgba") {
|
|
412
|
-
let timeline = new RGBATimeline(frames, frames << 2, slotIndex);
|
|
413
|
-
let keyMap = timelineMap[0];
|
|
414
|
-
let time = getValue(keyMap, "time", 0);
|
|
415
|
-
let color = Color.fromString(keyMap.color);
|
|
416
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
417
|
-
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
|
|
418
|
-
let nextMap = timelineMap[frame + 1];
|
|
419
|
-
if (!nextMap) {
|
|
420
|
-
timeline.shrink(bezier);
|
|
421
|
-
break;
|
|
422
|
-
}
|
|
423
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
424
|
-
let newColor = Color.fromString(nextMap.color);
|
|
425
|
-
let curve = keyMap.curve;
|
|
426
|
-
if (curve) {
|
|
427
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
428
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
429
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
430
|
-
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
431
|
-
}
|
|
432
|
-
time = time2;
|
|
433
|
-
color = newColor;
|
|
434
|
-
keyMap = nextMap;
|
|
435
|
-
}
|
|
436
|
-
timelines.push(timeline);
|
|
437
|
-
}
|
|
438
|
-
else if (timelineName == "rgb") {
|
|
439
|
-
let timeline = new RGBTimeline(frames, frames * 3, slotIndex);
|
|
440
|
-
let keyMap = timelineMap[0];
|
|
441
|
-
let time = getValue(keyMap, "time", 0);
|
|
442
|
-
let color = Color.fromString(keyMap.color);
|
|
443
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
444
|
-
timeline.setFrame(frame, time, color.r, color.g, color.b);
|
|
445
|
-
let nextMap = timelineMap[frame + 1];
|
|
446
|
-
if (!nextMap) {
|
|
447
|
-
timeline.shrink(bezier);
|
|
448
|
-
break;
|
|
449
|
-
}
|
|
450
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
451
|
-
let newColor = Color.fromString(nextMap.color);
|
|
452
|
-
let curve = keyMap.curve;
|
|
453
|
-
if (curve) {
|
|
454
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
455
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
456
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
457
|
-
}
|
|
458
|
-
time = time2;
|
|
459
|
-
color = newColor;
|
|
460
|
-
keyMap = nextMap;
|
|
461
|
-
}
|
|
462
|
-
timelines.push(timeline);
|
|
463
|
-
}
|
|
464
|
-
else if (timelineName == "alpha") {
|
|
465
|
-
timelines.push(readTimeline1(timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1));
|
|
466
|
-
}
|
|
467
|
-
else if (timelineName == "rgba2") {
|
|
468
|
-
let timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);
|
|
469
|
-
let keyMap = timelineMap[0];
|
|
470
|
-
let time = getValue(keyMap, "time", 0);
|
|
471
|
-
let color = Color.fromString(keyMap.light);
|
|
472
|
-
let color2 = Color.fromString(keyMap.dark);
|
|
473
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
474
|
-
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
|
|
475
|
-
let nextMap = timelineMap[frame + 1];
|
|
476
|
-
if (!nextMap) {
|
|
477
|
-
timeline.shrink(bezier);
|
|
478
|
-
break;
|
|
479
|
-
}
|
|
480
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
481
|
-
let newColor = Color.fromString(nextMap.light);
|
|
482
|
-
let newColor2 = Color.fromString(nextMap.dark);
|
|
483
|
-
let curve = keyMap.curve;
|
|
484
|
-
if (curve) {
|
|
485
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
486
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
487
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
488
|
-
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
489
|
-
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
|
|
490
|
-
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
|
|
491
|
-
bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
|
|
492
|
-
}
|
|
493
|
-
time = time2;
|
|
494
|
-
color = newColor;
|
|
495
|
-
color2 = newColor2;
|
|
496
|
-
keyMap = nextMap;
|
|
497
|
-
}
|
|
498
|
-
timelines.push(timeline);
|
|
499
|
-
}
|
|
500
|
-
else if (timelineName == "rgb2") {
|
|
501
|
-
let timeline = new RGB2Timeline(frames, frames * 6, slotIndex);
|
|
502
|
-
let keyMap = timelineMap[0];
|
|
503
|
-
let time = getValue(keyMap, "time", 0);
|
|
504
|
-
let color = Color.fromString(keyMap.light);
|
|
505
|
-
let color2 = Color.fromString(keyMap.dark);
|
|
506
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
507
|
-
timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
|
|
508
|
-
let nextMap = timelineMap[frame + 1];
|
|
509
|
-
if (!nextMap) {
|
|
510
|
-
timeline.shrink(bezier);
|
|
511
|
-
break;
|
|
512
|
-
}
|
|
513
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
514
|
-
let newColor = Color.fromString(nextMap.light);
|
|
515
|
-
let newColor2 = Color.fromString(nextMap.dark);
|
|
516
|
-
let curve = keyMap.curve;
|
|
517
|
-
if (curve) {
|
|
518
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
519
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
520
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
521
|
-
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
|
|
522
|
-
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
|
|
523
|
-
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
|
|
524
|
-
}
|
|
525
|
-
time = time2;
|
|
526
|
-
color = newColor;
|
|
527
|
-
color2 = newColor2;
|
|
528
|
-
keyMap = nextMap;
|
|
529
|
-
}
|
|
530
|
-
timelines.push(timeline);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
// Bone timelines.
|
|
536
|
-
if (map.bones) {
|
|
537
|
-
for (let boneName in map.bones) {
|
|
538
|
-
let boneMap = map.bones[boneName];
|
|
539
|
-
let boneIndex = skeletonData.findBone(boneName).index;
|
|
540
|
-
for (let timelineName in boneMap) {
|
|
541
|
-
let timelineMap = boneMap[timelineName];
|
|
542
|
-
let frames = timelineMap.length;
|
|
543
|
-
if (frames == 0)
|
|
544
|
-
continue;
|
|
545
|
-
if (timelineName === "rotate") {
|
|
546
|
-
timelines.push(readTimeline1(timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1));
|
|
547
|
-
}
|
|
548
|
-
else if (timelineName === "translate") {
|
|
549
|
-
let timeline = new TranslateTimeline(frames, frames << 1, boneIndex);
|
|
550
|
-
timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, scale));
|
|
551
|
-
}
|
|
552
|
-
else if (timelineName === "translatex") {
|
|
553
|
-
let timeline = new TranslateXTimeline(frames, frames, boneIndex);
|
|
554
|
-
timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
|
|
555
|
-
}
|
|
556
|
-
else if (timelineName === "translatey") {
|
|
557
|
-
let timeline = new TranslateYTimeline(frames, frames, boneIndex);
|
|
558
|
-
timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
|
|
559
|
-
}
|
|
560
|
-
else if (timelineName === "scale") {
|
|
561
|
-
let timeline = new ScaleTimeline(frames, frames << 1, boneIndex);
|
|
562
|
-
timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 1, 1));
|
|
563
|
-
}
|
|
564
|
-
else if (timelineName === "scalex") {
|
|
565
|
-
let timeline = new ScaleXTimeline(frames, frames, boneIndex);
|
|
566
|
-
timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
|
|
567
|
-
}
|
|
568
|
-
else if (timelineName === "scaley") {
|
|
569
|
-
let timeline = new ScaleYTimeline(frames, frames, boneIndex);
|
|
570
|
-
timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
|
|
571
|
-
}
|
|
572
|
-
else if (timelineName === "shear") {
|
|
573
|
-
let timeline = new ShearTimeline(frames, frames << 1, boneIndex);
|
|
574
|
-
timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, 1));
|
|
575
|
-
}
|
|
576
|
-
else if (timelineName === "shearx") {
|
|
577
|
-
let timeline = new ShearXTimeline(frames, frames, boneIndex);
|
|
578
|
-
timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
|
|
579
|
-
}
|
|
580
|
-
else if (timelineName === "sheary") {
|
|
581
|
-
let timeline = new ShearYTimeline(frames, frames, boneIndex);
|
|
582
|
-
timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
}
|
|
587
|
-
// IK constraint timelines.
|
|
588
|
-
if (map.ik) {
|
|
589
|
-
for (let constraintName in map.ik) {
|
|
590
|
-
let constraintMap = map.ik[constraintName];
|
|
591
|
-
let keyMap = constraintMap[0];
|
|
592
|
-
if (!keyMap)
|
|
593
|
-
continue;
|
|
594
|
-
let constraint = skeletonData.findIkConstraint(constraintName);
|
|
595
|
-
let constraintIndex = skeletonData.ikConstraints.indexOf(constraint);
|
|
596
|
-
let timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);
|
|
597
|
-
let time = getValue(keyMap, "time", 0);
|
|
598
|
-
let mix = getValue(keyMap, "mix", 1);
|
|
599
|
-
let softness = getValue(keyMap, "softness", 0) * scale;
|
|
600
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
601
|
-
timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false));
|
|
602
|
-
let nextMap = constraintMap[frame + 1];
|
|
603
|
-
if (!nextMap) {
|
|
604
|
-
timeline.shrink(bezier);
|
|
605
|
-
break;
|
|
606
|
-
}
|
|
607
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
608
|
-
let mix2 = getValue(nextMap, "mix", 1);
|
|
609
|
-
let softness2 = getValue(nextMap, "softness", 0) * scale;
|
|
610
|
-
let curve = keyMap.curve;
|
|
611
|
-
if (curve) {
|
|
612
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
|
|
613
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
|
|
614
|
-
}
|
|
615
|
-
time = time2;
|
|
616
|
-
mix = mix2;
|
|
617
|
-
softness = softness2;
|
|
618
|
-
keyMap = nextMap;
|
|
619
|
-
}
|
|
620
|
-
timelines.push(timeline);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
// Transform constraint timelines.
|
|
624
|
-
if (map.transform) {
|
|
625
|
-
for (let constraintName in map.transform) {
|
|
626
|
-
let timelineMap = map.transform[constraintName];
|
|
627
|
-
let keyMap = timelineMap[0];
|
|
628
|
-
if (!keyMap)
|
|
629
|
-
continue;
|
|
630
|
-
let constraint = skeletonData.findTransformConstraint(constraintName);
|
|
631
|
-
let constraintIndex = skeletonData.transformConstraints.indexOf(constraint);
|
|
632
|
-
let timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, constraintIndex);
|
|
633
|
-
let time = getValue(keyMap, "time", 0);
|
|
634
|
-
let mixRotate = getValue(keyMap, "mixRotate", 1);
|
|
635
|
-
let mixX = getValue(keyMap, "mixX", 1);
|
|
636
|
-
let mixY = getValue(keyMap, "mixY", mixX);
|
|
637
|
-
let mixScaleX = getValue(keyMap, "mixScaleX", 1);
|
|
638
|
-
let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX);
|
|
639
|
-
let mixShearY = getValue(keyMap, "mixShearY", 1);
|
|
640
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
641
|
-
timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
|
|
642
|
-
let nextMap = timelineMap[frame + 1];
|
|
643
|
-
if (!nextMap) {
|
|
644
|
-
timeline.shrink(bezier);
|
|
645
|
-
break;
|
|
646
|
-
}
|
|
647
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
648
|
-
let mixRotate2 = getValue(nextMap, "mixRotate", 1);
|
|
649
|
-
let mixX2 = getValue(nextMap, "mixX", 1);
|
|
650
|
-
let mixY2 = getValue(nextMap, "mixY", mixX2);
|
|
651
|
-
let mixScaleX2 = getValue(nextMap, "mixScaleX", 1);
|
|
652
|
-
let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2);
|
|
653
|
-
let mixShearY2 = getValue(nextMap, "mixShearY", 1);
|
|
654
|
-
let curve = keyMap.curve;
|
|
655
|
-
if (curve) {
|
|
656
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
|
|
657
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
|
|
658
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
|
|
659
|
-
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
|
|
660
|
-
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
|
|
661
|
-
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);
|
|
662
|
-
}
|
|
663
|
-
time = time2;
|
|
664
|
-
mixRotate = mixRotate2;
|
|
665
|
-
mixX = mixX2;
|
|
666
|
-
mixY = mixY2;
|
|
667
|
-
mixScaleX = mixScaleX2;
|
|
668
|
-
mixScaleY = mixScaleY2;
|
|
669
|
-
mixScaleX = mixScaleX2;
|
|
670
|
-
keyMap = nextMap;
|
|
671
|
-
}
|
|
672
|
-
timelines.push(timeline);
|
|
673
|
-
}
|
|
674
|
-
}
|
|
675
|
-
// Path constraint timelines.
|
|
676
|
-
if (map.path) {
|
|
677
|
-
for (let constraintName in map.path) {
|
|
678
|
-
let constraintMap = map.path[constraintName];
|
|
679
|
-
let constraint = skeletonData.findPathConstraint(constraintName);
|
|
680
|
-
let constraintIndex = skeletonData.pathConstraints.indexOf(constraint);
|
|
681
|
-
for (let timelineName in constraintMap) {
|
|
682
|
-
let timelineMap = constraintMap[timelineName];
|
|
683
|
-
let keyMap = timelineMap[0];
|
|
684
|
-
if (!keyMap)
|
|
685
|
-
continue;
|
|
686
|
-
let frames = timelineMap.length;
|
|
687
|
-
if (timelineName === "position") {
|
|
688
|
-
let timeline = new PathConstraintPositionTimeline(frames, frames, constraintIndex);
|
|
689
|
-
timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1));
|
|
690
|
-
}
|
|
691
|
-
else if (timelineName === "spacing") {
|
|
692
|
-
let timeline = new PathConstraintSpacingTimeline(frames, frames, constraintIndex);
|
|
693
|
-
timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1));
|
|
694
|
-
}
|
|
695
|
-
else if (timelineName === "mix") {
|
|
696
|
-
let timeline = new PathConstraintMixTimeline(frames, frames * 3, constraintIndex);
|
|
697
|
-
let time = getValue(keyMap, "time", 0);
|
|
698
|
-
let mixRotate = getValue(keyMap, "mixRotate", 1);
|
|
699
|
-
let mixX = getValue(keyMap, "mixX", 1);
|
|
700
|
-
let mixY = getValue(keyMap, "mixY", mixX);
|
|
701
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
702
|
-
timeline.setFrame(frame, time, mixRotate, mixX, mixY);
|
|
703
|
-
let nextMap = timelineMap[frame + 1];
|
|
704
|
-
if (!nextMap) {
|
|
705
|
-
timeline.shrink(bezier);
|
|
706
|
-
break;
|
|
707
|
-
}
|
|
708
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
709
|
-
let mixRotate2 = getValue(nextMap, "mixRotate", 1);
|
|
710
|
-
let mixX2 = getValue(nextMap, "mixX", 1);
|
|
711
|
-
let mixY2 = getValue(nextMap, "mixY", mixX2);
|
|
712
|
-
let curve = keyMap.curve;
|
|
713
|
-
if (curve) {
|
|
714
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
|
|
715
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
|
|
716
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
|
|
717
|
-
}
|
|
718
|
-
time = time2;
|
|
719
|
-
mixRotate = mixRotate2;
|
|
720
|
-
mixX = mixX2;
|
|
721
|
-
mixY = mixY2;
|
|
722
|
-
keyMap = nextMap;
|
|
723
|
-
}
|
|
724
|
-
timelines.push(timeline);
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
// Deform timelines.
|
|
730
|
-
if (map.deform) {
|
|
731
|
-
for (let deformName in map.deform) {
|
|
732
|
-
let deformMap = map.deform[deformName];
|
|
733
|
-
let skin = skeletonData.findSkin(deformName);
|
|
734
|
-
for (let slotName in deformMap) {
|
|
735
|
-
let slotMap = deformMap[slotName];
|
|
736
|
-
let slotIndex = skeletonData.findSlot(slotName).index;
|
|
737
|
-
for (let timelineName in slotMap) {
|
|
738
|
-
let timelineMap = slotMap[timelineName];
|
|
739
|
-
let keyMap = timelineMap[0];
|
|
740
|
-
if (!keyMap)
|
|
741
|
-
continue;
|
|
742
|
-
let attachment = skin.getAttachment(slotIndex, timelineName);
|
|
743
|
-
let weighted = attachment.bones;
|
|
744
|
-
let vertices = attachment.vertices;
|
|
745
|
-
let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
|
|
746
|
-
let timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);
|
|
747
|
-
let time = getValue(keyMap, "time", 0);
|
|
748
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
749
|
-
let deform;
|
|
750
|
-
let verticesValue = getValue(keyMap, "vertices", null);
|
|
751
|
-
if (!verticesValue)
|
|
752
|
-
deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
|
|
753
|
-
else {
|
|
754
|
-
deform = Utils.newFloatArray(deformLength);
|
|
755
|
-
let start = getValue(keyMap, "offset", 0);
|
|
756
|
-
Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
|
|
757
|
-
if (scale != 1) {
|
|
758
|
-
for (let i = start, n = i + verticesValue.length; i < n; i++)
|
|
759
|
-
deform[i] *= scale;
|
|
760
|
-
}
|
|
761
|
-
if (!weighted) {
|
|
762
|
-
for (let i = 0; i < deformLength; i++)
|
|
763
|
-
deform[i] += vertices[i];
|
|
764
|
-
}
|
|
765
|
-
}
|
|
766
|
-
timeline.setFrame(frame, time, deform);
|
|
767
|
-
let nextMap = timelineMap[frame + 1];
|
|
768
|
-
if (!nextMap) {
|
|
769
|
-
timeline.shrink(bezier);
|
|
770
|
-
break;
|
|
771
|
-
}
|
|
772
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
773
|
-
let curve = keyMap.curve;
|
|
774
|
-
if (curve)
|
|
775
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
|
|
776
|
-
time = time2;
|
|
777
|
-
keyMap = nextMap;
|
|
778
|
-
}
|
|
779
|
-
timelines.push(timeline);
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
// Draw order timelines.
|
|
785
|
-
if (map.drawOrder) {
|
|
786
|
-
let timeline = new DrawOrderTimeline(map.drawOrder.length);
|
|
787
|
-
let slotCount = skeletonData.slots.length;
|
|
788
|
-
let frame = 0;
|
|
789
|
-
for (let i = 0; i < map.drawOrder.length; i++, frame++) {
|
|
790
|
-
let drawOrderMap = map.drawOrder[i];
|
|
791
|
-
let drawOrder = null;
|
|
792
|
-
let offsets = getValue(drawOrderMap, "offsets", null);
|
|
793
|
-
if (offsets) {
|
|
794
|
-
drawOrder = Utils.newArray(slotCount, -1);
|
|
795
|
-
let unchanged = Utils.newArray(slotCount - offsets.length, 0);
|
|
796
|
-
let originalIndex = 0, unchangedIndex = 0;
|
|
797
|
-
for (let ii = 0; ii < offsets.length; ii++) {
|
|
798
|
-
let offsetMap = offsets[ii];
|
|
799
|
-
let slotIndex = skeletonData.findSlot(offsetMap.slot).index;
|
|
800
|
-
// Collect unchanged items.
|
|
801
|
-
while (originalIndex != slotIndex)
|
|
802
|
-
unchanged[unchangedIndex++] = originalIndex++;
|
|
803
|
-
// Set changed items.
|
|
804
|
-
drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
|
|
805
|
-
}
|
|
806
|
-
// Collect remaining unchanged items.
|
|
807
|
-
while (originalIndex < slotCount)
|
|
808
|
-
unchanged[unchangedIndex++] = originalIndex++;
|
|
809
|
-
// Fill in unchanged items.
|
|
810
|
-
for (let ii = slotCount - 1; ii >= 0; ii--)
|
|
811
|
-
if (drawOrder[ii] == -1)
|
|
812
|
-
drawOrder[ii] = unchanged[--unchangedIndex];
|
|
813
|
-
}
|
|
814
|
-
timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder);
|
|
815
|
-
}
|
|
816
|
-
timelines.push(timeline);
|
|
817
|
-
}
|
|
818
|
-
// Event timelines.
|
|
819
|
-
if (map.events) {
|
|
820
|
-
let timeline = new EventTimeline(map.events.length);
|
|
821
|
-
let frame = 0;
|
|
822
|
-
for (let i = 0; i < map.events.length; i++, frame++) {
|
|
823
|
-
let eventMap = map.events[i];
|
|
824
|
-
let eventData = skeletonData.findEvent(eventMap.name);
|
|
825
|
-
let event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), eventData);
|
|
826
|
-
event.intValue = getValue(eventMap, "int", eventData.intValue);
|
|
827
|
-
event.floatValue = getValue(eventMap, "float", eventData.floatValue);
|
|
828
|
-
event.stringValue = getValue(eventMap, "string", eventData.stringValue);
|
|
829
|
-
if (event.data.audioPath) {
|
|
830
|
-
event.volume = getValue(eventMap, "volume", 1);
|
|
831
|
-
event.balance = getValue(eventMap, "balance", 0);
|
|
832
|
-
}
|
|
833
|
-
timeline.setFrame(frame, event);
|
|
834
|
-
}
|
|
835
|
-
timelines.push(timeline);
|
|
836
|
-
}
|
|
837
|
-
let duration = 0;
|
|
838
|
-
for (let i = 0, n = timelines.length; i < n; i++)
|
|
839
|
-
duration = Math.max(duration, timelines[i].getDuration());
|
|
840
|
-
skeletonData.animations.push(new Animation(name, timelines, duration));
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
class LinkedMesh {
|
|
844
|
-
constructor(mesh, skin, slotIndex, parent, inheritDeform) {
|
|
845
|
-
this.mesh = mesh;
|
|
846
|
-
this.skin = skin;
|
|
847
|
-
this.slotIndex = slotIndex;
|
|
848
|
-
this.parent = parent;
|
|
849
|
-
this.inheritDeform = inheritDeform;
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
function readTimeline1(keys, timeline, defaultValue, scale) {
|
|
853
|
-
let keyMap = keys[0];
|
|
854
|
-
let time = getValue(keyMap, "time", 0);
|
|
855
|
-
let value = getValue(keyMap, "value", defaultValue) * scale;
|
|
856
|
-
let bezier = 0;
|
|
857
|
-
for (let frame = 0;; frame++) {
|
|
858
|
-
timeline.setFrame(frame, time, value);
|
|
859
|
-
let nextMap = keys[frame + 1];
|
|
860
|
-
if (!nextMap) {
|
|
861
|
-
timeline.shrink(bezier);
|
|
862
|
-
return timeline;
|
|
863
|
-
}
|
|
864
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
865
|
-
let value2 = getValue(nextMap, "value", defaultValue) * scale;
|
|
866
|
-
if (keyMap.curve)
|
|
867
|
-
bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
|
|
868
|
-
time = time2;
|
|
869
|
-
value = value2;
|
|
870
|
-
keyMap = nextMap;
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
function readTimeline2(keys, timeline, name1, name2, defaultValue, scale) {
|
|
874
|
-
let keyMap = keys[0];
|
|
875
|
-
let time = getValue(keyMap, "time", 0);
|
|
876
|
-
let value1 = getValue(keyMap, name1, defaultValue) * scale;
|
|
877
|
-
let value2 = getValue(keyMap, name2, defaultValue) * scale;
|
|
878
|
-
let bezier = 0;
|
|
879
|
-
for (let frame = 0;; frame++) {
|
|
880
|
-
timeline.setFrame(frame, time, value1, value2);
|
|
881
|
-
let nextMap = keys[frame + 1];
|
|
882
|
-
if (!nextMap) {
|
|
883
|
-
timeline.shrink(bezier);
|
|
884
|
-
return timeline;
|
|
885
|
-
}
|
|
886
|
-
let time2 = getValue(nextMap, "time", 0);
|
|
887
|
-
let nvalue1 = getValue(nextMap, name1, defaultValue) * scale;
|
|
888
|
-
let nvalue2 = getValue(nextMap, name2, defaultValue) * scale;
|
|
889
|
-
let curve = keyMap.curve;
|
|
890
|
-
if (curve) {
|
|
891
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
|
|
892
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
|
|
893
|
-
}
|
|
894
|
-
time = time2;
|
|
895
|
-
value1 = nvalue1;
|
|
896
|
-
value2 = nvalue2;
|
|
897
|
-
keyMap = nextMap;
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
|
|
901
|
-
if (curve == "stepped") {
|
|
902
|
-
timeline.setStepped(frame);
|
|
903
|
-
return bezier;
|
|
904
|
-
}
|
|
905
|
-
let i = value << 2;
|
|
906
|
-
let cx1 = curve[i];
|
|
907
|
-
let cy1 = curve[i + 1] * scale;
|
|
908
|
-
let cx2 = curve[i + 2];
|
|
909
|
-
let cy2 = curve[i + 3] * scale;
|
|
910
|
-
timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
|
|
911
|
-
return bezier + 1;
|
|
912
|
-
}
|
|
913
|
-
function getValue(map, property, defaultValue) {
|
|
914
|
-
return map[property] !== undefined ? map[property] : defaultValue;
|
|
915
|
-
}
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
* Spine Runtimes License Agreement
|
|
3
|
+
* Last updated January 1, 2020. Replaces all prior versions.
|
|
4
|
+
*
|
|
5
|
+
* Copyright (c) 2013-2020, Esoteric Software LLC
|
|
6
|
+
*
|
|
7
|
+
* Integration of the Spine Runtimes into software or otherwise creating
|
|
8
|
+
* derivative works of the Spine Runtimes is permitted under the terms and
|
|
9
|
+
* conditions of Section 2 of the Spine Editor License Agreement:
|
|
10
|
+
* http://esotericsoftware.com/spine-editor-license
|
|
11
|
+
*
|
|
12
|
+
* Otherwise, it is permitted to integrate the Spine Runtimes into software
|
|
13
|
+
* or otherwise create derivative works of the Spine Runtimes (collectively,
|
|
14
|
+
* "Products"), provided that each user of the Products must obtain their own
|
|
15
|
+
* Spine Editor license and redistribution of the Products in any form must
|
|
16
|
+
* include this license and copyright notice.
|
|
17
|
+
*
|
|
18
|
+
* THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
|
|
19
|
+
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
20
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
21
|
+
* DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
|
|
22
|
+
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
|
|
24
|
+
* BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
|
|
25
|
+
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
|
+
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
|
+
*****************************************************************************/
|
|
29
|
+
import { Animation, AttachmentTimeline, RGBATimeline, RGBTimeline, AlphaTimeline, RGBA2Timeline, RGB2Timeline, RotateTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, IkConstraintTimeline, TransformConstraintTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PathConstraintMixTimeline, DeformTimeline, DrawOrderTimeline, EventTimeline } from "./Animation";
|
|
30
|
+
import { BoneData, TransformMode } from "./BoneData";
|
|
31
|
+
import { EventData } from "./EventData";
|
|
32
|
+
import { Event } from "./Event";
|
|
33
|
+
import { IkConstraintData } from "./IkConstraintData";
|
|
34
|
+
import { PathConstraintData, PositionMode, SpacingMode, RotateMode } from "./PathConstraintData";
|
|
35
|
+
import { SkeletonData } from "./SkeletonData";
|
|
36
|
+
import { Skin } from "./Skin";
|
|
37
|
+
import { SlotData, BlendMode } from "./SlotData";
|
|
38
|
+
import { TransformConstraintData } from "./TransformConstraintData";
|
|
39
|
+
import { Utils, Color } from "./Utils";
|
|
40
|
+
/** Loads skeleton data in the Spine JSON format.
|
|
41
|
+
*
|
|
42
|
+
* See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
|
|
43
|
+
* [JSON and binary data](http://esotericsoftware.com/spine-loading-skeleton-data#JSON-and-binary-data) in the Spine
|
|
44
|
+
* Runtimes Guide. */
|
|
45
|
+
export class SkeletonJson {
|
|
46
|
+
constructor(attachmentLoader) {
|
|
47
|
+
/** Scales bone positions, image sizes, and translations as they are loaded. This allows different size images to be used at
|
|
48
|
+
* runtime than were used in Spine.
|
|
49
|
+
*
|
|
50
|
+
* See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
|
|
51
|
+
this.scale = 1;
|
|
52
|
+
this.linkedMeshes = new Array();
|
|
53
|
+
this.attachmentLoader = attachmentLoader;
|
|
54
|
+
}
|
|
55
|
+
readSkeletonData(json) {
|
|
56
|
+
let scale = this.scale;
|
|
57
|
+
let skeletonData = new SkeletonData();
|
|
58
|
+
let root = typeof (json) === "string" ? JSON.parse(json) : json;
|
|
59
|
+
// Skeleton
|
|
60
|
+
let skeletonMap = root.skeleton;
|
|
61
|
+
if (skeletonMap) {
|
|
62
|
+
skeletonData.hash = skeletonMap.hash;
|
|
63
|
+
skeletonData.version = skeletonMap.spine;
|
|
64
|
+
skeletonData.x = skeletonMap.x;
|
|
65
|
+
skeletonData.y = skeletonMap.y;
|
|
66
|
+
skeletonData.width = skeletonMap.width;
|
|
67
|
+
skeletonData.height = skeletonMap.height;
|
|
68
|
+
skeletonData.fps = skeletonMap.fps;
|
|
69
|
+
skeletonData.imagesPath = skeletonMap.images;
|
|
70
|
+
}
|
|
71
|
+
// Bones
|
|
72
|
+
if (root.bones) {
|
|
73
|
+
for (let i = 0; i < root.bones.length; i++) {
|
|
74
|
+
let boneMap = root.bones[i];
|
|
75
|
+
let parent = null;
|
|
76
|
+
let parentName = getValue(boneMap, "parent", null);
|
|
77
|
+
if (parentName)
|
|
78
|
+
parent = skeletonData.findBone(parentName);
|
|
79
|
+
let data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
|
|
80
|
+
data.length = getValue(boneMap, "length", 0) * scale;
|
|
81
|
+
data.x = getValue(boneMap, "x", 0) * scale;
|
|
82
|
+
data.y = getValue(boneMap, "y", 0) * scale;
|
|
83
|
+
data.rotation = getValue(boneMap, "rotation", 0);
|
|
84
|
+
data.scaleX = getValue(boneMap, "scaleX", 1);
|
|
85
|
+
data.scaleY = getValue(boneMap, "scaleY", 1);
|
|
86
|
+
data.shearX = getValue(boneMap, "shearX", 0);
|
|
87
|
+
data.shearY = getValue(boneMap, "shearY", 0);
|
|
88
|
+
data.transformMode = Utils.enumValue(TransformMode, getValue(boneMap, "transform", "Normal"));
|
|
89
|
+
data.skinRequired = getValue(boneMap, "skin", false);
|
|
90
|
+
let color = getValue(boneMap, "color", null);
|
|
91
|
+
if (color)
|
|
92
|
+
data.color.setFromString(color);
|
|
93
|
+
skeletonData.bones.push(data);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Slots.
|
|
97
|
+
if (root.slots) {
|
|
98
|
+
for (let i = 0; i < root.slots.length; i++) {
|
|
99
|
+
let slotMap = root.slots[i];
|
|
100
|
+
let boneData = skeletonData.findBone(slotMap.bone);
|
|
101
|
+
let data = new SlotData(skeletonData.slots.length, slotMap.name, boneData);
|
|
102
|
+
let color = getValue(slotMap, "color", null);
|
|
103
|
+
if (color)
|
|
104
|
+
data.color.setFromString(color);
|
|
105
|
+
let dark = getValue(slotMap, "dark", null);
|
|
106
|
+
if (dark)
|
|
107
|
+
data.darkColor = Color.fromString(dark);
|
|
108
|
+
data.attachmentName = getValue(slotMap, "attachment", null);
|
|
109
|
+
data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal"));
|
|
110
|
+
skeletonData.slots.push(data);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// IK constraints
|
|
114
|
+
if (root.ik) {
|
|
115
|
+
for (let i = 0; i < root.ik.length; i++) {
|
|
116
|
+
let constraintMap = root.ik[i];
|
|
117
|
+
let data = new IkConstraintData(constraintMap.name);
|
|
118
|
+
data.order = getValue(constraintMap, "order", 0);
|
|
119
|
+
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
120
|
+
for (let ii = 0; ii < constraintMap.bones.length; ii++)
|
|
121
|
+
data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
|
|
122
|
+
data.target = skeletonData.findBone(constraintMap.target);
|
|
123
|
+
data.mix = getValue(constraintMap, "mix", 1);
|
|
124
|
+
data.softness = getValue(constraintMap, "softness", 0) * scale;
|
|
125
|
+
data.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1;
|
|
126
|
+
data.compress = getValue(constraintMap, "compress", false);
|
|
127
|
+
data.stretch = getValue(constraintMap, "stretch", false);
|
|
128
|
+
data.uniform = getValue(constraintMap, "uniform", false);
|
|
129
|
+
skeletonData.ikConstraints.push(data);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Transform constraints.
|
|
133
|
+
if (root.transform) {
|
|
134
|
+
for (let i = 0; i < root.transform.length; i++) {
|
|
135
|
+
let constraintMap = root.transform[i];
|
|
136
|
+
let data = new TransformConstraintData(constraintMap.name);
|
|
137
|
+
data.order = getValue(constraintMap, "order", 0);
|
|
138
|
+
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
139
|
+
for (let ii = 0; ii < constraintMap.bones.length; ii++)
|
|
140
|
+
data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
|
|
141
|
+
let targetName = constraintMap.target;
|
|
142
|
+
data.target = skeletonData.findBone(targetName);
|
|
143
|
+
data.local = getValue(constraintMap, "local", false);
|
|
144
|
+
data.relative = getValue(constraintMap, "relative", false);
|
|
145
|
+
data.offsetRotation = getValue(constraintMap, "rotation", 0);
|
|
146
|
+
data.offsetX = getValue(constraintMap, "x", 0) * scale;
|
|
147
|
+
data.offsetY = getValue(constraintMap, "y", 0) * scale;
|
|
148
|
+
data.offsetScaleX = getValue(constraintMap, "scaleX", 0);
|
|
149
|
+
data.offsetScaleY = getValue(constraintMap, "scaleY", 0);
|
|
150
|
+
data.offsetShearY = getValue(constraintMap, "shearY", 0);
|
|
151
|
+
data.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
152
|
+
data.mixX = getValue(constraintMap, "mixX", 1);
|
|
153
|
+
data.mixY = getValue(constraintMap, "mixY", data.mixX);
|
|
154
|
+
data.mixScaleX = getValue(constraintMap, "mixScaleX", 1);
|
|
155
|
+
data.mixScaleY = getValue(constraintMap, "mixScaleY", data.mixScaleX);
|
|
156
|
+
data.mixShearY = getValue(constraintMap, "mixShearY", 1);
|
|
157
|
+
skeletonData.transformConstraints.push(data);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Path constraints.
|
|
161
|
+
if (root.path) {
|
|
162
|
+
for (let i = 0; i < root.path.length; i++) {
|
|
163
|
+
let constraintMap = root.path[i];
|
|
164
|
+
let data = new PathConstraintData(constraintMap.name);
|
|
165
|
+
data.order = getValue(constraintMap, "order", 0);
|
|
166
|
+
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
167
|
+
for (let ii = 0; ii < constraintMap.bones.length; ii++)
|
|
168
|
+
data.bones.push(skeletonData.findBone(constraintMap.bones[ii]));
|
|
169
|
+
let targetName = constraintMap.target;
|
|
170
|
+
data.target = skeletonData.findSlot(targetName);
|
|
171
|
+
data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
|
|
172
|
+
data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
|
|
173
|
+
data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
|
|
174
|
+
data.offsetRotation = getValue(constraintMap, "rotation", 0);
|
|
175
|
+
data.position = getValue(constraintMap, "position", 0);
|
|
176
|
+
if (data.positionMode == PositionMode.Fixed)
|
|
177
|
+
data.position *= scale;
|
|
178
|
+
data.spacing = getValue(constraintMap, "spacing", 0);
|
|
179
|
+
if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
|
|
180
|
+
data.spacing *= scale;
|
|
181
|
+
data.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
182
|
+
data.mixX = getValue(constraintMap, "mixX", 1);
|
|
183
|
+
data.mixY = getValue(constraintMap, "mixY", data.mixX);
|
|
184
|
+
skeletonData.pathConstraints.push(data);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Skins.
|
|
188
|
+
if (root.skins) {
|
|
189
|
+
for (let i = 0; i < root.skins.length; i++) {
|
|
190
|
+
let skinMap = root.skins[i];
|
|
191
|
+
let skin = new Skin(skinMap.name);
|
|
192
|
+
if (skinMap.bones) {
|
|
193
|
+
for (let ii = 0; ii < skinMap.bones.length; ii++)
|
|
194
|
+
skin.bones.push(skeletonData.findBone(skinMap.bones[ii]));
|
|
195
|
+
}
|
|
196
|
+
if (skinMap.ik) {
|
|
197
|
+
for (let ii = 0; ii < skinMap.ik.length; ii++)
|
|
198
|
+
skin.constraints.push(skeletonData.findIkConstraint(skinMap.ik[ii]));
|
|
199
|
+
}
|
|
200
|
+
if (skinMap.transform) {
|
|
201
|
+
for (let ii = 0; ii < skinMap.transform.length; ii++)
|
|
202
|
+
skin.constraints.push(skeletonData.findTransformConstraint(skinMap.transform[ii]));
|
|
203
|
+
}
|
|
204
|
+
if (skinMap.path) {
|
|
205
|
+
for (let ii = 0; ii < skinMap.path.length; ii++)
|
|
206
|
+
skin.constraints.push(skeletonData.findPathConstraint(skinMap.path[ii]));
|
|
207
|
+
}
|
|
208
|
+
for (let slotName in skinMap.attachments) {
|
|
209
|
+
let slot = skeletonData.findSlot(slotName);
|
|
210
|
+
let slotMap = skinMap.attachments[slotName];
|
|
211
|
+
for (let entryName in slotMap) {
|
|
212
|
+
let attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
|
|
213
|
+
if (attachment)
|
|
214
|
+
skin.setAttachment(slot.index, entryName, attachment);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
skeletonData.skins.push(skin);
|
|
218
|
+
if (skin.name == "default")
|
|
219
|
+
skeletonData.defaultSkin = skin;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Linked meshes.
|
|
223
|
+
for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
|
|
224
|
+
let linkedMesh = this.linkedMeshes[i];
|
|
225
|
+
let skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
|
|
226
|
+
let parent = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent);
|
|
227
|
+
linkedMesh.mesh.deformAttachment = linkedMesh.inheritDeform ? parent : linkedMesh.mesh;
|
|
228
|
+
linkedMesh.mesh.setParentMesh(parent);
|
|
229
|
+
linkedMesh.mesh.updateUVs();
|
|
230
|
+
}
|
|
231
|
+
this.linkedMeshes.length = 0;
|
|
232
|
+
// Events.
|
|
233
|
+
if (root.events) {
|
|
234
|
+
for (let eventName in root.events) {
|
|
235
|
+
let eventMap = root.events[eventName];
|
|
236
|
+
let data = new EventData(eventName);
|
|
237
|
+
data.intValue = getValue(eventMap, "int", 0);
|
|
238
|
+
data.floatValue = getValue(eventMap, "float", 0);
|
|
239
|
+
data.stringValue = getValue(eventMap, "string", "");
|
|
240
|
+
data.audioPath = getValue(eventMap, "audio", null);
|
|
241
|
+
if (data.audioPath) {
|
|
242
|
+
data.volume = getValue(eventMap, "volume", 1);
|
|
243
|
+
data.balance = getValue(eventMap, "balance", 0);
|
|
244
|
+
}
|
|
245
|
+
skeletonData.events.push(data);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Animations.
|
|
249
|
+
if (root.animations) {
|
|
250
|
+
for (let animationName in root.animations) {
|
|
251
|
+
let animationMap = root.animations[animationName];
|
|
252
|
+
this.readAnimation(animationMap, animationName, skeletonData);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return skeletonData;
|
|
256
|
+
}
|
|
257
|
+
readAttachment(map, skin, slotIndex, name, skeletonData) {
|
|
258
|
+
let scale = this.scale;
|
|
259
|
+
name = getValue(map, "name", name);
|
|
260
|
+
switch (getValue(map, "type", "region")) {
|
|
261
|
+
case "region": {
|
|
262
|
+
let path = getValue(map, "path", name);
|
|
263
|
+
let region = this.attachmentLoader.newRegionAttachment(skin, name, path);
|
|
264
|
+
if (!region)
|
|
265
|
+
return null;
|
|
266
|
+
region.path = path;
|
|
267
|
+
region.x = getValue(map, "x", 0) * scale;
|
|
268
|
+
region.y = getValue(map, "y", 0) * scale;
|
|
269
|
+
region.scaleX = getValue(map, "scaleX", 1);
|
|
270
|
+
region.scaleY = getValue(map, "scaleY", 1);
|
|
271
|
+
region.rotation = getValue(map, "rotation", 0);
|
|
272
|
+
region.width = map.width * scale;
|
|
273
|
+
region.height = map.height * scale;
|
|
274
|
+
let color = getValue(map, "color", null);
|
|
275
|
+
if (color)
|
|
276
|
+
region.color.setFromString(color);
|
|
277
|
+
region.updateOffset();
|
|
278
|
+
return region;
|
|
279
|
+
}
|
|
280
|
+
case "boundingbox": {
|
|
281
|
+
let box = this.attachmentLoader.newBoundingBoxAttachment(skin, name);
|
|
282
|
+
if (!box)
|
|
283
|
+
return null;
|
|
284
|
+
this.readVertices(map, box, map.vertexCount << 1);
|
|
285
|
+
let color = getValue(map, "color", null);
|
|
286
|
+
if (color)
|
|
287
|
+
box.color.setFromString(color);
|
|
288
|
+
return box;
|
|
289
|
+
}
|
|
290
|
+
case "mesh":
|
|
291
|
+
case "linkedmesh": {
|
|
292
|
+
let path = getValue(map, "path", name);
|
|
293
|
+
let mesh = this.attachmentLoader.newMeshAttachment(skin, name, path);
|
|
294
|
+
if (!mesh)
|
|
295
|
+
return null;
|
|
296
|
+
mesh.path = path;
|
|
297
|
+
let color = getValue(map, "color", null);
|
|
298
|
+
if (color)
|
|
299
|
+
mesh.color.setFromString(color);
|
|
300
|
+
mesh.width = getValue(map, "width", 0) * scale;
|
|
301
|
+
mesh.height = getValue(map, "height", 0) * scale;
|
|
302
|
+
let parent = getValue(map, "parent", null);
|
|
303
|
+
if (parent) {
|
|
304
|
+
this.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, "skin", null), slotIndex, parent, getValue(map, "deform", true)));
|
|
305
|
+
return mesh;
|
|
306
|
+
}
|
|
307
|
+
let uvs = map.uvs;
|
|
308
|
+
this.readVertices(map, mesh, uvs.length);
|
|
309
|
+
mesh.triangles = map.triangles;
|
|
310
|
+
mesh.regionUVs = uvs;
|
|
311
|
+
mesh.updateUVs();
|
|
312
|
+
mesh.edges = getValue(map, "edges", null);
|
|
313
|
+
mesh.hullLength = getValue(map, "hull", 0) * 2;
|
|
314
|
+
return mesh;
|
|
315
|
+
}
|
|
316
|
+
case "path": {
|
|
317
|
+
let path = this.attachmentLoader.newPathAttachment(skin, name);
|
|
318
|
+
if (!path)
|
|
319
|
+
return null;
|
|
320
|
+
path.closed = getValue(map, "closed", false);
|
|
321
|
+
path.constantSpeed = getValue(map, "constantSpeed", true);
|
|
322
|
+
let vertexCount = map.vertexCount;
|
|
323
|
+
this.readVertices(map, path, vertexCount << 1);
|
|
324
|
+
let lengths = Utils.newArray(vertexCount / 3, 0);
|
|
325
|
+
for (let i = 0; i < map.lengths.length; i++)
|
|
326
|
+
lengths[i] = map.lengths[i] * scale;
|
|
327
|
+
path.lengths = lengths;
|
|
328
|
+
let color = getValue(map, "color", null);
|
|
329
|
+
if (color)
|
|
330
|
+
path.color.setFromString(color);
|
|
331
|
+
return path;
|
|
332
|
+
}
|
|
333
|
+
case "point": {
|
|
334
|
+
let point = this.attachmentLoader.newPointAttachment(skin, name);
|
|
335
|
+
if (!point)
|
|
336
|
+
return null;
|
|
337
|
+
point.x = getValue(map, "x", 0) * scale;
|
|
338
|
+
point.y = getValue(map, "y", 0) * scale;
|
|
339
|
+
point.rotation = getValue(map, "rotation", 0);
|
|
340
|
+
let color = getValue(map, "color", null);
|
|
341
|
+
if (color)
|
|
342
|
+
point.color.setFromString(color);
|
|
343
|
+
return point;
|
|
344
|
+
}
|
|
345
|
+
case "clipping": {
|
|
346
|
+
let clip = this.attachmentLoader.newClippingAttachment(skin, name);
|
|
347
|
+
if (!clip)
|
|
348
|
+
return null;
|
|
349
|
+
let end = getValue(map, "end", null);
|
|
350
|
+
if (end)
|
|
351
|
+
clip.endSlot = skeletonData.findSlot(end);
|
|
352
|
+
let vertexCount = map.vertexCount;
|
|
353
|
+
this.readVertices(map, clip, vertexCount << 1);
|
|
354
|
+
let color = getValue(map, "color", null);
|
|
355
|
+
if (color)
|
|
356
|
+
clip.color.setFromString(color);
|
|
357
|
+
return clip;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
readVertices(map, attachment, verticesLength) {
|
|
363
|
+
let scale = this.scale;
|
|
364
|
+
attachment.worldVerticesLength = verticesLength;
|
|
365
|
+
let vertices = map.vertices;
|
|
366
|
+
if (verticesLength == vertices.length) {
|
|
367
|
+
let scaledVertices = Utils.toFloatArray(vertices);
|
|
368
|
+
if (scale != 1) {
|
|
369
|
+
for (let i = 0, n = vertices.length; i < n; i++)
|
|
370
|
+
scaledVertices[i] *= scale;
|
|
371
|
+
}
|
|
372
|
+
attachment.vertices = scaledVertices;
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
let weights = new Array();
|
|
376
|
+
let bones = new Array();
|
|
377
|
+
for (let i = 0, n = vertices.length; i < n;) {
|
|
378
|
+
let boneCount = vertices[i++];
|
|
379
|
+
bones.push(boneCount);
|
|
380
|
+
for (let nn = i + boneCount * 4; i < nn; i += 4) {
|
|
381
|
+
bones.push(vertices[i]);
|
|
382
|
+
weights.push(vertices[i + 1] * scale);
|
|
383
|
+
weights.push(vertices[i + 2] * scale);
|
|
384
|
+
weights.push(vertices[i + 3]);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
attachment.bones = bones;
|
|
388
|
+
attachment.vertices = Utils.toFloatArray(weights);
|
|
389
|
+
}
|
|
390
|
+
readAnimation(map, name, skeletonData) {
|
|
391
|
+
let scale = this.scale;
|
|
392
|
+
let timelines = new Array();
|
|
393
|
+
// Slot timelines.
|
|
394
|
+
if (map.slots) {
|
|
395
|
+
for (let slotName in map.slots) {
|
|
396
|
+
let slotMap = map.slots[slotName];
|
|
397
|
+
let slotIndex = skeletonData.findSlot(slotName).index;
|
|
398
|
+
for (let timelineName in slotMap) {
|
|
399
|
+
let timelineMap = slotMap[timelineName];
|
|
400
|
+
if (!timelineMap)
|
|
401
|
+
continue;
|
|
402
|
+
let frames = timelineMap.length;
|
|
403
|
+
if (timelineName == "attachment") {
|
|
404
|
+
let timeline = new AttachmentTimeline(frames, slotIndex);
|
|
405
|
+
for (let frame = 0; frame < frames; frame++) {
|
|
406
|
+
let keyMap = timelineMap[frame];
|
|
407
|
+
timeline.setFrame(frame, getValue(keyMap, "time", 0), keyMap.name);
|
|
408
|
+
}
|
|
409
|
+
timelines.push(timeline);
|
|
410
|
+
}
|
|
411
|
+
else if (timelineName == "rgba") {
|
|
412
|
+
let timeline = new RGBATimeline(frames, frames << 2, slotIndex);
|
|
413
|
+
let keyMap = timelineMap[0];
|
|
414
|
+
let time = getValue(keyMap, "time", 0);
|
|
415
|
+
let color = Color.fromString(keyMap.color);
|
|
416
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
417
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
|
|
418
|
+
let nextMap = timelineMap[frame + 1];
|
|
419
|
+
if (!nextMap) {
|
|
420
|
+
timeline.shrink(bezier);
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
424
|
+
let newColor = Color.fromString(nextMap.color);
|
|
425
|
+
let curve = keyMap.curve;
|
|
426
|
+
if (curve) {
|
|
427
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
428
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
429
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
430
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
431
|
+
}
|
|
432
|
+
time = time2;
|
|
433
|
+
color = newColor;
|
|
434
|
+
keyMap = nextMap;
|
|
435
|
+
}
|
|
436
|
+
timelines.push(timeline);
|
|
437
|
+
}
|
|
438
|
+
else if (timelineName == "rgb") {
|
|
439
|
+
let timeline = new RGBTimeline(frames, frames * 3, slotIndex);
|
|
440
|
+
let keyMap = timelineMap[0];
|
|
441
|
+
let time = getValue(keyMap, "time", 0);
|
|
442
|
+
let color = Color.fromString(keyMap.color);
|
|
443
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
444
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b);
|
|
445
|
+
let nextMap = timelineMap[frame + 1];
|
|
446
|
+
if (!nextMap) {
|
|
447
|
+
timeline.shrink(bezier);
|
|
448
|
+
break;
|
|
449
|
+
}
|
|
450
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
451
|
+
let newColor = Color.fromString(nextMap.color);
|
|
452
|
+
let curve = keyMap.curve;
|
|
453
|
+
if (curve) {
|
|
454
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
455
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
456
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
457
|
+
}
|
|
458
|
+
time = time2;
|
|
459
|
+
color = newColor;
|
|
460
|
+
keyMap = nextMap;
|
|
461
|
+
}
|
|
462
|
+
timelines.push(timeline);
|
|
463
|
+
}
|
|
464
|
+
else if (timelineName == "alpha") {
|
|
465
|
+
timelines.push(readTimeline1(timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1));
|
|
466
|
+
}
|
|
467
|
+
else if (timelineName == "rgba2") {
|
|
468
|
+
let timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);
|
|
469
|
+
let keyMap = timelineMap[0];
|
|
470
|
+
let time = getValue(keyMap, "time", 0);
|
|
471
|
+
let color = Color.fromString(keyMap.light);
|
|
472
|
+
let color2 = Color.fromString(keyMap.dark);
|
|
473
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
474
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
|
|
475
|
+
let nextMap = timelineMap[frame + 1];
|
|
476
|
+
if (!nextMap) {
|
|
477
|
+
timeline.shrink(bezier);
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
481
|
+
let newColor = Color.fromString(nextMap.light);
|
|
482
|
+
let newColor2 = Color.fromString(nextMap.dark);
|
|
483
|
+
let curve = keyMap.curve;
|
|
484
|
+
if (curve) {
|
|
485
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
486
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
487
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
488
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
489
|
+
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
|
|
490
|
+
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
|
|
491
|
+
bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
|
|
492
|
+
}
|
|
493
|
+
time = time2;
|
|
494
|
+
color = newColor;
|
|
495
|
+
color2 = newColor2;
|
|
496
|
+
keyMap = nextMap;
|
|
497
|
+
}
|
|
498
|
+
timelines.push(timeline);
|
|
499
|
+
}
|
|
500
|
+
else if (timelineName == "rgb2") {
|
|
501
|
+
let timeline = new RGB2Timeline(frames, frames * 6, slotIndex);
|
|
502
|
+
let keyMap = timelineMap[0];
|
|
503
|
+
let time = getValue(keyMap, "time", 0);
|
|
504
|
+
let color = Color.fromString(keyMap.light);
|
|
505
|
+
let color2 = Color.fromString(keyMap.dark);
|
|
506
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
507
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
|
|
508
|
+
let nextMap = timelineMap[frame + 1];
|
|
509
|
+
if (!nextMap) {
|
|
510
|
+
timeline.shrink(bezier);
|
|
511
|
+
break;
|
|
512
|
+
}
|
|
513
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
514
|
+
let newColor = Color.fromString(nextMap.light);
|
|
515
|
+
let newColor2 = Color.fromString(nextMap.dark);
|
|
516
|
+
let curve = keyMap.curve;
|
|
517
|
+
if (curve) {
|
|
518
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
519
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
520
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
521
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
|
|
522
|
+
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
|
|
523
|
+
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
|
|
524
|
+
}
|
|
525
|
+
time = time2;
|
|
526
|
+
color = newColor;
|
|
527
|
+
color2 = newColor2;
|
|
528
|
+
keyMap = nextMap;
|
|
529
|
+
}
|
|
530
|
+
timelines.push(timeline);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
// Bone timelines.
|
|
536
|
+
if (map.bones) {
|
|
537
|
+
for (let boneName in map.bones) {
|
|
538
|
+
let boneMap = map.bones[boneName];
|
|
539
|
+
let boneIndex = skeletonData.findBone(boneName).index;
|
|
540
|
+
for (let timelineName in boneMap) {
|
|
541
|
+
let timelineMap = boneMap[timelineName];
|
|
542
|
+
let frames = timelineMap.length;
|
|
543
|
+
if (frames == 0)
|
|
544
|
+
continue;
|
|
545
|
+
if (timelineName === "rotate") {
|
|
546
|
+
timelines.push(readTimeline1(timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1));
|
|
547
|
+
}
|
|
548
|
+
else if (timelineName === "translate") {
|
|
549
|
+
let timeline = new TranslateTimeline(frames, frames << 1, boneIndex);
|
|
550
|
+
timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, scale));
|
|
551
|
+
}
|
|
552
|
+
else if (timelineName === "translatex") {
|
|
553
|
+
let timeline = new TranslateXTimeline(frames, frames, boneIndex);
|
|
554
|
+
timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
|
|
555
|
+
}
|
|
556
|
+
else if (timelineName === "translatey") {
|
|
557
|
+
let timeline = new TranslateYTimeline(frames, frames, boneIndex);
|
|
558
|
+
timelines.push(readTimeline1(timelineMap, timeline, 0, scale));
|
|
559
|
+
}
|
|
560
|
+
else if (timelineName === "scale") {
|
|
561
|
+
let timeline = new ScaleTimeline(frames, frames << 1, boneIndex);
|
|
562
|
+
timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 1, 1));
|
|
563
|
+
}
|
|
564
|
+
else if (timelineName === "scalex") {
|
|
565
|
+
let timeline = new ScaleXTimeline(frames, frames, boneIndex);
|
|
566
|
+
timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
|
|
567
|
+
}
|
|
568
|
+
else if (timelineName === "scaley") {
|
|
569
|
+
let timeline = new ScaleYTimeline(frames, frames, boneIndex);
|
|
570
|
+
timelines.push(readTimeline1(timelineMap, timeline, 1, 1));
|
|
571
|
+
}
|
|
572
|
+
else if (timelineName === "shear") {
|
|
573
|
+
let timeline = new ShearTimeline(frames, frames << 1, boneIndex);
|
|
574
|
+
timelines.push(readTimeline2(timelineMap, timeline, "x", "y", 0, 1));
|
|
575
|
+
}
|
|
576
|
+
else if (timelineName === "shearx") {
|
|
577
|
+
let timeline = new ShearXTimeline(frames, frames, boneIndex);
|
|
578
|
+
timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
|
|
579
|
+
}
|
|
580
|
+
else if (timelineName === "sheary") {
|
|
581
|
+
let timeline = new ShearYTimeline(frames, frames, boneIndex);
|
|
582
|
+
timelines.push(readTimeline1(timelineMap, timeline, 0, 1));
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
// IK constraint timelines.
|
|
588
|
+
if (map.ik) {
|
|
589
|
+
for (let constraintName in map.ik) {
|
|
590
|
+
let constraintMap = map.ik[constraintName];
|
|
591
|
+
let keyMap = constraintMap[0];
|
|
592
|
+
if (!keyMap)
|
|
593
|
+
continue;
|
|
594
|
+
let constraint = skeletonData.findIkConstraint(constraintName);
|
|
595
|
+
let constraintIndex = skeletonData.ikConstraints.indexOf(constraint);
|
|
596
|
+
let timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);
|
|
597
|
+
let time = getValue(keyMap, "time", 0);
|
|
598
|
+
let mix = getValue(keyMap, "mix", 1);
|
|
599
|
+
let softness = getValue(keyMap, "softness", 0) * scale;
|
|
600
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
601
|
+
timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false));
|
|
602
|
+
let nextMap = constraintMap[frame + 1];
|
|
603
|
+
if (!nextMap) {
|
|
604
|
+
timeline.shrink(bezier);
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
608
|
+
let mix2 = getValue(nextMap, "mix", 1);
|
|
609
|
+
let softness2 = getValue(nextMap, "softness", 0) * scale;
|
|
610
|
+
let curve = keyMap.curve;
|
|
611
|
+
if (curve) {
|
|
612
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
|
|
613
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
|
|
614
|
+
}
|
|
615
|
+
time = time2;
|
|
616
|
+
mix = mix2;
|
|
617
|
+
softness = softness2;
|
|
618
|
+
keyMap = nextMap;
|
|
619
|
+
}
|
|
620
|
+
timelines.push(timeline);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
// Transform constraint timelines.
|
|
624
|
+
if (map.transform) {
|
|
625
|
+
for (let constraintName in map.transform) {
|
|
626
|
+
let timelineMap = map.transform[constraintName];
|
|
627
|
+
let keyMap = timelineMap[0];
|
|
628
|
+
if (!keyMap)
|
|
629
|
+
continue;
|
|
630
|
+
let constraint = skeletonData.findTransformConstraint(constraintName);
|
|
631
|
+
let constraintIndex = skeletonData.transformConstraints.indexOf(constraint);
|
|
632
|
+
let timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, constraintIndex);
|
|
633
|
+
let time = getValue(keyMap, "time", 0);
|
|
634
|
+
let mixRotate = getValue(keyMap, "mixRotate", 1);
|
|
635
|
+
let mixX = getValue(keyMap, "mixX", 1);
|
|
636
|
+
let mixY = getValue(keyMap, "mixY", mixX);
|
|
637
|
+
let mixScaleX = getValue(keyMap, "mixScaleX", 1);
|
|
638
|
+
let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX);
|
|
639
|
+
let mixShearY = getValue(keyMap, "mixShearY", 1);
|
|
640
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
641
|
+
timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
|
|
642
|
+
let nextMap = timelineMap[frame + 1];
|
|
643
|
+
if (!nextMap) {
|
|
644
|
+
timeline.shrink(bezier);
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
648
|
+
let mixRotate2 = getValue(nextMap, "mixRotate", 1);
|
|
649
|
+
let mixX2 = getValue(nextMap, "mixX", 1);
|
|
650
|
+
let mixY2 = getValue(nextMap, "mixY", mixX2);
|
|
651
|
+
let mixScaleX2 = getValue(nextMap, "mixScaleX", 1);
|
|
652
|
+
let mixScaleY2 = getValue(nextMap, "mixScaleY", mixScaleX2);
|
|
653
|
+
let mixShearY2 = getValue(nextMap, "mixShearY", 1);
|
|
654
|
+
let curve = keyMap.curve;
|
|
655
|
+
if (curve) {
|
|
656
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
|
|
657
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
|
|
658
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
|
|
659
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, mixScaleX, mixScaleX2, 1);
|
|
660
|
+
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, mixScaleY, mixScaleY2, 1);
|
|
661
|
+
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, mixShearY, mixShearY2, 1);
|
|
662
|
+
}
|
|
663
|
+
time = time2;
|
|
664
|
+
mixRotate = mixRotate2;
|
|
665
|
+
mixX = mixX2;
|
|
666
|
+
mixY = mixY2;
|
|
667
|
+
mixScaleX = mixScaleX2;
|
|
668
|
+
mixScaleY = mixScaleY2;
|
|
669
|
+
mixScaleX = mixScaleX2;
|
|
670
|
+
keyMap = nextMap;
|
|
671
|
+
}
|
|
672
|
+
timelines.push(timeline);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
// Path constraint timelines.
|
|
676
|
+
if (map.path) {
|
|
677
|
+
for (let constraintName in map.path) {
|
|
678
|
+
let constraintMap = map.path[constraintName];
|
|
679
|
+
let constraint = skeletonData.findPathConstraint(constraintName);
|
|
680
|
+
let constraintIndex = skeletonData.pathConstraints.indexOf(constraint);
|
|
681
|
+
for (let timelineName in constraintMap) {
|
|
682
|
+
let timelineMap = constraintMap[timelineName];
|
|
683
|
+
let keyMap = timelineMap[0];
|
|
684
|
+
if (!keyMap)
|
|
685
|
+
continue;
|
|
686
|
+
let frames = timelineMap.length;
|
|
687
|
+
if (timelineName === "position") {
|
|
688
|
+
let timeline = new PathConstraintPositionTimeline(frames, frames, constraintIndex);
|
|
689
|
+
timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.positionMode == PositionMode.Fixed ? scale : 1));
|
|
690
|
+
}
|
|
691
|
+
else if (timelineName === "spacing") {
|
|
692
|
+
let timeline = new PathConstraintSpacingTimeline(frames, frames, constraintIndex);
|
|
693
|
+
timelines.push(readTimeline1(timelineMap, timeline, 0, constraint.spacingMode == SpacingMode.Length || constraint.spacingMode == SpacingMode.Fixed ? scale : 1));
|
|
694
|
+
}
|
|
695
|
+
else if (timelineName === "mix") {
|
|
696
|
+
let timeline = new PathConstraintMixTimeline(frames, frames * 3, constraintIndex);
|
|
697
|
+
let time = getValue(keyMap, "time", 0);
|
|
698
|
+
let mixRotate = getValue(keyMap, "mixRotate", 1);
|
|
699
|
+
let mixX = getValue(keyMap, "mixX", 1);
|
|
700
|
+
let mixY = getValue(keyMap, "mixY", mixX);
|
|
701
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
702
|
+
timeline.setFrame(frame, time, mixRotate, mixX, mixY);
|
|
703
|
+
let nextMap = timelineMap[frame + 1];
|
|
704
|
+
if (!nextMap) {
|
|
705
|
+
timeline.shrink(bezier);
|
|
706
|
+
break;
|
|
707
|
+
}
|
|
708
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
709
|
+
let mixRotate2 = getValue(nextMap, "mixRotate", 1);
|
|
710
|
+
let mixX2 = getValue(nextMap, "mixX", 1);
|
|
711
|
+
let mixY2 = getValue(nextMap, "mixY", mixX2);
|
|
712
|
+
let curve = keyMap.curve;
|
|
713
|
+
if (curve) {
|
|
714
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
|
|
715
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
|
|
716
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
|
|
717
|
+
}
|
|
718
|
+
time = time2;
|
|
719
|
+
mixRotate = mixRotate2;
|
|
720
|
+
mixX = mixX2;
|
|
721
|
+
mixY = mixY2;
|
|
722
|
+
keyMap = nextMap;
|
|
723
|
+
}
|
|
724
|
+
timelines.push(timeline);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
// Deform timelines.
|
|
730
|
+
if (map.deform) {
|
|
731
|
+
for (let deformName in map.deform) {
|
|
732
|
+
let deformMap = map.deform[deformName];
|
|
733
|
+
let skin = skeletonData.findSkin(deformName);
|
|
734
|
+
for (let slotName in deformMap) {
|
|
735
|
+
let slotMap = deformMap[slotName];
|
|
736
|
+
let slotIndex = skeletonData.findSlot(slotName).index;
|
|
737
|
+
for (let timelineName in slotMap) {
|
|
738
|
+
let timelineMap = slotMap[timelineName];
|
|
739
|
+
let keyMap = timelineMap[0];
|
|
740
|
+
if (!keyMap)
|
|
741
|
+
continue;
|
|
742
|
+
let attachment = skin.getAttachment(slotIndex, timelineName);
|
|
743
|
+
let weighted = attachment.bones;
|
|
744
|
+
let vertices = attachment.vertices;
|
|
745
|
+
let deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
|
|
746
|
+
let timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);
|
|
747
|
+
let time = getValue(keyMap, "time", 0);
|
|
748
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
749
|
+
let deform;
|
|
750
|
+
let verticesValue = getValue(keyMap, "vertices", null);
|
|
751
|
+
if (!verticesValue)
|
|
752
|
+
deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
|
|
753
|
+
else {
|
|
754
|
+
deform = Utils.newFloatArray(deformLength);
|
|
755
|
+
let start = getValue(keyMap, "offset", 0);
|
|
756
|
+
Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
|
|
757
|
+
if (scale != 1) {
|
|
758
|
+
for (let i = start, n = i + verticesValue.length; i < n; i++)
|
|
759
|
+
deform[i] *= scale;
|
|
760
|
+
}
|
|
761
|
+
if (!weighted) {
|
|
762
|
+
for (let i = 0; i < deformLength; i++)
|
|
763
|
+
deform[i] += vertices[i];
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
timeline.setFrame(frame, time, deform);
|
|
767
|
+
let nextMap = timelineMap[frame + 1];
|
|
768
|
+
if (!nextMap) {
|
|
769
|
+
timeline.shrink(bezier);
|
|
770
|
+
break;
|
|
771
|
+
}
|
|
772
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
773
|
+
let curve = keyMap.curve;
|
|
774
|
+
if (curve)
|
|
775
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
|
|
776
|
+
time = time2;
|
|
777
|
+
keyMap = nextMap;
|
|
778
|
+
}
|
|
779
|
+
timelines.push(timeline);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
// Draw order timelines.
|
|
785
|
+
if (map.drawOrder) {
|
|
786
|
+
let timeline = new DrawOrderTimeline(map.drawOrder.length);
|
|
787
|
+
let slotCount = skeletonData.slots.length;
|
|
788
|
+
let frame = 0;
|
|
789
|
+
for (let i = 0; i < map.drawOrder.length; i++, frame++) {
|
|
790
|
+
let drawOrderMap = map.drawOrder[i];
|
|
791
|
+
let drawOrder = null;
|
|
792
|
+
let offsets = getValue(drawOrderMap, "offsets", null);
|
|
793
|
+
if (offsets) {
|
|
794
|
+
drawOrder = Utils.newArray(slotCount, -1);
|
|
795
|
+
let unchanged = Utils.newArray(slotCount - offsets.length, 0);
|
|
796
|
+
let originalIndex = 0, unchangedIndex = 0;
|
|
797
|
+
for (let ii = 0; ii < offsets.length; ii++) {
|
|
798
|
+
let offsetMap = offsets[ii];
|
|
799
|
+
let slotIndex = skeletonData.findSlot(offsetMap.slot).index;
|
|
800
|
+
// Collect unchanged items.
|
|
801
|
+
while (originalIndex != slotIndex)
|
|
802
|
+
unchanged[unchangedIndex++] = originalIndex++;
|
|
803
|
+
// Set changed items.
|
|
804
|
+
drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
|
|
805
|
+
}
|
|
806
|
+
// Collect remaining unchanged items.
|
|
807
|
+
while (originalIndex < slotCount)
|
|
808
|
+
unchanged[unchangedIndex++] = originalIndex++;
|
|
809
|
+
// Fill in unchanged items.
|
|
810
|
+
for (let ii = slotCount - 1; ii >= 0; ii--)
|
|
811
|
+
if (drawOrder[ii] == -1)
|
|
812
|
+
drawOrder[ii] = unchanged[--unchangedIndex];
|
|
813
|
+
}
|
|
814
|
+
timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder);
|
|
815
|
+
}
|
|
816
|
+
timelines.push(timeline);
|
|
817
|
+
}
|
|
818
|
+
// Event timelines.
|
|
819
|
+
if (map.events) {
|
|
820
|
+
let timeline = new EventTimeline(map.events.length);
|
|
821
|
+
let frame = 0;
|
|
822
|
+
for (let i = 0; i < map.events.length; i++, frame++) {
|
|
823
|
+
let eventMap = map.events[i];
|
|
824
|
+
let eventData = skeletonData.findEvent(eventMap.name);
|
|
825
|
+
let event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), eventData);
|
|
826
|
+
event.intValue = getValue(eventMap, "int", eventData.intValue);
|
|
827
|
+
event.floatValue = getValue(eventMap, "float", eventData.floatValue);
|
|
828
|
+
event.stringValue = getValue(eventMap, "string", eventData.stringValue);
|
|
829
|
+
if (event.data.audioPath) {
|
|
830
|
+
event.volume = getValue(eventMap, "volume", 1);
|
|
831
|
+
event.balance = getValue(eventMap, "balance", 0);
|
|
832
|
+
}
|
|
833
|
+
timeline.setFrame(frame, event);
|
|
834
|
+
}
|
|
835
|
+
timelines.push(timeline);
|
|
836
|
+
}
|
|
837
|
+
let duration = 0;
|
|
838
|
+
for (let i = 0, n = timelines.length; i < n; i++)
|
|
839
|
+
duration = Math.max(duration, timelines[i].getDuration());
|
|
840
|
+
skeletonData.animations.push(new Animation(name, timelines, duration));
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
class LinkedMesh {
|
|
844
|
+
constructor(mesh, skin, slotIndex, parent, inheritDeform) {
|
|
845
|
+
this.mesh = mesh;
|
|
846
|
+
this.skin = skin;
|
|
847
|
+
this.slotIndex = slotIndex;
|
|
848
|
+
this.parent = parent;
|
|
849
|
+
this.inheritDeform = inheritDeform;
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
function readTimeline1(keys, timeline, defaultValue, scale) {
|
|
853
|
+
let keyMap = keys[0];
|
|
854
|
+
let time = getValue(keyMap, "time", 0);
|
|
855
|
+
let value = getValue(keyMap, "value", defaultValue) * scale;
|
|
856
|
+
let bezier = 0;
|
|
857
|
+
for (let frame = 0;; frame++) {
|
|
858
|
+
timeline.setFrame(frame, time, value);
|
|
859
|
+
let nextMap = keys[frame + 1];
|
|
860
|
+
if (!nextMap) {
|
|
861
|
+
timeline.shrink(bezier);
|
|
862
|
+
return timeline;
|
|
863
|
+
}
|
|
864
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
865
|
+
let value2 = getValue(nextMap, "value", defaultValue) * scale;
|
|
866
|
+
if (keyMap.curve)
|
|
867
|
+
bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
|
|
868
|
+
time = time2;
|
|
869
|
+
value = value2;
|
|
870
|
+
keyMap = nextMap;
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
function readTimeline2(keys, timeline, name1, name2, defaultValue, scale) {
|
|
874
|
+
let keyMap = keys[0];
|
|
875
|
+
let time = getValue(keyMap, "time", 0);
|
|
876
|
+
let value1 = getValue(keyMap, name1, defaultValue) * scale;
|
|
877
|
+
let value2 = getValue(keyMap, name2, defaultValue) * scale;
|
|
878
|
+
let bezier = 0;
|
|
879
|
+
for (let frame = 0;; frame++) {
|
|
880
|
+
timeline.setFrame(frame, time, value1, value2);
|
|
881
|
+
let nextMap = keys[frame + 1];
|
|
882
|
+
if (!nextMap) {
|
|
883
|
+
timeline.shrink(bezier);
|
|
884
|
+
return timeline;
|
|
885
|
+
}
|
|
886
|
+
let time2 = getValue(nextMap, "time", 0);
|
|
887
|
+
let nvalue1 = getValue(nextMap, name1, defaultValue) * scale;
|
|
888
|
+
let nvalue2 = getValue(nextMap, name2, defaultValue) * scale;
|
|
889
|
+
let curve = keyMap.curve;
|
|
890
|
+
if (curve) {
|
|
891
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
|
|
892
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
|
|
893
|
+
}
|
|
894
|
+
time = time2;
|
|
895
|
+
value1 = nvalue1;
|
|
896
|
+
value2 = nvalue2;
|
|
897
|
+
keyMap = nextMap;
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
|
|
901
|
+
if (curve == "stepped") {
|
|
902
|
+
timeline.setStepped(frame);
|
|
903
|
+
return bezier;
|
|
904
|
+
}
|
|
905
|
+
let i = value << 2;
|
|
906
|
+
let cx1 = curve[i];
|
|
907
|
+
let cy1 = curve[i + 1] * scale;
|
|
908
|
+
let cx2 = curve[i + 2];
|
|
909
|
+
let cy2 = curve[i + 3] * scale;
|
|
910
|
+
timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
|
|
911
|
+
return bezier + 1;
|
|
912
|
+
}
|
|
913
|
+
function getValue(map, property, defaultValue) {
|
|
914
|
+
return map[property] !== undefined ? map[property] : defaultValue;
|
|
915
|
+
}
|
|
916
916
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Kc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uSnNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBWSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSwyQkFBMkIsRUFBRSw4QkFBOEIsRUFBRSw2QkFBNkIsRUFBRSx5QkFBeUIsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFpRCxNQUFNLGFBQWEsQ0FBQztBQUlwaUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8s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QUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMzRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUM3RixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzdGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFF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
|